/ Hex Artifact Content
Login

Artifact 15eaf3d021eb723eda997fff735894c63d1709ee:


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 37  : pager.c,v 1.57
0350: 34 20 32 30 30 39 2f 30 33 2f 32 38 20 30 36 3a  4 2009/03/28 06:
0360: 35 39 3a 34 31 20 64 61 6e 69 65 6c 6b 31 39 37  59:41 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
1190: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
11a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
11b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
11c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
11e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
11f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
1200: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
1210: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
1220: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
1230: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
1240: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
1250: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1260: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
1270: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
1280: 20 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53   16MB. If the xS
1290: 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68  ectorsize() meth
12a0: 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  od .** returns a
12b0: 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68   value larger th
12c0: 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41  an this, then MA
12d0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73  X_SECTOR_SIZE is
12e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
12f0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e  * This could con
1300: 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63  ceivably cause c
1310: 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77  orruption follow
1320: 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ing a power fail
1330: 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61  ure on.** such a
1340: 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73   system. This is
1350: 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e   currently an un
1360: 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74  documented limit
1370: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1380: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30  _SECTOR_SIZE 0x0
1390: 31 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  100000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2f 0a 73 74 72 75  ournal"..*/.stru
27f0: 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c  ct Pager {.  sql
2800: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
2810: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66           /* OS f
2820: 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20  unctions to use 
2830: 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65  for IO */.  u8 e
2840: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
2850: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2860: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
2870: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
2880: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
2890: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
28a0: 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68       /* On of th
28b0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
28c0: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
28d0: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28f0: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2900: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2910: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2920: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2930: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2940: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2950: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
2960: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2980: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
2990: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
29a0: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
29d0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
29e0: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
29f0: 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61  */.  u8 sync_fla
2a00: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2a10: 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f   /* One of SYNC_
2a20: 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46  NORMAL or SYNC_F
2a30: 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ULL */.  u8 temp
2a40: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2a50: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2a60: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
2a70: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
2a80: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
2a90: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2aa0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2ab0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2ac0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ae0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2af0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f  file I/O */..  /
2b00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2b10: 62 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74  block contains t
2b20: 68 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65  hose class membe
2b30: 72 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61  rs that are dyna
2b40: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64  mically.  ** mod
2b50: 69 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72  ified during nor
2b60: 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20  mal operations. 
2b70: 54 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62  The other variab
2b80: 6c 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75  les in this stru
2b90: 63 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65  cture.  ** are e
2ba0: 69 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74  ither constant t
2bb0: 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69  hroughout the li
2bc0: 66 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61  fetime of the pa
2bd0: 67 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ger, or else.  *
2be0: 2a 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  * used to store 
2bf0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61  configuration pa
2c00: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66  rameters that af
2c10: 66 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65  fect the way the
2c20: 20 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65   pager .  ** ope
2c30: 72 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  rates..  **.  **
2c40: 20 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72   The 'state' var
2c50: 69 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62  iable is describ
2c60: 65 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69  ed in more detai
2c70: 6c 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  l along with the
2c80: 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f  .  ** descriptio
2c90: 6e 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73  ns of the values
2ca0: 20 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50   it may take - P
2cb0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e  AGER_UNLOCK etc.
2cc0: 20 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a   Many of the.  *
2cd0: 2a 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65  * other variable
2ce0: 73 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20  s in this block 
2cf0: 61 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e  are described in
2d00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72   the comment dir
2d10: 65 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76  ectly .  ** abov
2d20: 65 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66  e this class def
2d30: 69 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  inition..  */.  
2d40: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d60: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
2d70: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
2d80: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62   etc. */.  u8 db
2d90: 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20  Modified;       
2da0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2db0: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
2dc0: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44  changes to the D
2dd0: 62 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  b */.  u8 needSy
2de0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2df0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2e00: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2e10: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2e20: 6c 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  l */.  u8 journa
2e30: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
2e40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
2e50: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
2e60: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
2e70: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
2e80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
2e90: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
2ea0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
2eb0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2ec0: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ee0: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
2ef0: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
2f00: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20  to jrnl */.  u8 
2f10: 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20  doNotSync;      
2f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c           /* Bool
2f30: 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c  ean. While true,
2f40: 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68   do not spill th
2f50: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20  e cache */.  u8 
2f60: 64 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20  dbSizeValid;    
2f70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
2f80: 77 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63  when dbSize is c
2f90: 6f 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f  orrect */.  Pgno
2fa0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2fc0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2fd0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
2fe0: 50 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b  Pgno dbOrigSize;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
3000: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
3010: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
3020: 74 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  tion */.  Pgno d
3030: 62 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20  bFileSize;      
3040: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3050: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3060: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3070: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
30a0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
30b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20   */.  int nRec; 
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e    /* Pages journ
30e0: 61 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74  alled since last
30f0: 20 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65   j-header writte
3100: 6e 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  n */.  u32 cksum
3110: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
3120: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
3130: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
3140: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
3150: 20 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65   */.  u32 nSubRe
3160: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3170: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
3180: 65 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74  ecords written t
3190: 6f 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  o sub-journal */
31a0: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
31b0: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
31c0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
31d0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
31e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3200: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
3210: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3220: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f   for database */
3230: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3240: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *jfd;          /
3250: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
3260: 72 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e  r for main journ
3270: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
3280: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
3290: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
32a0: 72 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a  riptor for sub-j
32b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
32c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
32d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
32e0: 6e 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20  nt write offset 
32f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
3300: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
3310: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
3320: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
3330: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
3340: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
3350: 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69  /.  PagerSavepoi
3360: 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20  nt *aSavepoint; 
3370: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
3380: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  ve savepoints */
3390: 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  .  int nSavepoin
33a0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
33b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  * Number of elem
33c0: 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69  ents in aSavepoi
33d0: 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64  nt[] */.  char d
33e0: 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20  bFileVers[16];  
33f0: 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73        /* Changes
3400: 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61   whenever databa
3410: 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20  se file changes 
3420: 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53  */.  u32 sectorS
3430: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3440: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
3450: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
3460: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e  ollback */..  in
3470: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
3480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
3490: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
34a0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
34b0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32  ry page */.  u32
34c0: 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20   vfsFlags;      
34d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
34e0: 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66  s for sqlite3_vf
34f0: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  s.xOpen() */.  i
3500: 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20  nt pageSize;    
3510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3520: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
3530: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e   a page */.  Pgn
3540: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
3550: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
3560: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
3570: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3580: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
3590: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
35a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
35c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
35d0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
35e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
35f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
3600: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
3610: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
3620: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
3630: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
3640: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
3650: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
3660: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
3670: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
3680: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3690: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69  E_TEST.  int nHi
36a0: 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20  t, nMiss;       
36b0: 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69       /* Cache hi
36c0: 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a  ts and missing *
36d0: 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e  /.  int nRead, n
36e0: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
36f0: 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  /* Database page
3700: 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a  s read/written *
3710: 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  /.#endif.  void 
3720: 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50  (*xReiniter)(DbP
3730: 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  age*); /* Call t
3740: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3750: 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73   reloading pages
3760: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
3770: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f  E_HAS_CODEC.  vo
3780: 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
3790: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
37a0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
37b0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
37c0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
37d0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
37e0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
37f0: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
3800: 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  c() */.#endif.  
3810: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
3820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
3830: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
3840: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
3850: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36   tmp use */.  i6
3860: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
3870: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
3880: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
3890: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
38a0: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
38b0: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
38c0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
38d0: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
38e0: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
38f0: 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
3900: 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  up;    /* Pointe
3910: 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67  r to list of ong
3920: 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63  oing backup proc
3930: 65 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  esses */.};../*.
3940: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3950: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3960: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3970: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3980: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3990: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
39a0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
39b0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
39c0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
39d0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
39e0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
39f0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3a00: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
3a10: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
3a20: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3a30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3a40: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3a50: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a60: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3a70: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3a80: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3a90: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3aa0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3ab0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3ac0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3ad0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ae0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3af0: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
3b00: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
3b10: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
3b20: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
3b30: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
3b40: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3b50: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3b60: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3b70: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3b80: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3b90: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3ba0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3bb0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3bc0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3bd0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3be0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
3bf0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
3c00: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
3c10: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3c20: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
3c30: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
3c40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3c50: 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e  being.** written
3c60: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3c70: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3c80: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3c90: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3ca0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3cb0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3cc0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3cd0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3ce0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
3cf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
3d00: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
3d10: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
3d20: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
3d30: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
3d40: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3d50: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3d60: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3d70: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3d80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3d90: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3da0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3db0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3dc0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3dd0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3de0: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3df0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3e00: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3e10: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3e20: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3e30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3e40: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3e50: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3e60: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3e70: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3e80: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3e90: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3ea0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3eb0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3ec0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3ed0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3ee0: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3ef0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3f00: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3f10: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3f20: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3f30: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3f40: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3f50: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3f60: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3f70: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3f80: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3f90: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3fa0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3fb0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3fc0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3fd0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3fe0: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ff0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
4000: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
4010: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
4020: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
4030: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
4040: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
4050: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
4060: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
4070: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
4080: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
4090: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
40a0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
40b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
40c0: 7a 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63  ze of the of eac
40d0: 68 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e  h page record in
40e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
40f0: 67 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20  given by.** the 
4100: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e  following macro.
4110: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
4120: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4130: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
4140: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
4150: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
4160: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
4170: 68 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20  his pager. This 
4180: 69 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73  is usually the s
4190: 61 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20  ame .** size as 
41a0: 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
41b0: 63 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73  ctor. See also s
41c0: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a  etSectorSize()..
41d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
41e0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
41f0: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
4200: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
4210: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
4220: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
4230: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
4240: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
4250: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
4260: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
4270: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
4280: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
4290: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
42a0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
42b0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
42c0: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
42d0: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
42e0: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
42f0: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
4300: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
4310: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
4320: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
4330: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
4340: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
4350: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
4360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
4370: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4380: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4390: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
43a0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
43b0: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
43c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
43d0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a  ./*.** Usage:.**
43e0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73  .**   assert( as
43f0: 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
4400: 28 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73  (pPager) );.*/.s
4410: 74 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74  tatic int assert
4420: 5f 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67  _pager_state(Pag
4430: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20  er *pPager){..  
4440: 2f 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69  /* A temp-file i
4450: 73 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45  s always in PAGE
4460: 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50  R_EXCLUSIVE or P
4470: 41 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74  AGER_SYNCED stat
4480: 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  e. */.  assert( 
4490: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
44a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ==0 || pPager->s
44b0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
44c0: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54  USIVE );..  /* T
44d0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
44e0: 6e 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79  ne flag is alway
44f0: 73 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66  s set for temp-f
4500: 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  iles */.  assert
4510: 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
4520: 6c 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  le==0 || pPager-
4530: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
4540: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b   );..  return 1;
4550: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4560: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4570: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
4580: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
4590: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
45a0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
45b0: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
45c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
45d0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
45e0: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
45f0: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
4600: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
4610: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
4620: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
4630: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4640: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
4650: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
4660: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
4670: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
4680: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
4690: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
46a0: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
46b0: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
46c0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
46d0: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
46e0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
46f0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
4700: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
4710: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
4720: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
4730: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4740: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
4750: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
4760: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
4770: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
4780: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
4790: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
47a0: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
47b0: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
47c0: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
47d0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
47e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
47f0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4800: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
4810: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
4820: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
4830: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
4840: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
4850: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
4860: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
4870: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
4880: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
4890: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
48a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
48b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
48c0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
48d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
48e0: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
48f0: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4900: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4920: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4930: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4940: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4950: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4960: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4970: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4980: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4990: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
49a0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
49b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
49c0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
49d0: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
49e0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
49f0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
4a00: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
4a10: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
4a20: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
4a30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4a40: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
4a50: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
4a60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a70: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4a80: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4a90: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4aa0: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
4ab0: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
4ac0: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
4ad0: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
4ae0: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
4af0: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
4b00: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4b10: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
4b20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4b30: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4b40: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4b50: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4b60: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4b70: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4b80: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4b90: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4ba0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4bb0: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4bc0: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4bd0: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4be0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4bf0: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4c00: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
4c10: 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  /*.** The argume
4c20: 6e 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f  nt to this macro
4c30: 20 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72   is a file descr
4c40: 69 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69  iptor (type sqli
4c50: 74 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52  te3_file*)..** R
4c60: 65 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73  eturn 0 if it is
4c70: 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f   not open, or no
4c80: 6e 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20  n-zero (but not 
4c90: 31 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  1) if it is..**.
4ca0: 2a 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  ** This is so th
4cb0: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63  at expressions c
4cc0: 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73  an be written as
4cd0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73  :.**.**   if( is
4ce0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
4cf0: 29 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69  ) ){ ....**.** i
4d00: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20  nstead of.**.** 
4d10: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66    if( pPager->jf
4d20: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e  d->pMethods ){ .
4d30: 2e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  ...*/.#define is
4d40: 4f 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29  Open(pFd) ((pFd)
4d50: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a  ->pMethods)../*.
4d60: 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69  ** If file pFd i
4d70: 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c  s open, call sql
4d80: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f  ite3OsUnlock() o
4d90: 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n it..*/.static 
4da0: 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c  int osUnlock(sql
4db0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20  ite3_file *pFd, 
4dc0: 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66  int eLock){.  if
4dd0: 28 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29  ( !isOpen(pFd) )
4de0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4df0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
4e00: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e  turn sqlite3OsUn
4e10: 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29  lock(pFd, eLock)
4e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
4e30: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
4e40: 6e 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e  nes whether or n
4e50: 6f 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ot the atomic-wr
4e60: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
4e70: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
4e80: 77 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e  with this pager.
4e90: 20 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   The optimizatio
4ea0: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
4eb0: 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65  :.**.**  (a) the
4ec0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
4ed0: 62 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61  by OsDeviceChara
4ee0: 63 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64  cteristics() ind
4ef0: 69 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20  icates that.**  
4f00: 20 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70      a database p
4f10: 61 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74  age may be writt
4f20: 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61  en atomically, a
4f30: 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76  nd.**  (b) the v
4f40: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
4f50: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20   OsSectorSize() 
4f60: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
4f70: 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f  equal.**      to
4f80: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a   the page size..
4f90: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69  **.** The optimi
4fa0: 7a 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61  zation is also a
4fb0: 6c 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f  lways enabled fo
4fc0: 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
4fd0: 73 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65  s. It is.** an e
4fe0: 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69  rror to call thi
4ff0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50  s function if pP
5000: 61 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f  ager is opened o
5010: 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  n an in-memory.*
5020: 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  * database..**.*
5030: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
5040: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
5050: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
5060: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
5070: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
5080: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
5090: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
50a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
50b0: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
50c0: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
50d0: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
50e0: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
50f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5100: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
5110: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
5120: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
5130: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
5140: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
5150: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
5160: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  pFile ){.    int
5170: 20 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   dc;            
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5190: 2a 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74  * Device charact
51a0: 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20  eristics */.    
51b0: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
51e0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61   */.    int szPa
51f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
5200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
5210: 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61  e size */..    a
5220: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
5230: 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20  ager->fd) );.   
5240: 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   dc = sqlite3OsD
5250: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
5260: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
5270: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
5280: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
5290: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
52a0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
52b0: 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53  e;..    assert(S
52c0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
52d0: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
52e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c  ;.    assert(SQL
52f0: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
5300: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
5310: 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63  ;.    if( 0==(dc
5320: 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
5330: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
5340: 29 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a  )) || nSector>sz
5350: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72  Page) ){.      r
5360: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
5370: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55   }..  return JOU
5380: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5390: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
53a0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23  _SZ(pPager);.}.#
53b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
53c0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
53d0: 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  ES is defined th
53e0: 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61  en we do some sa
53f0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  nity checking.**
5400: 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73   on the cache us
5410: 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74  ing a hash funct
5420: 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ion.  This is us
5430: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ed for testing.*
5440: 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  * and debugging 
5450: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  only..*/.#ifdef 
5460: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
5470: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
5480: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
5490: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
54a0: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
54b0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61  tic u32 pager_da
54c0: 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65  tahash(int nByte
54d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
54e0: 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68  *pData){.  u32 h
54f0: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
5500: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5510: 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Byte; i++){.    
5520: 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33  hash = (hash*103
5530: 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20  9) + pData[i];. 
5540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
5550: 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70  ;.}.static u32 p
5560: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67  ager_pagehash(Pg
5570: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72  Hdr *pPage){.  r
5580: 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61  eturn pager_data
5590: 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67  hash(pPage->pPag
55a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
55b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
55c0: 50 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a  Page->pData);.}.
55d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
55e0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50  r_set_pagehash(P
55f0: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5600: 70 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20  pPage->pageHash 
5610: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
5620: 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
5630: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
5640: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
5650: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
5660: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
5670: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
5680: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
5690: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
56a0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
56b0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
56c0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
56d0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
56e0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
56f0: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
5700: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
5710: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
5720: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
5730: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
5740: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
5750: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
5760: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
5770: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
5780: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
5790: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
57a0: 64 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67  de.      || (pPg
57b0: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
57c0: 52 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67  RTY) || pPg->pag
57d0: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
57e0: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
57f0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
5800: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
5810: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
5820: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
5830: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
5840: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20  _PAGE(x).#endif 
5850: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   /* SQLITE_CHECK
5860: 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _PAGES */../*.**
5870: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
5880: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
5890: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
58a0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
58b0: 70 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  pen..** This fun
58c0: 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
58d0: 6f 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20  o read a master 
58e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
58f0: 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65  e from the .** e
5900: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
5910: 6e 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75  nd, if successfu
5920: 6c 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74  l, copies it int
5930: 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65  o memory supplie
5940: 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c  d .** by the cal
5950: 6c 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ler. See comment
5960: 73 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73  s above writeMas
5970: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
5980: 20 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75   the format.** u
5990: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d  sed to store a m
59a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
59b0: 6c 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65  le name at the e
59c0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
59d0: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73  file..**.** zMas
59e0: 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ter must point t
59f0: 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74  o a buffer of at
5a00: 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62   least nMaster b
5a10: 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ytes allocated b
5a20: 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e  y.** the caller.
5a30: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
5a40: 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
5a50: 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73  thname+1 (to ens
5a60: 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  ure there is.** 
5a70: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
5a80: 77 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  write the master
5a90: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20   journal name). 
5aa0: 49 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  If the master jo
5ab0: 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e  urnal.** name in
5ac0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
5ad0: 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73  longer than nMas
5ae0: 74 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75  ter bytes (inclu
5af0: 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65  ding a.** nul-te
5b00: 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20  rminator), then 
5b10: 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20  this is handled 
5b20: 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20  as if no master 
5b30: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20  journal name.** 
5b40: 77 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20  were present in 
5b50: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
5b60: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
5b70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5b80: 20 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74   is present at t
5b90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5ba0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74  urnal.** file, t
5bb0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64  hen it is copied
5bc0: 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
5bd0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
5be0: 4d 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c  Master. A.** nul
5bf0: 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65  -terminator byte
5c00: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
5c10: 74 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f  the buffer follo
5c20: 77 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a  wing the master.
5c30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
5c40: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  name..**.** If i
5c50: 74 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  t is determined 
5c60: 74 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a  that no master j
5c70: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5c80: 20 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20   is present .** 
5c90: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
5ca0: 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54  t to 0 and SQLIT
5cb0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
5cc0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5cd0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65   occurs while re
5ce0: 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a  ading from the j
5cf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20  ournal file, an 
5d00: 53 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20  SQLite.** error 
5d10: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
5d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5d30: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5d40: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5d50: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5d60: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5d70: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  r){.  int rc;   
5d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d90: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
5da0: 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20  */.  u32 len;   
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 2f 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74  /* Length in byt
5dd0: 65 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  es of master jou
5de0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  rnal name */.  i
5df0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
5e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
5e10: 61 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  al size in bytes
5e20: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   of journal file
5e30: 20 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20   pJrnl */.  u32 
5e40: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
5e50: 20 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65         /* MJ che
5e60: 63 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64  cksum value read
5e70: 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f   from journal */
5e80: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5ea0: 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
5eb0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69  ounter */.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5ed0: 5b 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66  [8];   /* A buff
5ee0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5ef0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
5f00: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5f10: 30 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  0';..  if( SQLIT
5f20: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
5f30: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
5f40: 72 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c  rnl, &szJ)).   |
5f50: 7c 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53  | szJ<16.   || S
5f60: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
5f70: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
5f80: 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29  , szJ-16, &len))
5f90: 0a 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73  .   || len>=nMas
5fa0: 74 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ter .   || SQLIT
5fb0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
5fc0: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
5fd0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20  J-12, &cksum)). 
5fe0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
5ff0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52  (rc = sqlite3OsR
6000: 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69  ead(pJrnl, aMagi
6010: 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20  c, 8, szJ-8)).  
6020: 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69   || memcmp(aMagi
6030: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6040: 2c 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  , 8).   || SQLIT
6050: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6060: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
6070: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73   zMaster, len, s
6080: 7a 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b  zJ-16-len)).  ){
6090: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
60a0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
60b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
60c0: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
60d0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
60e0: 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65  .  for(u=0; u<le
60f0: 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; u++){.    cks
6100: 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d  um -= zMaster[u]
6110: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6120: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6130: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6140: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
6150: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6160: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
6170: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
6180: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
6190: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
61a0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
61b0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
61c0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
61d0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
61e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
61f0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6200: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6210: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  .    */.    len 
6230: 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  = 0;.  }.  zMast
6240: 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  er[len] = '\0';.
6250: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
6260: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6270: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
6280: 65 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  et of the sector
6290: 20 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20   boundary at or 
62a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20  immediately .** 
62b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61  following the va
62c0: 6c 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a  lue in pPager->j
62d0: 6f 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d  ournalOff, assum
62e0: 69 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a  ing a sector .**
62f0: 20 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d   size of pPager-
6300: 3e 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65  >sectorSize byte
6310: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  s..**.** i.e for
6320: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6330: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50  f 512:.**.**   P
6340: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
6350: 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20           Return 
6360: 76 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  value.**   -----
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63b0: 20 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20    0.**   512    
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20     512.**   100 
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32        512.**   2
6400: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
6410: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
6420: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20   .*/.static i64 
6430: 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74  journalHdrOffset
6440: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6450: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20  .  i64 offset = 
6460: 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61  0;.  i64 c = pPa
6470: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6480: 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20  .  if( c ){.    
6490: 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f  offset = ((c-1)/
64a0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
64b0: 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f  Pager) + 1) * JO
64c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
64d0: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ger);.  }.  asse
64e0: 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e  rt( offset%JOURN
64f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6500: 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
6510: 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20  ( offset>=c );. 
6520: 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74   assert( (offset
6530: 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -c)<JOURNAL_HDR_
6540: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
6550: 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d  return offset;.}
6560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6570: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6580: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6590: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
65a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
65b0: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
65c0: 6f 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  op if the journa
65d0: 6c 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  l file has not b
65e0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a  een written to.*
65f0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  * within the cur
6600: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
6610: 20 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e   (i.e. if Pager.
6620: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a  journalOff==0)..
6630: 2a 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63  **.** If doTrunc
6640: 61 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ate is non-zero 
6650: 6f 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75  or the Pager.jou
6660: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61  rnalSizeLimit va
6670: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74  riable is.** set
6680: 20 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e   to 0, then trun
6690: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
66a0: 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79   file to zero by
66b0: 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68  tes in size. Oth
66c0: 65 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20  erwise,.** zero 
66d0: 74 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64  the 28-byte head
66e0: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
66f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
6700: 69 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63  ile. In either c
6710: 61 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20  ase, .** if the 
6720: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
6730: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79  no-sync mode, sy
6740: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
6750: 69 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ile immediately 
6760: 0a 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e  .** after writin
6770: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
6780: 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67  it..**.** If Pag
6790: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
67a0: 6d 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20  mit is set to a 
67b0: 70 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65  positive, non-ze
67c0: 72 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a  ro value, and.**
67d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74   following the t
67e0: 72 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72  runcation or zer
67f0: 6f 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61  oing described a
6800: 62 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66  bove the size of
6810: 20 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   the .** journal
6820: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69   file in bytes i
6830: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
6840: 69 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  is value, then t
6850: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a  runcate the.** j
6860: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50  ournal file to P
6870: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
6880: 4c 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65  Limit bytes. The
6890: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
68a0: 65 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74  es.** not need t
68b0: 6f 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c  o be synced foll
68c0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
68d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
68e0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
68f0: 73 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  s, abandon proce
6900: 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
6910: 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
6920: 64 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  de..** Otherwise
6930: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
6940: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
6950: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
6960: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6970: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
6980: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6990: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
69c0: 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ode */.  assert(
69d0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
69e0: 6a 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50  jfd) );.  if( pP
69f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a00: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36   ){.    const i6
6a10: 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65  4 iLimit = pPage
6a20: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
6a30: 6d 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  mit;    /* Local
6a40: 20 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f   cache of jsl */
6a50: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
6a60: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
6a70: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
6a80: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
6a90: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
6aa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6ab0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
6ac0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
6ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69  lse{.      stati
6ae0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
6af0: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
6b00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6b10: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6b20: 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20  ->jfd, zeroHdr, 
6b30: 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c  sizeof(zeroHdr),
6b40: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
6b50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b60: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
6b70: 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
6b80: 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
6b90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c  pPager->jfd, SQL
6ba0: 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
6bb0: 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  Y|pPager->sync_f
6bc0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  lags);.    }..  
6bd0: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
6be0: 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nt the transacti
6bf0: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  on is committed 
6c00: 62 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f  but the write lo
6c10: 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  ck .    ** is st
6c20: 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ill held on the 
6c30: 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
6c40: 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63  s a size limit c
6c50: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20  onfigured for . 
6c60: 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73     ** the persis
6c70: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  tent journal and
6c80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6c90: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73  e currently cons
6ca0: 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a  umes more.    **
6cb0: 20 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74   space than that
6cc0: 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f   limit allows fo
6cd0: 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e  r, truncate it n
6ce0: 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20  ow. There is no 
6cf0: 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73  need.    ** to s
6d00: 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c  ync the file fol
6d10: 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72  lowing this oper
6d20: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
6d30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6d40: 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20  _OK && iLimit>0 
6d50: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b  ){.      i64 sz;
6d60: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6d70: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
6d80: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b  ager->jfd, &sz);
6d90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6da0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69  QLITE_OK && sz>i
6db0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
6dc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6dd0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6de0: 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  jfd, iLimit);.  
6df0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6e00: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6e10: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6e20: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
6e30: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
6e40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
6e50: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
6e60: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
6e70: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
6e80: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
6e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
6ea0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
6eb0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
6ec0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
6ed0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6ee0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
6ef0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
6f00: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
6f10: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
6f20: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
6f30: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
6f40: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
6f50: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
6f60: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
6f70: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
6f80: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
6f90: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
6fa0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
6fb0: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
6fc0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
6fd0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
6fe0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
6ff0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7000: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
7010: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
7020: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
7030: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7040: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
7050: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
7060: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
7070: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
7080: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
7090: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
70a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
70b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
70c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
70d0: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
70e0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
70f0: 61 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61  ace;  /* Tempora
7100: 72 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f  ry space used to
7110: 20 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f   build header */
7120: 0a 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d  .  u32 nHeader =
7130: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7140: 65 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  e;     /* Size o
7150: 66 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  f buffer pointed
7160: 20 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a   to by zHeader *
7170: 2f 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20  /.  u32 nWrite; 
7180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7190: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
71a0: 20 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f   of header secto
71b0: 72 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  r written */.  i
71c0: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
71f0: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
7200: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
7210: 6a 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20  jfd) );      /* 
7220: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  Journal file mus
7230: 74 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20  t be open. */.. 
7240: 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55   if( nHeader>JOU
7250: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7260: 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  er) ){.    nHead
7270: 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  er = JOURNAL_HDR
7280: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7290: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
72a0: 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70  are active savep
72b0: 6f 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66  oints and any of
72c0: 20 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74   them were creat
72d0: 65 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74  ed .  ** since t
72e0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a  he most recent j
72f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61  ournal header wa
7300: 73 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  s written, updat
7310: 65 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65  e the .  ** Page
7320: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
7330: 66 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77  ffset fields now
7340: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
7350: 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  0; ii<pPager->nS
7360: 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
7370: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7380: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
7390: 69 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b  iHdrOffset==0 ){
73a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
73b0: 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48  Savepoint[ii].iH
73c0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
73d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
73e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
73f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
7400: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7410: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
7420: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
7430: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
7440: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7450: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7460: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
7470: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
7480: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
7490: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
74a0: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
74b0: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
74c0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
74d0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
74e0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
74f0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
7500: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
7510: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
7520: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
7530: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
7540: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
7550: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
7560: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
7570: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
7580: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
7590: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
75a0: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
75b0: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
75c0: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
75d0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
75e0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
75f0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
7600: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
7610: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7620: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
7630: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
7640: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
7650: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
7660: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
7670: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
7680: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
7690: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
76a0: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
76b0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
76c0: 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69  red whilst writi
76d0: 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
76e0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d  l.  ** file it m
76f0: 61 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20  ay contain some 
7700: 67 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68  garbage data. Th
7710: 65 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e  ere are two scen
7720: 61 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65  arios.  ** where
7730: 20 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62   this risk can b
7740: 65 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a  e ignored:.  **.
7750: 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68    **   * When th
7760: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f  e pager is in no
7770: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72  -sync mode. Corr
7780: 75 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f  uption can follo
7790: 77 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77  w a.  **     pow
77a0: 65 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68  er failure in th
77b0: 69 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a  is case anyway..
77c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
77d0: 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f  en the SQLITE_IO
77e0: 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
77f0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
7800: 73 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a  s guarantees.  *
7810: 2a 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61  *     that garba
7820: 67 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72  ge data is never
7830: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7840: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
7850: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73   */.  assert( is
7860: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
7870: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   || pPager->noSy
7880: 6e 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61  nc );.  if( (pPa
7890: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20  ger->noSync) || 
78a0: 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
78b0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
78c0: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a  NALMODE_MEMORY).
78d0: 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73     || (sqlite3Os
78e0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
78f0: 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
7900: 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  )&SQLITE_IOCAP_S
7910: 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29  AFE_APPEND) .  )
7920: 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  {.    put32bits(
7930: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7940: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c  aJournalMagic)],
7950: 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
7960: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32  }else{.    put32
7970: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7980: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7990: 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  ic)], 0);.  }.. 
79a0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
79b0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
79c0: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
79d0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
79e0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
79f0: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
7a00: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7a10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7a20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7a30: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
7a40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7a50: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
7a60: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
7a70: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
7a80: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
7a90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
7aa0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  ], pPager->dbOri
7ab0: 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  gSize);.  /* The
7ac0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
7ad0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
7ae0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
7af0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7b00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7b10: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
7b20: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
7b30: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a   /* The page siz
7b40: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7b50: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7b60: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7b70: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
7b80: 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e  eSize);..  /* In
7b90: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74  itializing the t
7ba0: 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65  ail of the buffe
7bb0: 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  r is not necessa
7bc0: 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a  ry.  Everything.
7bd0: 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20    ** works find 
7be0: 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
7bf0: 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69   memset() is omi
7c00: 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69  tted.  But initi
7c10: 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65  alizing.  ** the
7c20: 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73   memory prevents
7c30: 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63   valgrind from c
7c40: 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77  omplaining, so w
7c50: 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f  e are willing to
7c60: 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70  .  ** take the p
7c70: 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a  erformance hit..
7c80: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a    */.  memset(&z
7c90: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7ca0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d  ournalMagic)+20]
7cb0: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48  , 0,.         nH
7cc0: 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a  eader-(sizeof(aJ
7cd0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29  ournalMagic)+20)
7ce0: 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f  );..  /* In theo
7cf0: 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e  ry, it is only n
7d00: 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74  ecessary to writ
7d10: 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74  e the 28 bytes t
7d20: 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f  hat the .  ** jo
7d30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e  urnal header con
7d40: 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  sumes to the jou
7d50: 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20  rnal file here. 
7d60: 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  Then increment t
7d70: 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a  he .  ** Pager.j
7d80: 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62  ournalOff variab
7d90: 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44  le by JOURNAL_HD
7da0: 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65  R_SZ so that the
7db0: 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f   next .  ** reco
7dc0: 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  rd is written to
7dd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
7de0: 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61  ector (leaving a
7df0: 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65   gap in the file
7e00: 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20  .  ** that will 
7e10: 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69  be implicitly fi
7e20: 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f  lled in by the O
7e30: 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f  S)..  **.  ** Ho
7e40: 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65  wever it has bee
7e50: 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  n discovered tha
7e60: 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d  t on some system
7e70: 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63  s this pattern c
7e80: 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e  an .  ** be sign
7e90: 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72  ificantly slower
7ea0: 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73   than contiguous
7eb0: 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20  ly writing data 
7ec0: 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a  to the file,.  *
7ed0: 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  * even if that m
7ee0: 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20  eans explicitly 
7ef0: 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20  writing data to 
7f00: 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20  the block of .  
7f10: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
7f20: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74  SZ - 28) bytes t
7f30: 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  hat will not be 
7f40: 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73  used. So that is
7f50: 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f   what.  ** is do
7f60: 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ne. .  **.  ** T
7f70: 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69  he loop is requi
7f80: 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65  red here in case
7f90: 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65   the sector-size
7fa0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
7fb0: 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61  the .  ** databa
7fc0: 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69  se page size. Si
7fd0: 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20  nce the zHeader 
7fe0: 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50  buffer is only P
7ff0: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20  ager.pageSize.  
8000: 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
8010: 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  , more than one 
8020: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f  call to sqlite3O
8030: 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20  sWrite() may be 
8040: 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f  required.  ** to
8050: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e   populate the en
8060: 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tire journal hea
8070: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
8080: 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30   .  for(nWrite=0
8090: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
80a0: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
80b0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
80c0: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
80d0: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
80e0: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
80f0: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
8100: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
8110: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
8120: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
8130: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
8140: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
8150: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8160: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
8170: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8180: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
8190: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
81a0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
81b0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
81c0: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
81d0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
81e0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
81f0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
8200: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
8210: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
8220: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
8230: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
8240: 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   The current loc
8250: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
8260: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76  rnal file is giv
8270: 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d  en by.** pPager-
8280: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65  >journalOff. See
8290: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
82a0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
82b0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a  urnalHdr() for.*
82c0: 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  * a description 
82d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
82e0: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
82f0: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
8300: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
8310: 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69  sfully, *pNRec i
8320: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
8330: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
8340: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
8350: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
8360: 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65 74   *pDbSize is set
8370: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
8380: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
8390: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
83a0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
83b0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
83c0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
83d0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
83e0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
83f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8400: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
8410: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
8420: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
8430: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
8440: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
8450: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
8460: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
8470: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
8480: 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20   and *pNRec and 
8490: 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64  *PDbSize are und
84a0: 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52  efined.  If JOUR
84b0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
84c0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
84d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
84e0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
84f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
8500: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8510: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
8520: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
8530: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
8540: 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
8550: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
8560: 6c 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  lSize,          
8570: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
8580: 65 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  e open journal f
8590: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
85a0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20    u32 *pNRec,   
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
85c0: 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61  * OUT: Value rea
85d0: 64 20 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20  d from the nRec 
85e0: 66 69 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a  field */.  u32 *
85f0: 70 44 62 53 69 7a 65 20 20 20 20 20 20 20 20 20  pDbSize         
8600: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8610: 56 61 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61  Value of origina
8620: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8630: 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  field */.){.  in
8640: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
8650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
8660: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
8670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8680: 67 69 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41  gic[8];     /* A
8690: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
86a0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
86b0: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
86c0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
86d0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
86e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62  journal header b
86f0: 65 69 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20  eing read */..  
8700: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
8710: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20  Pager->jfd) );  
8720: 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66      /* Journal f
8730: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
8740: 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  . */..  /* Advan
8750: 63 65 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  ce Pager.journal
8760: 4f 66 66 20 74 6f 20 74 68 65 20 73 74 61 72 74  Off to the start
8770: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 73 65 63   of the next sec
8780: 74 6f 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a  tor. If the.  **
8790: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
87a0: 20 74 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74   too small for t
87b0: 68 65 72 65 20 74 6f 20 62 65 20 61 20 68 65 61  here to be a hea
87c0: 64 65 72 20 73 74 6f 72 65 64 20 61 74 20 74 68  der stored at th
87d0: 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72  is.  ** point, r
87e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
87f0: 45 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  E..  */.  pPager
8800: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
8810: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
8820: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8830: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8840: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
8850: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
8860: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
8870: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8880: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
8890: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
88a0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  lOff;..  /* Read
88b0: 20 69 6e 20 74 68 65 20 66 69 72 73 74 20 38 20   in the first 8 
88c0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
88d0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20  rnal header. If 
88e0: 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
88f0: 68 0a 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69  h.  ** the  magi
8900: 63 20 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61  c string found a
8910: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
8920: 61 63 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ach journal head
8930: 65 72 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  er, return.  ** 
8940: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20  SQLITE_DONE. If 
8950: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
8960: 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  rs, return an er
8970: 72 6f 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77  ror code. Otherw
8980: 69 73 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65  ise,.  ** procee
8990: 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  d..  */.  rc = s
89a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
89b0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
89c0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
89d0: 2c 20 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66  , iHdrOff);.  if
89e0: 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
89f0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
8a00: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
8a10: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
8a20: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
8a30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8a40: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
8a50: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
8a60: 66 69 72 73 74 20 74 68 72 65 65 20 33 32 2d 62  first three 32-b
8a70: 69 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  it fields of the
8a80: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a   journal header:
8a90: 20 54 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66   The nRec.  ** f
8aa0: 69 65 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73  ield, the checks
8ab0: 75 6d 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61  um-initializer a
8ac0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
8ad0: 73 69 7a 65 20 61 74 20 74 68 65 20 73 74 61 72  size at the star
8ae0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72  t.  ** of the tr
8af0: 61 6e 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72  ansaction. Retur
8b00: 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
8b10: 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
8b20: 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69   wrong..  */.  i
8b30: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
8b40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8b50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8b60: 4f 66 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20  Off+8, pNRec)). 
8b70: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8b80: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8b90: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8ba0: 64 72 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65  drOff+12, &pPage
8bb0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20  r->cksumInit)). 
8bc0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8bd0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8be0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8bf0: 64 72 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a  drOff+16, pDbSiz
8c00: 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  e)).  ){.    ret
8c10: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
8c20: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8c30: 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
8c40: 75 33 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20  u32 iPageSize;  
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c60: 50 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  Page-size field 
8c70: 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  of journal heade
8c80: 72 20 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65  r */.    u32 iSe
8c90: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
8ca0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d        /* Sector-
8cb0: 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f  size field of jo
8cc0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
8cd0: 20 20 20 20 75 31 36 20 69 50 61 67 65 53 69 7a      u16 iPageSiz
8ce0: 65 31 36 3b 20 20 20 20 20 20 20 20 20 20 20 20  e16;            
8cf0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67   /* Copy of iPag
8d00: 65 53 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20  eSize in 16-bit 
8d10: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20  variable */..   
8d20: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
8d30: 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
8d40: 72 2d 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68  r-size journal h
8d50: 65 61 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f  eader fields. */
8d60: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
8d70: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8d80: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8d90: 2c 20 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69  , iHdrOff+20, &i
8da0: 53 65 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20  SectorSize)).   
8db0: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
8dc0: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
8dd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
8de0: 64 72 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65  drOff+24, &iPage
8df0: 53 69 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20  Size)).    ){.  
8e00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8e10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
8e20: 63 6b 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ck that the valu
8e30: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
8e40: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
8e50: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8e60: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74  s.    ** are wit
8e70: 68 69 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65  hin range. To be
8e80: 20 27 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74   'in range', bot
8e90: 68 20 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f  h values need to
8ea0: 20 62 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20   be a power.    
8eb0: 2a 2a 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  ** of two greate
8ec0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
8ed0: 74 6f 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20  to 512, and not 
8ee0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
8ef0: 69 72 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65  ir .    ** respe
8f00: 63 74 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69  ctive compile ti
8f10: 6d 65 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74  me maximum limit
8f20: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
8f30: 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20  ( iPageSize<512 
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f50: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c   || iSectorSize<
8f60: 35 31 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67  512.     || iPag
8f70: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
8f80: 5f 50 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53  _PAGE_SIZE || iS
8f90: 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
8fa0: 43 54 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c  CTOR_SIZE.     |
8fb0: 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29  | ((iPageSize-1)
8fc0: 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20  &iPageSize)!=0  
8fd0: 20 7c 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a   || ((iSectorSiz
8fe0: 65 2d 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65  e-1)&iSectorSize
8ff0: 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
9000: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74     /* If the eit
9010: 68 65 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a  her the page-siz
9020: 65 20 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65  e or sector-size
9030: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   in the journal-
9040: 68 65 61 64 65 72 20 69 73 20 0a 20 20 20 20 20  header is .     
9050: 20 2a 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   ** invalid, the
9060: 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  n the process th
9070: 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
9080: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
9090: 20 68 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20   have .      ** 
90a0: 63 72 61 73 68 65 64 20 62 65 66 6f 72 65 20 74  crashed before t
90b0: 68 65 20 68 65 61 64 65 72 20 77 61 73 20 73 79  he header was sy
90c0: 6e 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  nced. In this ca
90d0: 73 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20  se stop reading 
90e0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  .      ** the jo
90f0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
9100: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9120: 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  NE;.    }..    /
9130: 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 61 67  * Update the pag
9140: 65 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  e-size to match 
9150: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
9160: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  rom the journal.
9170: 20 0a 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74   .    ** Use a t
9180: 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20  estcase() macro 
9190: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
91a0: 74 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  t malloc failure
91b0: 20 77 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20   within .    ** 
91c0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
91d0: 28 29 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20  () is tested..  
91e0: 20 20 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69    */.    iPageSi
91f0: 7a 65 31 36 20 3d 20 28 75 31 36 29 69 50 61 67  ze16 = (u16)iPag
9200: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
9210: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
9220: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
9230: 26 69 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20  &iPageSize16);. 
9240: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
9250: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
9260: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
9270: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65  LITE_OK || iPage
9280: 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61  Size16==(u16)iPa
9290: 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f  geSize );..    /
92a0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
92b0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
92c0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
92d0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20  lue used by .   
92e0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
92f0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
9300: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
9310: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
9320: 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79     ** created by
9330: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
9340: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
9350: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
9360: 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e  e.    ** is bein
9370: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
9380: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
9390: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
93a0: 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
93b0: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
93c0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
93d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
93e0: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f   routine..    */
93f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
9400: 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f  torSize = iSecto
9410: 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50  rSize;.  }..  pP
9420: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9430: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
9440: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
9450: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
9460: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
9470: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
9480: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
9490: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
94a0: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
94b0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
94c0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
94d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
94e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
94f0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
9500: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
9510: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
9520: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
9530: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
9540: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
9550: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
9560: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
9570: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
9580: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
9590: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
95a0: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
95b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79  :.**.**   + 4 by
95c0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
95d0: 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74  NO..**   + N byt
95e0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
95f0: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75  al filename in u
9600: 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62  tf-8..**   + 4 b
9610: 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20  ytes: N (length 
9620: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9630: 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c  l name in bytes,
9640: 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   no nul-terminat
9650: 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79  or)..**   + 4 by
9660: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
9670: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
9680: 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65  m..**   + 8 byte
9690: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
96a0: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
96b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
96c0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
96d0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
96e0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
96f0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
9700: 2c 20 77 68 65 72 65 20 65 61 63 68 20 62 79 74  , where each byt
9710: 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  e is interpreted
9720: 20 61 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62   as a signed 8-b
9730: 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a  it integer..**.*
9740: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
9750: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
9760: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
9770: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
9780: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
9790: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
97a0: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
97b0: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
97c0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
97d0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
97e0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
97f0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9810: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
9820: 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20    int nMaster;  
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9850: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9860: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9880: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
9890: 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72  f header in jour
98a0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
98b0: 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20  4 jrnlSize;     
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98d0: 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61  * Size of journa
98e0: 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a  l file on disk *
98f0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  /.  u32 cksum = 
9900: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9910: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
9920: 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74   of string zMast
9930: 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d  er */..  if( !zM
9940: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
9950: 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c  >setMaster.   ||
9960: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9970: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9980: 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a  NALMODE_MEMORY .
9990: 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f     || pPager->jo
99a0: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
99b0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
99c0: 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
99d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
99e0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
99f0: 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65  ster = 1;.  asse
9a00: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
9a10: 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a  r->jfd) );..  /*
9a20: 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c   Calculate the l
9a30: 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73 20 61  ength in bytes a
9a40: 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  nd the checksum 
9a50: 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  of zMaster */.  
9a60: 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a  for(nMaster=0; z
9a70: 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b  Master[nMaster];
9a80: 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20   nMaster++){.   
9a90: 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65   cksum += zMaste
9aa0: 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a  r[nMaster];.  }.
9ab0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
9ac0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
9ad0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
9ae0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
9af0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
9b00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9b10: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
9b20: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
9b30: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
9b40: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
9b50: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
9b60: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
9b70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
9b80: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
9b90: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9ba0: 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48  alOff = journalH
9bb0: 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29  drOffset(pPager)
9bc0: 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20  ;.  }.  iHdrOff 
9bd0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9be0: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  lOff;..  /* Writ
9bf0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9c00: 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65  rnal data to the
9c10: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
9c20: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a  nal file. If.  *
9c30: 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * an error occur
9c40: 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  s, return the er
9c50: 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
9c60: 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  caller..  */.  i
9c70: 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  f( (0 != (rc = w
9c80: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9c90: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c  r->jfd, iHdrOff,
9ca0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
9cb0: 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20  Pager)))).   || 
9cc0: 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
9cd0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
9ce0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
9cf0: 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66   nMaster, iHdrOf
9d00: 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  f+4))).   || (0 
9d10: 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32  != (rc = write32
9d20: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9d30: 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73  , iHdrOff+4+nMas
9d40: 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a  ter, nMaster))).
9d50: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9d60: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
9d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
9d80: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20  ff+4+nMaster+4, 
9d90: 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28  cksum))).   || (
9da0: 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74  0 != (rc = sqlit
9db0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
9dc0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
9dd0: 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66  agic, 8, iHdrOff
9de0: 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a  +4+nMaster+8))).
9df0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9e00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
9e10: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9e20: 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20  (nMaster+20);.  
9e30: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9e40: 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
9e50: 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  nc;..  /* If the
9e60: 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72   pager is in per
9e70: 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d  istent-journal m
9e80: 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68  ode, then the ph
9e90: 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75  ysical .  ** jou
9ea0: 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78  rnal-file may ex
9eb0: 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e  tend past the en
9ec0: 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d  d of the master-
9ed0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a  journal name.  *
9ee0: 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66  * and 8 bytes of
9ef0: 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74   magic data just
9f00: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
9f10: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20  file. This is . 
9f20: 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65   ** dangerous be
9f30: 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74  cause the code t
9f40: 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74  o rollback a hot
9f50: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20  -journal file.  
9f60: 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ** will not be a
9f70: 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ble to find the 
9f80: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
9f90: 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
9fa0: 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f   .  ** whether o
9fb0: 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
9fc0: 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a  l is hot. .  **.
9fd0: 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69    ** Easiest thi
9fe0: 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73  ng to do in this
9ff0: 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20   scenario is to 
a000: 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75  truncate the jou
a010: 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
a020: 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20  to the required 
a030: 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66  size..  */ .  if
a040: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  ( SQLITE_OK==(rc
a050: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a060: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
a070: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20  , &jrnlSize)).  
a080: 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61   && jrnlSize>pPa
a090: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
a0a0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
a0b0: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
a0c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
a0d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
a0e0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
a0f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
a100: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
a110: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
a120: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
a130: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
a140: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
a150: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   or NULL if the 
a160: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
a170: 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64  s not .** alread
a180: 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  y in memory..*/.
a190: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
a1a0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
a1b0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
a1c0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
a1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
a1f0: 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
a200: 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
a210: 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c  sible for a call
a220: 20 74 6f 20 50 63 61 63 68 65 46 65 74 63 68 28   to PcacheFetch(
a230: 29 20 77 69 74 68 20 63 72 65 61 74 65 46 6c 61  ) with createFla
a240: 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69  g==0 to.  ** fai
a250: 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65  l, since no atte
a260: 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  mpt to allocate 
a270: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77  dynamic memory w
a280: 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a  ill be made..  *
a290: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
a2a0: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
a2b0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
a2c0: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
a2d0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
a2e0: 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   Unless the page
a2f0: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a300: 61 74 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c  ate, discard all
a310: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
a320: 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  . If.** the page
a330: 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74  r is in error-st
a340: 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63  ate, then this c
a350: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
a360: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20  **.** TODO: Why 
a370: 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74  can we not reset
a380: 20 74 68 65 20 70 61 67 65 72 20 77 68 69 6c 65   the pager while
a390: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f   in error state?
a3a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a3b0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
a3c0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
a3d0: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61  ( SQLITE_OK==pPa
a3e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
a3f0: 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
a400: 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d  pRestart(pPager-
a410: 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73  >pBackup);.    s
a420: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
a430: 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  r(pPager->pPCach
a440: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
a450: 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
a460: 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
a470: 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
a480: 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
a490: 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
a4a0: 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
a4b0: 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
a4c0: 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
a4d0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
a4e0: 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
a4f0: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
a500: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
a510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
a520: 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
a530: 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
a540: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
a570: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
a580: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
a590: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
a5a0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
a5b0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
a5c0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
a5d0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
a5e0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
a5f0: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
a600: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
a610: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
a620: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
a630: 73 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  se(pPager->sjfd)
a640: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a650: 66 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61  free(pPager->aSa
a660: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67  vepoint);.  pPag
a670: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d  er->aSavepoint =
a680: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53   0;.  pPager->nS
a690: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20  avepoint = 0;.  
a6a0: 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
a6b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
a6c0: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
a6d0: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
a6e0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
a6f0: 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74  avepoint .** bit
a700: 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  vecs of all open
a710: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74   savepoints. Ret
a720: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
a730: 20 73 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f   successful.** o
a740: 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  r SQLITE_NOMEM i
a750: 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  f a malloc failu
a760: 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74  re occurs..*/.st
a770: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
a780: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
a790: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
a7a0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
a7b0: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
a7c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a7d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
a7e0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
a7f0: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
a800: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
a810: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
a820: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
a830: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
a840: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
a850: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
a860: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
a870: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
a880: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
a890: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
a8a0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
a8b0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a8c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
a8d0: 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EM );.      asse
a8e0: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
a8f0: 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
a900: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20  NOMEM );.    }. 
a910: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a920: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  }../*.** Unlock 
a930: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
a940: 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
a950: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
a960: 68 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69  he pager.** is i
a970: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
a980: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
a990: 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  ager is currentl
a9a0: 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  y in error state
a9b0: 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f  , discard the co
a9c0: 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68  ntents of .** th
a9d0: 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65  e cache and rese
a9e0: 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  t the Pager stru
a9f0: 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73  cture internal s
aa00: 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69  tate. If there i
aa10: 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75  s.** an open jou
aa20: 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20  rnal-file, then 
aa30: 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20  the next time a 
aa40: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f  shared-lock is o
aa50: 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68  btained.** on th
aa60: 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79  e pager file (by
aa70: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
aa80: 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20  er process), it 
aa90: 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74  will be.** treat
aaa0: 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  ed as a hot-jour
aab0: 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62  nal and rolled b
aac0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
aad0: 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  oid pager_unlock
aae0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
aaf0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
ab00: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
ab10: 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
ab40: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61   */..    /* Alwa
ab50: 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75  ys close the jou
ab60: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64  rnal file when d
ab70: 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61  ropping the data
ab80: 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a  base lock..    *
ab90: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f  * Otherwise, ano
aba0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
abb0: 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  with journal_mod
abc0: 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20  e=delete might. 
abd0: 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65     ** delete the
abe0: 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75   file out from u
abf0: 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a  nder us..    */.
ac00: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ac10: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
ac20: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
ac30: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
ac40: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
ac50: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
ac60: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72  urnal = 0;.    r
ac70: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
ac80: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
ac90: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
aca0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f   is unlocked, so
acb0: 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68  mebody else migh
acc0: 74 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65  t change it. The
acd0: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73  .    ** values s
ace0: 74 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64  tored in Pager.d
acf0: 62 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74  bSize etc. might
ad00: 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20   become invalid 
ad10: 69 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68  if.    ** this h
ad20: 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65  appens. TODO: Re
ad30: 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e  ally, this doesn
ad40: 27 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  't need to be cl
ad50: 65 61 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74  eared.    ** unt
ad60: 69 6c 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  il the change-co
ad70: 75 6e 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c  unter check fail
ad80: 73 20 69 6e 20 70 61 67 65 72 53 68 61 72 65 64  s in pagerShared
ad90: 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  Lock()..    */. 
ada0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
adb0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20  eValid = 0;..   
adc0: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
add0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
ade0: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
adf0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
ae00: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
ae10: 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
ae20: 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c  (("UNLOCK %p\n",
ae30: 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f   pPager))..    /
ae40: 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
ae50: 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
ae60: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
ae70: 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
ae80: 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73  t be.    ** trus
ae90: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
aea0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
aeb0: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
aec0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
aed0: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
aee0: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
aef0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
af00: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
af10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
af20: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
af30: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
af40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
af50: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
af60: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
af70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
af80: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
af90: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  r);.    }..    p
afa0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
afb0: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
afc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
afd0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
afe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
aff0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b000: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  be called when a
b010: 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54  n IOERR, CORRUPT
b020: 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a   or FULL error.*
b030: 2a 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  * may have occur
b040: 72 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 61  red. The first a
b050: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
b060: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
b070: 72 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  r .** structure,
b080: 20 74 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20   the second the 
b090: 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74  error-code about
b0a0: 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20   to be returned 
b0b0: 62 79 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41  by a pager .** A
b0c0: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  PI function. The
b0d0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b0e0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
b0f0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
b100: 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e   .** to this fun
b110: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
b120: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b130: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
b140: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
b150: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
b160: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
b170: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
b180: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
b190: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
b1a0: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
b1b0: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
b1c0: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
b1d0: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
b1e0: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
b1f0: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
b200: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
b210: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
b220: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
b230: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
b240: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
b250: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
b260: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
b270: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
b280: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
b290: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
b2a0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b2b0: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
b2c0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
b2d0: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
b2e0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
b2f0: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65  or occurred, the
b300: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
b310: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
b320: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
b330: 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  d to restore the
b340: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b350: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
b360: 61 73 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65  as if.** it were
b370: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e   a hot-journal).
b380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b390: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
b3a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
b3b0: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
b3c0: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
b3d0: 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65  rt(.       pPage
b3e0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
b3f0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20  TE_FULL ||.     
b400: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b410: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a  e==SQLITE_OK ||.
b420: 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
b430: 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d  errCode & 0xff)=
b440: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20  =SQLITE_IOERR.  
b450: 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32  );.  if(.    rc2
b460: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
b470: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
b480: 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63  _IOERR ||.    rc
b490: 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  2==SQLITE_CORRUP
b4a0: 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65  T.  ){.    pPage
b4b0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b  r->errCode = rc;
b4c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
b4d0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
b4e0: 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71  LOCK .     && sq
b4f0: 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
b500: 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
b510: 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  che)==0 .    ){.
b520: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
b530: 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
b540: 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20   unlocked, call 
b550: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e  pager_unlock() n
b560: 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63  ow to.      ** c
b570: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b580: 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20  tate and ensure 
b590: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d 63  that the pager-c
b5a0: 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a  ache is .      *
b5b0: 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  * completely emp
b5c0: 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
b5d0: 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
b5e0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
b5f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
b600: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
b610: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61   a rollback if a
b620: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
b630: 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63  active and unloc
b640: 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  k the .** databa
b650: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
b660: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b670: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b680: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b690: 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  , do not attempt
b6a0: 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63   .** the rollbac
b6b0: 6b 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  k at this time. 
b6c0: 49 6e 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75  Instead, pager_u
b6d0: 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  nlock() is calle
b6e0: 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  d. The.** call t
b6f0: 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  o pager_unlock()
b700: 20 77 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c   will discard al
b710: 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  l in-memory page
b720: 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65  s, unlock.** the
b730: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
b740: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  nd clear the err
b750: 6f 72 20 73 74 61 74 65 2e 20 49 66 20 74 68 69  or state. If thi
b760: 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20  s means that.** 
b770: 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a  there is a hot-j
b780: 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74  ournal left in t
b790: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  he file-system, 
b7a0: 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74  the next connect
b7b0: 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  ion.** to obtain
b7c0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
b7d0: 6e 20 74 68 65 20 70 61 67 65 72 20 28 77 68 69  n the pager (whi
b7e0: 63 68 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f  ch may be this o
b7f0: 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c  ne) will.** roll
b800: 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
b810: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
b820: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74   not already ent
b830: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b840: 74 61 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20  tate, but an IO 
b850: 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  or.** malloc err
b860: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
b870: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65   a rollback, the
b880: 6e 20 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65  n this will itse
b890: 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65  lf cause .** the
b8a0: 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
b8b0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
b8c0: 20 57 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63   Which will be c
b8d0: 6c 65 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a  leared by the.**
b8e0: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
b8f0: 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63  nlock(), as desc
b900: 72 69 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ribed above..*/.
b910: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
b920: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
b930: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
b940: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
b950: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b960: 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73  _OK && pPager->s
b970: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
b980: 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69  RVED ){.    sqli
b990: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
b9a0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69  lloc();.    sqli
b9b0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
b9c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
b9d0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
b9e0: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
b9f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
ba00: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  r);.}../*.** Thi
ba10: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
ba20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
ba30: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75  transaction is u
ba40: 73 75 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20  sually ended by 
ba50: 0a 2a 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d  .** either a COM
ba60: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
ba70: 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  K operation. Thi
ba80: 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65  s routine may be
ba90: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65   called .** afte
baa0: 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  r rollback of a 
bab0: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20  hot-journal, or 
bac0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
bad0: 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
bae0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
baf0: 66 69 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20  file or writing 
bb00: 74 68 65 20 76 65 72 79 20 66 69 72 73 74 20 6a  the very first j
bb10: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66  ournal-header of
bb20: 20 61 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74   a.** database t
bb30: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a  ransaction..** .
bb40: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
bb50: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  is in PAGER_SHAR
bb60: 45 44 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f  ED or PAGER_UNLO
bb70: 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
bb80: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
bb90: 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
bba0: 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20   no-op (returns 
bbb0: 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a  SQLITE_OK)..**.*
bbc0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79  * Otherwise, any
bbd0: 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
bbe0: 74 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e  ts are released.
bbf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
bc00: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
bc10: 65 6e 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22  en, then it is "
bc20: 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65  finalized". Once
bc30: 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66   a journal .** f
bc40: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e  ile has been fin
bc50: 61 6c 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74  alized it is not
bc60: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65   possible to use
bc70: 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b   it to roll back
bc80: 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69   a .** transacti
bc90: 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20  on. Nor will it 
bca0: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  be considered to
bcb0: 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   be a hot-journa
bcc0: 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20  l by this.** or 
bcd0: 61 6e 79 20 6f 74 68 65 72 20 64 61 74 61 62 61  any other databa
bce0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45  se connection. E
bcf0: 78 61 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75  xactly how a jou
bd00: 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65  rnal is finalize
bd10: 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20  d.** depends on 
bd20: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
bd30: 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e  he pager is runn
bd40: 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ing in exclusive
bd50: 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65   mode and.** the
bd60: 20 63 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c   current journal
bd70: 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75  -mode (Pager.jou
bd80: 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c  rnalMode value),
bd90: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
bda0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
bdb0: 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20  ==MEMORY.**     
bdc0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  Journal file des
bdd0: 63 72 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c  criptor is simpl
bde0: 79 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64  y closed. This d
bdf0: 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20  estroys an .**  
be00: 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75     in-memory jou
be10: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  rnal..**.**   jo
be20: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43  urnalMode==TRUNC
be30: 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ATE.**     Journ
be40: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
be50: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
be60: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
be70: 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  *   journalMode=
be80: 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20  =PERSIST.**     
be90: 54 68 65 20 66 69 72 73 74 20 32 38 20 62 79 74  The first 28 byt
bea0: 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  es of the journa
beb0: 6c 20 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65  l file are zeroe
bec0: 64 2e 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61  d. This invalida
bed0: 74 65 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  tes.**     the f
bee0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
bef0: 64 65 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c  der in the file,
bf00: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65   and hence the e
bf10: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ntire journal.**
bf20: 20 20 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e       file. An in
bf30: 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69  valid journal fi
bf40: 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c  le cannot be rol
bf50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
bf60: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44    journalMode==D
bf70: 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65  ELETE.**     The
bf80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
bf90: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
bfa0: 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ted using sqlite
bfb0: 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a  3OsDelete()..**.
bfc0: 2a 2a 20 20 20 20 20 49 66 20 74 68 65 20 70 61  **     If the pa
bfd0: 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
bfe0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
bff0: 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66  , this method of
c000: 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20   finalizing.**  
c010: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
c020: 69 6c 65 20 69 73 20 6e 65 76 65 72 20 75 73 65  ile is never use
c030: 64 2e 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74  d. Instead, if t
c040: 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69  he journalMode i
c050: 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20  s.**     DELETE 
c060: 61 6e 64 20 74 68 65 20 70 61 67 65 72 20 69 73  and the pager is
c070: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
c080: 64 65 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64  de, the method d
c090: 65 73 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a  escribed under.*
c0a0: 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  *     journalMod
c0b0: 65 3d 3d 50 45 52 53 49 53 54 20 69 73 20 75 73  e==PERSIST is us
c0c0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
c0d0: 2a 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72  * After the jour
c0e0: 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64  nal is finalized
c0f0: 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20  , if running in 
c100: 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f  non-exclusive mo
c110: 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72  de, the.** pager
c120: 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f   moves to PAGER_
c130: 53 48 41 52 45 44 20 73 74 61 74 65 20 28 61 6e  SHARED state (an
c140: 64 20 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65  d downgrades the
c150: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20   lock on the.** 
c160: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 63  database file ac
c170: 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a  cordingly)..**.*
c180: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
c190: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  s running in exc
c1a0: 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
c1b0: 69 73 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43  is in PAGER_SYNC
c1c0: 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20  ED state,.** it 
c1d0: 6d 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45  moves to PAGER_E
c1e0: 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63  XCLUSIVE. No loc
c1f0: 6b 73 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65  ks are downgrade
c200: 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69  d when running i
c210: 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d  n.** exclusive m
c220: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ode..**.** SQLIT
c230: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
c240: 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
c250: 75 72 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  urs. If an error
c260: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a   occurs during.*
c270: 2a 20 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20  * any of the IO 
c280: 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69  operations to fi
c290: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c2a0: 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63  al file or unloc
c2b0: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
c2c0: 65 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  e then the IO er
c2d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
c2e0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
c2f0: 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65  . If the .** ope
c300: 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69  ration to finali
c310: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c320: 69 6c 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20  ile fails, then 
c330: 74 68 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a  the code still.*
c340: 2a 20 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63  * tries to unloc
c350: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
c360: 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78  ile if not in ex
c370: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66  clusive mode. If
c380: 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f   the.** unlock o
c390: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61  peration fails a
c3a0: 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65  s well, then the
c3b0: 20 66 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64   first error cod
c3c0: 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20  e related.** to 
c3d0: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
c3e0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65  encountered (the
c3f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a   journal finaliz
c400: 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a  ation one) is.**
c410: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
c420: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
c430: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
c440: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
c450: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
c460: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c470: 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f  OK;      /* Erro
c480: 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72  r code from jour
c490: 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  nal finalization
c4a0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
c4b0: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
c4c0: 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f  _OK;     /* Erro
c4d0: 72 20 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66  r code from db f
c4e0: 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  ile unlock opera
c4f0: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70  tion */..  if( p
c500: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
c510: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
c520: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c530: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  _OK;.  }.  relea
c540: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
c550: 70 50 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65  pPager);..  asse
c560: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
c570: 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65  r->jfd) || pPage
c580: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
c590: 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e   );.  if( isOpen
c5a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
c5b0: 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54  ..    /* TODO: T
c5c0: 68 65 72 65 27 73 20 61 20 70 72 6f 62 6c 65 6d  here's a problem
c5d0: 20 68 65 72 65 20 69 66 20 61 20 6a 6f 75 72 6e   here if a journ
c5e0: 61 6c 2d 66 69 6c 65 20 77 61 73 20 6f 70 65 6e  al-file was open
c5f0: 65 64 20 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20  ed in MEMORY.   
c600: 20 2a 2a 20 6d 6f 64 65 20 61 6e 64 20 74 68 65   ** mode and the
c610: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
c620: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  de is changed to
c630: 20 54 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52   TRUNCATE or PER
c640: 53 49 53 54 0a 20 20 20 20 2a 2a 20 64 75 72 69  SIST.    ** duri
c650: 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ng the transacti
c660: 6f 6e 2e 20 54 68 69 73 20 63 6f 64 65 20 73 68  on. This code sh
c670: 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 20  ould be changed 
c680: 74 6f 20 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a  to assume.    **
c690: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
c6a0: 6c 20 6d 6f 64 65 20 68 61 73 20 6e 6f 74 20 63  l mode has not c
c6b0: 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
c6c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
c6d0: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 65 64 2e  .    ** started.
c6e0: 20 41 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33   And the sqlite3
c6f0: 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
c700: 28 29 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  () function shou
c710: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 68 61  ld be.    ** cha
c720: 6e 67 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  nged to make sur
c730: 65 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  e that this is t
c740: 68 65 20 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20  he case too..   
c750: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61   */..    /* Fina
c760: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c770: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
c780: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c790: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
c7a0: 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
c7b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d  ){.      int isM
c7c0: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73  emoryJournal = s
c7d0: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
c7e0: 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  al(pPager->jfd);
c7f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
c800: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
c810: 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  d);.      if( !i
c820: 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29  sMemoryJournal )
c830: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
c840: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
c850: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
c860: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
c870: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c880: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
c890: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
c8a0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
c8b0: 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
c8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
c8d0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c8e0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
c8f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c900: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
c910: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
c920: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
c930: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
c940: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
c950: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
c960: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
c970: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
c980: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
c990: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
c9a0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
c9b0: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
c9c0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
c9d0: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
c9e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c9f0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
ca00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
ca10: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
ca20: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
ca30: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
ca40: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ca50: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
ca60: 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20   || rc );.      
ca70: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
ca80: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
ca90: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
caa0: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
cab0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cac0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cad0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cae0: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
caf0: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cb00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
cb10: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
cb20: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
cb30: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
cb40: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
cb50: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
cb60: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
cb70: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
cb80: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
cb90: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
cba0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
cbb0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
cbc0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
cbd0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
cbe0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cbf0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cc00: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cc10: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cc20: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cc30: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cc40: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cc50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cc60: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cc70: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cc80: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cc90: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cca0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
ccb0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
ccc0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
ccd0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
cce0: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
ccf0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
cd00: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
cd10: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
cd20: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
cd30: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
cd40: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
cd50: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
cd60: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
cd70: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
cd80: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cd90: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
cda0: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
cdb0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
cdc0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
cdd0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
cde0: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
cdf0: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
ce00: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
ce10: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
ce20: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
ce30: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
ce40: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
ce50: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
ce60: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
ce70: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
ce80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
ce90: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
cea0: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
ceb0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
cec0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
ced0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
cee0: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
cef0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
cf00: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
cf10: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
cf20: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
cf30: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
cf40: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
cf50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
cf60: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
cf70: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
cf80: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
cf90: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
cfa0: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
cfb0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
cfc0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
cfd0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
cfe0: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
cff0: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d000: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d010: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d020: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d030: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d040: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d050: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d060: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d070: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d080: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d090: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d0a0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d0b0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d0c0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d0d0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d0e0: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d0f0: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d100: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d110: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d120: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d130: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d140: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d150: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d160: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d170: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d180: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d190: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d1a0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d1b0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d1c0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d1d0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d1e0: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d1f0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d200: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d210: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d220: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d230: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d240: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d250: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d260: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d270: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d280: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d290: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d2a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d2b0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d2c0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d2d0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d2e0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d2f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d300: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d310: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d320: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d330: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d340: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d350: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d360: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d370: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d380: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d390: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d3a0: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d3b0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d3c0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d3d0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d3e0: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d3f0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d400: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d410: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d420: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d430: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d440: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d450: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d460: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d470: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d480: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d490: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d4a0: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d4b0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d4c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d4d0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d4e0: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d4f0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d500: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d510: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d520: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d530: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d540: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d550: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d560: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d570: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d580: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d590: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d5a0: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d5b0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d5c0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d5d0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d5e0: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d5f0: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d600: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d610: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d620: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d630: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d640: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d650: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d660: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d670: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d680: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d690: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d6a0: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d6b0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d6c0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d6d0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d6e0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d6f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d700: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d710: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
d720: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
d730: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
d740: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
d750: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
d760: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
d770: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
d780: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
d790: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
d7a0: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
d7b0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
d7c0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
d7d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d7e0: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
d7f0: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
d800: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
d810: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
d820: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
d830: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
d840: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
d850: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
d860: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
d870: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
d880: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
d890: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
d8a0: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
d8b0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
d8c0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
d8d0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
d8e0: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
d8f0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
d900: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
d910: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
d920: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
d930: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
d940: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
d950: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
d960: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
d970: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
d980: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
d990: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
d9a0: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
d9b0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
d9c0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
d9d0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
d9e0: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
d9f0: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
da00: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
da10: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
da20: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
da30: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
da40: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
da50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
da60: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
da70: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
da80: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
da90: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
daa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dab0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
dac0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
dad0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
dae0: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
daf0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
db00: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
db10: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
db20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db30: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
db40: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
db50: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
db60: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
db70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
db80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
db90: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
dba0: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dbb0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
dbc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dbd0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
dbe0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dbf0: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
dc00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
dc10: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
dc20: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
dc30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
dc40: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
dc70: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
dc80: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
dc90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
dca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dcb0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dcc0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
dcd0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
dd00: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
dd10: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
dd20: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
dd30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
dd40: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
dd50: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
dd60: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
dd70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
dd80: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
dd90: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
dda0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
ddb0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
ddc0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
ddd0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
dde0: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
ddf0: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
de00: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
de10: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
de20: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
de30: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
de40: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
de50: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
de60: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
de70: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
de80: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
de90: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
dea0: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
deb0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
dec0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
ded0: 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
dee0: 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
def0: 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
df00: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
df10: 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
df20: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
df30: 61 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  ated */..  /* Re
df40: 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
df50: 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
df60: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
df70: 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
df80: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
df90: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
dfa0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
dfb0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
dfc0: 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
dfd0: 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
dfe0: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
dff0: 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
e000: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e010: 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
e020: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
e030: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e040: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
e050: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
e060: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e070: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e080: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e090: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e0a0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e0b0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e0c0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e0d0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e0e0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e0f0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e100: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e110: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e120: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e130: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e140: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e150: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e160: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e170: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e180: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e190: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e1a0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e1b0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e1c0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e1d0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e1e0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e1f0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e200: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e210: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e220: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e230: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e240: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e250: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e260: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e270: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e280: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e290: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e2a0: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e2b0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e2c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e2d0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e2e0: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e2f0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e300: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e310: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e320: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e330: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e340: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e350: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
e360: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
e370: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e380: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e390: 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
e3a0: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
e3b0: 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
e3c0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
e3d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e3e0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
e3f0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
e400: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
e410: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e420: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
e430: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
e440: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
e450: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
e460: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
e470: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
e480: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
e490: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
e4a0: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
e4b0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e4c0: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
e4d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e4e0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
e4f0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
e500: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
e510: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
e520: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
e530: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
e540: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
e550: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
e560: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
e570: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
e580: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
e590: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e5a0: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
e5b0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e5c0: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
e5d0: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
e5e0: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
e5f0: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
e600: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
e610: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
e620: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
e630: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
e640: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
e650: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
e660: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
e670: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
e680: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
e690: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
e6a0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
e6b0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e6c0: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
e6d0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
e6e0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
e6f0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
e700: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
e710: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
e720: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
e730: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
e740: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
e750: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
e760: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
e770: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
e780: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
e790: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
e7a0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
e7b0: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
e7c0: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
e7d0: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
e7e0: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
e7f0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
e800: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
e810: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
e820: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
e830: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
e840: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
e850: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
e860: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
e870: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
e880: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
e890: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
e8a0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
e8b0: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
e8c0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
e8d0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
e8e0: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
e8f0: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
e900: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
e910: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
e920: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
e930: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
e940: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
e950: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
e960: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
e970: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
e980: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
e990: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
e9a0: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
e9b0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
e9c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e9d0: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
e9e0: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
e9f0: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
ea00: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
ea10: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ea20: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
ea30: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
ea40: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ea50: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
ea60: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ea70: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
ea80: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ea90: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
eaa0: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
eab0: 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
eac0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
ead0: 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
eae0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
eaf0: 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
eb00: 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
eb10: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
eb20: 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
eb30: 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
eb40: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
eb50: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
eb60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
eb70: 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
eb80: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  ened..  */.  pPg
eb90: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
eba0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
ebb0: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
ebc0: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
ebd0: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
ebe0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
ebf0: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
ec00: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
ec10: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
ec20: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
ec30: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
ec40: 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
ec50: 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
ec60: 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
ec70: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
ec80: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
ec90: 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28  CLUSIVE).   && (
eca0: 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
ecb0: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
ecc0: 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26  EED_SYNC)).   &&
ecd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ece0: 66 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e 73  fd).   && !isUns
ecf0: 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ync.  ){.    i64
ed00: 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
ed10: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
ed20: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
ed30: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ed40: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
ed50: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
ed60: 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
ed70: 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
ed80: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
ed90: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
eda0: 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
edb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
edc0: 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
edd0: 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
ede0: 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d  gno, aData);.  }
edf0: 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
ee00: 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
ee10: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
ee20: 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
ee30: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
ee40: 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
ee50: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
ee60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
ee70: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
ee80: 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
ee90: 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
eea0: 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
eeb0: 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
eec0: 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
eed0: 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
eee0: 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
eef0: 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
ef00: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
ef10: 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
ef20: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
ef30: 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
ef40: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
ef50: 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
ef60: 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
ef70: 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
ef80: 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
ef90: 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
efa0: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
efb0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
efc0: 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
efd0: 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
efe0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
eff0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
f000: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f010: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
f020: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
f030: 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
f040: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
f050: 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
f060: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f070: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
f080: 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
f090: 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
f0a0: 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
f0b0: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
f0c0: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
f0d0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
f0e0: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
f0f0: 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
f100: 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
f110: 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
f120: 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
f130: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
f140: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
f150: 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
f160: 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
f170: 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
f180: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
f190: 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72  nt );.    if( (r
f1a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f1b0: 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
f1c0: 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21  pgno, &pPg, 1))!
f1d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f1e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f1f0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
f200: 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
f210: 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
f220: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
f230: 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
f240: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
f250: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
f260: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
f270: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
f280: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
f290: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
f2a0: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
f2b0: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
f2c0: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
f2d0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
f2e0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
f2f0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
f300: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
f310: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
f320: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
f330: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
f340: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
f350: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
f360: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f370: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
f380: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
f390: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
f3a0: 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
f3b0: 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
f3c0: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
f3d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f3e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f3f0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
f400: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
f410: 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
f420: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61    }.    if( isMa
f430: 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
f440: 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
f450: 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
f460: 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
f470: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
f480: 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
f490: 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
f4a0: 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
f4b0: 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
f4c0: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
f4d0: 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
f4e0: 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
f4f0: 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
f500: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
f510: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
f520: 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
f530: 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
f540: 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
f550: 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
f560: 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
f570: 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
f580: 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a   to the..      *
f590: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
f5a0: 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
f5b0: 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
f5c0: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
f5d0: 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
f5e0: 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
f5f0: 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
f600: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
f610: 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
f620: 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
f630: 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
f640: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
f650: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
f660: 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
f670: 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
f680: 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
f690: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
f6a0: 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
f6b0: 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
f6c0: 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
f6d0: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f6e0: 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
f6f0: 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
f700: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
f710: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
f720: 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
f730: 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
f740: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
f750: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f760: 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
f770: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
f780: 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
f790: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
f7a0: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
f7b0: 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
f7c0: 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
f7d0: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f7e0: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f7f0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
f800: 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
f810: 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
f820: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
f830: 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
f840: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
f850: 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
f860: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
f870: 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
f880: 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
f890: 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
f8a0: 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
f8b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
f8c0: 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
f8d0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
f8e0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
f8f0: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
f900: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
f910: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
f920: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
f930: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
f940: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
f950: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
f960: 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
f970: 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
f980: 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
f990: 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
f9a0: 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
f9b0: 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
f9c0: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
f9d0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
f9e0: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
f9f0: 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
fa00: 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
fa10: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
fa20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
fa30: 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
fa40: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
fa50: 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
fa60: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
fa70: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
fa80: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
fa90: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
faa0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fab0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
fac0: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
fad0: 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
fae0: 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
faf0: 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
fb00: 20 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20   ahead into the 
fb10: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
fb20: 65 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73  e and determines
fb30: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
fb40: 6f 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  ot the next reco
fb50: 72 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74  rd (the record t
fb60: 68 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69  hat begins at fi
fb70: 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61  le.** offset pPa
fb80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
fb90: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
fba0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f  d page record co
fbb0: 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61  nsisting.** of a
fbc0: 20 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62   valid page numb
fbd0: 65 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53  er, pPage->pageS
fbe0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e  ize bytes of con
fbf0: 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a  tent, followed.*
fc00: 2a 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65  * by a valid che
fc10: 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cksum..**.** The
fc20: 20 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65   pager never nee
fc30: 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20  ds to know this 
fc40: 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69  in order to do i
fc50: 74 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a  ts job.   This.*
fc60: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  * routine is onl
fc70: 79 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68  y used from with
fc80: 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
fc90: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 2e  stcase() macros.
fca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fcb0: 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
fcc0: 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65 72  ageIsValid(Pager
fcd0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 6e   *pPager){.  Pgn
fce0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
fcf0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
fd00: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
fd10: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
fd20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd30: 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  e page checksum 
fd40: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
fd50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
fd60: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72 65  urn code from re
fd70: 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  ad operations */
fd80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
fd90: 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20 66  *fd;    /* The f
fda0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
fdb0: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72 65  rom which we are
fdc0: 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38   reading */.  u8
fdd0: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
fde0: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
fdf0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20   the page */..  
fe00: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
fe10: 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20 2a   number header *
fe20: 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72 2d  /.  fd = pPager-
fe30: 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  >jfd;.  rc = rea
fe40: 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67  d32bits(fd, pPag
fe50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
fe60: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
fe70: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72  !=SQLITE_OK ){ r
fe80: 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
fe90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
feb0: 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67  _TEST*/.  if( pg
fec0: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
fed0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
fee0: 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20 30  ger) ){ return 0
fef0: 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f  ; }         /*NO
ff00: 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67  _TEST*/.  if( pg
ff10: 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
ff20: 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75 72  >dbSize ){ retur
ff30: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
ff40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
ff50: 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65  _TEST*/..  /* Re
ff60: 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ad the checksum 
ff70: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
ff80: 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
ff90: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67  >journalOff+pPag
ffa0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
ffb0: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
ffc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
ffd0: 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
ffe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
10000 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
10010 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e 64  ead the data and
10020 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65 63   verify the chec
10030 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20  ksum */.  aData 
10040 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70  = (u8*)pPager->p
10050 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
10060 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
10070 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
10080 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
10090 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34  er->journalOff+4
100a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
100b0 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
100c0 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
100f0 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f 63  */.  if( pager_c
10100 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
10110 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65  ta)!=cksum ){ re
10120 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
10130 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
10140 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20 74  */..  /* Reach t
10150 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69  his point only i
10160 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76 61  f the page is va
10170 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lid */.  return 
10180 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
10190 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
101a0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
101b0 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
101c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d   */../*.** Param
101d0 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
101e0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
101f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10200 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
10210 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
10220 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
10230 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10240 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
10250 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
10260 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10270 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
10280 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
10290 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
102a0 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
102b0 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
102c0 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
102d0 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
102e0 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
102f0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
10300 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
10310 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
10320 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
10330 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
10340 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
10350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10360 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
10370 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
10380 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
10390 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
103a0 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
103b0 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
103c0 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
103d0 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
103e0 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
103f0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
10400 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
10410 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
10420 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
10430 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
10440 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
10450 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
10460 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
10470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
10480 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
10490 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
104a0 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
104b0 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
104c0 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
104d0 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
104e0 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
104f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
10500 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
10510 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
10520 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
10530 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
10540 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
10550 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
10560 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
10570 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
10580 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
10590 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
105a0 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
105b0 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
105c0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
105d0 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
105e0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
105f0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
10600 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
10610 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
10620 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
10630 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
10640 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
10650 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
10660 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
10670 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
10680 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
10690 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
106a0 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
106b0 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
106c0 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
106d0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
106e0 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
106f0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
10700 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
10710 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
10720 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
10730 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
10740 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
10750 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
10760 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
10770 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
10780 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10790 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
107a0 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
107b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
107c0 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
107d0 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
107e0 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
107f0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
10800 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
10810 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
10820 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
10830 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
10840 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
10850 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
10860 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
10870 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
10880 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
10890 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
108a0 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
108b0 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
108c0 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
108d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
108e0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
108f0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
10900 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
10910 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
10920 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
10930 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
10940 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
10950 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10960 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
10970 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10980 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10990 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
109a0 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
109b0 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
109c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
109d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
109e0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
109f0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
10a00 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
10a10 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
10a20 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
10a30 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10a40 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
10a50 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
10a60 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10a70 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
10a80 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
10a90 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
10aa0 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
10ab0 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10ac0 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
10ad0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10ae0 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10af0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   file */..  /* A
10b00 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
10b10 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
10b20 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
10b30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
10b40 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
10b50 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
10b60 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10b70 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
10b80 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
10b90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
10ba0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
10bb0 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
10bc0 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
10bd0 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
10be0 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
10bf0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
10c00 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
10c10 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
10c20 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10c30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
10c40 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
10c50 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
10c60 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
10c70 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
10c80 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
10c90 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10ca0 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
10cb0 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
10cc0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
10cd0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
10ce0 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72  master_out;..  r
10cf0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10d00 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
10d10 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
10d20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10d30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
10d40 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
10d50 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
10d60 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
10d70 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
10d80 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
10d90 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
10da0 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
10db0 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
10dc0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
10dd0 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
10de0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
10df0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
10e00 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
10e10 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
10e20 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
10e30 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
10e40 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
10e50 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
10e60 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28  )sqlite3Malloc((
10e70 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
10e80 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
10e90 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
10ea0 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
10eb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
10ec0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
10ed0 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
10ee0 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
10ef0 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
10f00 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
10f10 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
10f20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
10f30 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
10f40 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
10f50 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
10f60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10f70 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
10f80 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
10f90 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
10fa0 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
10fb0 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
10fc0 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
10fd0 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
10fe0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
10ff0 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
11000 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
11010 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
11020 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
11030 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
11040 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11050 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11060 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
11070 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
11080 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
11090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
110a0 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
110b0 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
110c0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
110d0 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
110e0 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
110f0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
11100 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
11110 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
11120 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
11130 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
11140 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
11150 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
11160 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11170 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
11180 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
11190 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
111a0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
111b0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
111c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
111d0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
111e0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
111f0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
11200 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
11210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11220 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
11230 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
11240 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
11250 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
11260 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
11270 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
11280 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
11290 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
112a0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
112b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
112c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
112d0 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
112e0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
112f0 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
11300 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
11310 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
11320 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
11330 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
11340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
11350 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
11360 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
11370 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11380 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
11390 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
113a0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
113b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
113c0 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
113d0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
113e0 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
113f0 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
11400 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
11410 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
11420 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
11430 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
11440 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
11450 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
11460 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
11470 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
11480 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11490 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
114a0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
114b0 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
114c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
114d0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
114e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
114f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11500 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
11510 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
11520 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11530 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
11540 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
11550 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11560 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
11570 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
11580 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
11590 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
115a0 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
115b0 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
115c0 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
115d0 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
115e0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
115f0 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
11600 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
11610 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
11620 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
11630 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
11640 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11650 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
11660 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
11670 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
11680 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
11690 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
116a0 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
116b0 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
116c0 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
116d0 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
116e0 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
116f0 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
11700 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
11710 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
11720 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
11730 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
11740 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
11750 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
11760 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
11770 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
11780 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
11790 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
117a0 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
117b0 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
117c0 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
117d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
117e0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
117f0 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
11800 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
11810 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
11820 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
11830 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
11840 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
11850 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11870 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
11880 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
11890 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
118a0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
118b0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
118c0 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
118d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
118e0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
118f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11900 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11910 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11920 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11930 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
11940 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
11950 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
11960 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
11970 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
11980 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
11990 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
119a0 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
119b0 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
119c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
119d0 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
119e0 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
119f0 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
11a00 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
11a10 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
11a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11a30 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
11a40 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
11a50 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
11a60 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11a70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11a80 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11a90 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
11aa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11ab0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11ac0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11ad0 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
11ae0 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
11af0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11b00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11b10 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
11b20 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11b30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11b40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11b50 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
11b60 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
11b70 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
11b80 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
11b90 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
11ba0 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
11bb0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
11bc0 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
11bd0 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
11be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11bf0 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
11c00 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
11c10 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
11c20 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
11c30 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
11c40 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
11c50 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11c60 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
11c70 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
11c80 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
11c90 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
11ca0 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
11cb0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
11cc0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
11cd0 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
11ce0 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
11cf0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
11d00 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11d10 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
11d20 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11d30 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
11d40 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
11d50 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69 66  ded up to 512 if
11d60 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
11d70 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e  han 512, or roun
11d80 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
11d90 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
11da0 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
11db0 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
11dc0 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
11dd0 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
11de0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
11df0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
11e00 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11e10 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
11e20 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ile );..  if( !p
11e30 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11e40 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
11e50 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
11e60 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
11e70 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
11e80 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
11e90 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
11ea0 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
11eb0 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
11ec0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
11ed0 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
11ee0 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f  segfault..    */
11ef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
11f00 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
11f10 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
11f20 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20  ager->fd);.  }. 
11f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
11f40 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20  torSize<512 ){. 
11f50 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
11f60 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
11f70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
11f80 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
11f90 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
11fa0 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
11fb0 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
11fc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
11fd0 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
11fe0 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
11ff0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
12000 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
12010 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
12020 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12030 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
12040 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
12050 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
12060 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
12070 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
12080 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
12090 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
120a0 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
120b0 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
120c0 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
120d0 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
120e0 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
120f0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
12100 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
12110 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
12120 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
12130 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
12140 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
12150 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
12160 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
12170 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
12180 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
12190 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
121a0 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
121b0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
121c0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
121d0 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
121e0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
121f0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
12200 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
12210 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
12220 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
12230 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
12240 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
12250 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
12260 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
12270 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
12280 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
12290 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
122a0 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
122b0 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
122c0 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
122d0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
122e0 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
122f0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
12300 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
12310 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34  case..**  (7)  4
12320 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
12330 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
12340 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
12350 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12360 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
12370 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
12380 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
12390 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
123a0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
123b0 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
123c0 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (8)  N bytes of 
123d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
123e0 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
123f0 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
12400 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
12410 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
12420 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
12430 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
12440 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
12450 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
12460 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
12470 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
12480 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
12490 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
124a0 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
124b0 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
124c0 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
124d0 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (9)  Zero or mo
124e0 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
124f0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
12500 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
12510 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
12520 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
12530 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
12540 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
12550 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
12560 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
12570 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
12580 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
12590 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
125a0 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69  an the first 8 i
125b0 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
125c0 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
125d0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
125e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39  nstance of the 9
125f0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
12600 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
12610 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
12620 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
12630 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
12640 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
12650 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
12660 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
12670 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
12680 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
12690 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
126a0 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
126b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
126c0 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
126d0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
126e0 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
126f0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
12700 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
12710 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
12720 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
12730 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12740 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
12750 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
12760 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
12770 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
12780 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
12790 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
127a0 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
127b0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
127c0 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
127d0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
127e0 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
127f0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
12800 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
12810 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
12820 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
12830 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
12840 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
12850 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
12860 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
12870 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
12880 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
12890 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
128a0 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
128b0 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
128c0 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
128d0 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
128e0 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
128f0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
12900 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
12910 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
12920 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
12930 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
12940 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
12950 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
12960 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
12970 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
12980 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
12990 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
129a0 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
129b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
129c0 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
129d0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
129e0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
129f0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
12a00 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
12a10 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
12a20 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
12a30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
12a40 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
12a50 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
12a60 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
12a70 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
12a80 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
12a90 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
12aa0 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
12ab0 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
12ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
12ad0 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
12ae0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
12af0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
12b00 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
12b10 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12b20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
12b30 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
12b40 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
12b50 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
12b60 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
12b70 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
12b80 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
12b90 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
12ba0 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
12bb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12bc0 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
12bd0 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
12be0 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
12bf0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12c00 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
12c10 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
12c20 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
12c30 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
12c40 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
12c50 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
12c60 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12c70 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
12c80 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
12c90 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
12ca0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12cb0 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
12cc0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
12cd0 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
12ce0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
12cf0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
12d00 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
12d10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12d20 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12d30 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
12d40 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
12d50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12d60 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
12d70 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
12d80 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
12d90 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
12da0 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
12db0 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
12dc0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12dd0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
12de0 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
12df0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
12e00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12e10 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12e20 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
12e30 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
12e40 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
12e50 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
12e60 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
12e70 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
12e80 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
12e90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
12ea0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12eb0 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
12ec0 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
12ed0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
12ee0 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
12ef0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
12f00 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
12f10 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
12f20 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
12f30 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
12f40 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
12f50 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
12f60 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
12f70 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12f80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
12f90 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
12fa0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12fb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
12fc0 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
12fd0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
12fe0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
12ff0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
13000 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
13010 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
13020 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
13030 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
13040 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
13050 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13060 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
13070 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
13080 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
13090 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
130a0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
130b0 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
130c0 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
130d0 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
130e0 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
130f0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
13100 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
13110 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
13120 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
13130 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
13140 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
13150 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
13160 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
13170 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
13180 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
13190 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
131a0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
131b0 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
131c0 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
131d0 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
131e0 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
131f0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
13200 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
13210 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
13220 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
13230 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
13240 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
13250 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
13260 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
13270 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
13280 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
13290 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
132a0 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
132b0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
132c0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
132d0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
132e0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
132f0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
13300 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
13310 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13320 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
13330 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13340 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
13350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13360 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
13370 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
13380 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
13390 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
133a0 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
133b0 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
133c0 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
133d0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
133e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
133f0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
13400 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
13410 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
13420 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73   1 ){.    int is
13430 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  Unsync = 0;..   
13440 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
13450 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
13460 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13470 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
13480 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
13490 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
134a0 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
134b0 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
134c0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
134d0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
134e0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
134f0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
13500 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
13510 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
13520 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
13530 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
13540 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13550 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
13560 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
13570 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
13580 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
13590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
135a0 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
135b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
135c0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
135d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
135e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
135f0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13600 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13610 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
13620 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
13630 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
13640 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
13650 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13660 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13670 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13680 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13690 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
136a0 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
136b0 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
136c0 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
136d0 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
136e0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
136f0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
13700 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
13710 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
13720 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
13730 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
13740 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13750 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13760 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13770 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13780 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13790 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
137a0 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
137b0 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
137c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
137d0 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
137e0 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
137f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
13800 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
13810 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
13820 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
13830 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
13840 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
13850 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13860 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13870 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13880 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13890 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
138a0 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
138b0 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
138c0 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
138d0 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
138e0 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
138f0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
13900 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
13910 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
13920 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
13930 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
13940 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
13950 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13960 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13970 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13980 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13990 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
139a0 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
139b0 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
139c0 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
139d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
139e0 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
139f0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
13a00 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
13a10 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
13a20 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
13a30 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
13a40 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
13a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13a60 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13a70 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13a80 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13a90 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13aa0 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13ab0 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13ac0 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13ad0 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13ae0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13af0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
13b00 20 74 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d   testcase( nRec=
13b10 3d 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20  =0 && !isHot.   
13b20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
13b30 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
13b40 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13b50 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)!=pPager->jour
13b60 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20  nalOff.         
13b70 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  && ((szJ - pPage
13b80 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
13b90 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
13ba0 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20  Pager))>0.      
13bb0 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a     && pagerNextJ
13bc0 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69  ournalPageIsVali
13bd0 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  d(pPager).    );
13be0 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
13bf0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
13c00 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13c10 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13c20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
13c30 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13c40 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
13c50 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
13c60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13c70 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
13c80 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
13c90 20 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20       isUnsync = 
13ca0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
13cb0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13cc0 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
13cd0 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
13ce0 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
13cf0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
13d00 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
13d10 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
13d20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13d30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13d40 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
13d50 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
13d60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
13d70 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
13d80 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
13d90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13da0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
13db0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
13dc0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13dd0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
13de0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13df0 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
13e00 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
13e10 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
13e20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
13e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
13e40 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
13e50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
13e60 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
13e70 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
13e80 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
13e90 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
13ea0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
13eb0 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
13ec0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
13ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13ee0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
13ef0 61 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55  age(pPager,1,isU
13f00 6e 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a  nsync,&pPager->j
13f10 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a  ournalOff,0,0);.
13f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f40 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13f50 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
13f60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13f70 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
13f80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13f90 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
13fa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13fc0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
13fd0 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
13fe0 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  k, then the data
13ff0 62 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79  base is probably
14000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f  .          ** go
14010 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65  ing to end up be
14020 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74  ing corrupt.  It
14030 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75   is corrupt to u
14040 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20  s, anyhow..     
14050 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20       ** Perhaps 
14060 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73  the next process
14070 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63   to come along c
14080 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20  an fix it.....  
14090 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
140a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
140b0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
140c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
140d0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
140e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
140f0 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
14100 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
14110 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
14120 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c  yback:.  /* Foll
14130 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  owing a rollback
14140 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
14150 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61  ile should be ba
14160 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e  ck in its origin
14170 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72  al.  ** state pr
14180 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74  ior to the start
14190 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
141a0 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74  ion, so invoke t
141b0 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46  he.  ** SQLITE_F
141c0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
141d0 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d  D file-control m
141e0 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65  ethod to disable
141f0 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74   the.  ** assert
14200 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72 61  ion that the tra
14210 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
14220 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20   was modified.. 
14230 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20   */.  assert(.  
14240 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d    pPager->fd->pM
14250 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20  ethods==0 ||.   
14260 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f   sqlite3OsFileCo
14270 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64  ntrol(pPager->fd
14280 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42  ,SQLITE_FCNTL_DB
14290 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53  _UNCHANGED,0)>=S
142a0 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20  QLITE_OK.  );.. 
142b0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79   /* If this play
142c0 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e  back is happenin
142d0 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  g automatically 
142e0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
142f0 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61  n IO or .  ** ma
14300 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20  lloc error that 
14310 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20 74  occurred after t
14320 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
14330 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62 75  r was updated bu
14340 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74  t .  ** before t
14350 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
14360 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68  as committed, th
14370 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f  en the change-co
14380 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69  unter .  ** modi
14390 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73  fication may jus
143a0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76 65  t have been reve
143b0 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68 61  rted. If this ha
143c0 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69  ppens in exclusi
143d0 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74  ve .  ** mode, t
143e0 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74  hen subsequent t
143f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66  ransactions perf
14400 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ormed by the con
14410 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74  nection will not
14420 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65  .  ** update the
14430 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14440 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79  at all. This may
14450 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20 69   lead to cache i
14460 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a  nconsistency.  *
14470 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f  * problems for o
14480 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
14490 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
144a0 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20  the future. So, 
144b0 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73  just.  ** in cas
144c0 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70 65  e this has happe
144d0 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63  ned, clear the c
144e0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
144f0 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lag now..  */.  
14500 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
14510 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72  untDone = pPager
14520 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69  ->tempFile;..  i
14530 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14540 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
14550 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
14560 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
14570 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
14580 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
14590 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
145a0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
145b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
145c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
145d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
145e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
145f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
14600 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
14610 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d  er, zMaster[0]!=
14620 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63  '\0');.    testc
14630 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
14640 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OK );.  }.  if( 
14650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
14660 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
14670 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
14680 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
14690 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
146a0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
146b0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
146c0 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
146d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
146e0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
146f0 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
14700 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
14710 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
14720 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
14730 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14740 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
14750 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
14760 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
14770 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
14780 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
14790 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
147a0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
147b0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
147c0 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
147d0 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
147e0 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
147f0 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
14800 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
14810 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
14820 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
14830 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
14840 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
14850 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e  layback savepoin
14860 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72  t pSavepoint. Or
14870 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d  , if pSavepoint=
14880 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79  =NULL, then play
14890 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69  back.** the enti
148a0 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
148b0 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65  l file. The case
148c0 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
148d0 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a  L occurs when .*
148e0 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  * a ROLLBACK TO 
148f0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
14900 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e  ed on a SAVEPOIN
14910 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61 6e  T that is a tran
14920 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65  saction .** save
14930 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  point..**.** Whe
14940 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  n pSavepoint is 
14950 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e  not NULL (meanin
14960 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74  g a non-transact
14970 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
14980 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65   .** being rolle
14990 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68  d back), then th
149a0 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69  e rollback consi
149b0 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72  sts of up to thr
149c0 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65  ee stages,.** pe
149d0 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f  rformed in the o
149e0 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a  rder specified:.
149f0 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20  **.**   * Pages 
14a00 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20  are played back 
14a10 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
14a20 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
14a30 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66  t byte.**     of
14a40 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70 6f  fset PagerSavepo
14a50 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
14a60 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a  continuing to .*
14a70 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
14a80 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c  oint.iHdrOffset,
14a90 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f   or to the end o
14aa0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14ab0 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69  al.**     file i
14ac0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14ad0 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a  .iHdrOffset is z
14ae0 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ero..**.**   * I
14af0 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  f PagerSavepoint
14b00 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e  .iHdrOffset is n
14b10 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61  ot zero, then pa
14b20 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a  ges are played.*
14b30 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72 74  *     back start
14b40 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ing from the jou
14b50 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65  rnal header imme
14b60 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
14b70 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53  g .**     PagerS
14b80 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66  avepoint.iHdrOff
14b90 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  set to the end o
14ba0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
14bb0 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20  al file..**.**  
14bc0 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68 65   * Pages are the
14bd0 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  n played back fr
14be0 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
14bf0 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e  al file, startin
14c00 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68  g.**     with th
14c10 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
14c20 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e  .iSubRec and con
14c30 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65  tinuing to the e
14c40 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65  nd of.**     the
14c50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
14c60 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20  *.** Throughout 
14c70 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f  the rollback pro
14c80 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20  cess, each time 
14c90 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64  a page is rolled
14ca0 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f   back, the.** co
14cb0 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
14cc0 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74 76  is set in a bitv
14cd0 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76 61  ec structure (va
14ce0 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20  riable pDone in 
14cf0 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  the.** implement
14d00 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68  ation below). Th
14d10 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e  is is used to en
14d20 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67 65  sure that a page
14d30 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c   is only.** roll
14d40 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72 73  ed back the firs
14d50 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63  t time it is enc
14d60 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68  ountered in eith
14d70 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  er journal..**.*
14d80 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20  * If pSavepoint 
14d90 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61  is NULL, then pa
14da0 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61  ges are only pla
14db0 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14dc0 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
14dd0 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73  l file. There is
14de0 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62   no need for a b
14df0 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63 61  itvec in this ca
14e00 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  se..**.** In eit
14e10 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65  her case, before
14e20 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e   playback commen
14e30 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64 62  ces the Pager.db
14e40 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
14e50 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68 65   is reset to the
14e60 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20 68   value that it h
14e70 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72 74  eld at the start
14e80 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e   of the savepoin
14e90 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61  t .** (or transa
14ea0 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20  ction). No page 
14eb0 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62  with a page-numb
14ec0 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
14ed0 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73  this value.** is
14ee0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66   played back. If
14ef0 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65   one is encounte
14f00 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79  red it is simply
14f10 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61   skipped..*/.sta
14f20 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61  tic int pagerPla
14f30 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50  ybackSavepoint(P
14f40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61  ager *pPager, Pa
14f50 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
14f60 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34  avepoint){.  i64
14f70 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
14f80 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69        /* Effecti
14f90 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  ve size of the m
14fa0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
14fb0 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
14fc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64            /* End
14fd0 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e   of first segmen
14fe0 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61  t of main-journa
14ff0 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  l records */.  i
15000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15010 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72  K;      /* Retur
15020 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
15030 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
15040 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
15050 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
15060 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
15070 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  once */..  asser
15080 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15090 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
150a0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
150b0 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
150c0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
150d0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
150e0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
150f0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
15100 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
15110 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
15120 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
15130 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
15140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15150 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
15160 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
15170 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
15180 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65  size back to the
15190 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62 65   value it was be
151a0 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f 69  fore the savepoi
151b0 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72  nt .  ** being r
151c0 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e  everted was open
151d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ed..  */.  pPage
151e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76  r->dbSize = pSav
151f0 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f  epoint ? pSavepo
15200 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61  int->nOrig : pPa
15210 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
15220 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65  ..  /* Use pPage
15230 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73  r->journalOff as
15240 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
15250 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
15260 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
15270 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75  urnal.  The actu
15280 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  al file might be
15290 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
152a0 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f  s in.  ** PAGER_
152b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
152c0 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f  CATE or PAGER_JO
152d0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
152e0 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67  T.  But anything
152f0 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65  .  ** past pPage
15300 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  r->journalOff is
15310 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75   off-limits to u
15320 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20  s..  */.  szJ = 
15330 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15340 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  ff;..  /* Begin 
15350 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  by rolling back 
15360 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
15370 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
15380 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50  arting at.  ** P
15390 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f  agerSavepoint.iO
153a0 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e  ffset and contin
153b0 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  uing to the next
153c0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
153d0 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68  .  ** There migh
153e0 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20  t be records in 
153f0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
15400 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67   that have a pag
15410 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72  e number.  ** gr
15420 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63  eater than the c
15430 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
15440 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62  size (pPager->db
15450 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a  Size) but those.
15460 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69    ** will be ski
15470 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  pped automatical
15480 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61  ly.  Pages are a
15490 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73  dded to pDone as
154a0 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70   they.  ** are p
154b0 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
154c0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
154d0 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66  t ){.    iHdrOff
154e0 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
154f0 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76  HdrOffset ? pSav
15500 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73  epoint->iHdrOffs
15510 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50  et : szJ;.    pP
15520 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15530 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15540 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c  Offset;.    whil
15550 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
15560 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15570 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29  nalOff<iHdrOff )
15580 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
15590 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
155a0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
155b0 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  0, &pPager->jour
155c0 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65  nalOff, 1, pDone
155d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
155e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
155f0 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  DONE );.  }else{
15600 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
15610 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d  rnalOff = 0;.  }
15620 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20  ..  /* Continue 
15630 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
15640 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ords out of the 
15650 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
15660 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68  rting at.  ** th
15670 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
15680 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20  header seen and 
15690 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c  continuing until
156a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 65   the effective e
156b0 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d  nd.  ** of the m
156c0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
156d0 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73  .  Continue to s
156e0 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  kip out-of-range
156f0 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20   pages and.  ** 
15700 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20  continue adding 
15710 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
15720 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f  k to pDone..  */
15730 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
15740 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
15750 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
15760 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b  J ){.    u32 ii;
15770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
15780 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
15790 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30     u32 nJRec = 0
157a0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
157b0 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
157c0 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
157d0 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
157e0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
157f0 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
15800 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
15810 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15820 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
15830 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
15840 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15850 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15860 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
15870 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
15880 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
15890 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
158a0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
158b0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
158c0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
158d0 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
158e0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
158f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
15900 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15910 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20  !(nJRec==0.     
15920 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
15930 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
15940 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15950 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
15960 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26  lOff.         &&
15970 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d   ((szJ - pPager-
15980 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
15990 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
159a0 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20  ger))>0.        
159b0 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75   && pagerNextJou
159c0 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
159d0 70 50 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a  pPager)).    );.
159e0 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
159f0 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
15a00 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15a10 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15a20 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15a30 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
15a40 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
15a50 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
15a60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
15a70 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
15a80 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
15a90 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
15aa0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
15ab0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
15ac0 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
15ad0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
15ae0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15af0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15b00 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e   1, 0, &pPager->
15b10 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
15b20 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15b30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15b40 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15b50 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15b60 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
15b70 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73  r->journalOff==s
15b80 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
15b90 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
15ba0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
15bb0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
15bc0 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
15bd0 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
15be0 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
15bf0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
15c00 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
15c10 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
15c20 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
15c30 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
15c40 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
15c50 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
15c60 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
15c70 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
15c80 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15c90 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
15ca0 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
15cb0 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
15cc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15cd0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  ;.    for(ii=pSa
15ce0 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
15cf0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15d00 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
15d10 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
15d20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
15d30 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72  et==ii*(4+pPager
15d40 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
15d50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15d60 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
15d70 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20  e(pPager, 0, 0, 
15d80 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e  &offset, 1, pDon
15d90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
15da0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
15db0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
15dc0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
15dd0 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
15de0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15df0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15e00 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
15e10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15e20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
15e30 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
15e40 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
15e50 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
15e60 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
15e70 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
15e80 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
15e90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
15ea0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
15eb0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
15ec0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
15ed0 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
15ee0 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
15ef0 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
15f00 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
15f10 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
15f20 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
15f30 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
15f40 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
15f50 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
15f60 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
15f70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
15f80 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
15f90 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
15fa0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
15fb0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
15fc0 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
15fd0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
15fe0 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
15ff0 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
16000 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
16010 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
16020 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
16030 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
16040 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
16050 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
16060 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16070 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
16080 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
16090 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
160a0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
160b0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
160c0 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
160d0 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
160e0 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
16100 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
16110 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
16120 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
16130 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
16140 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
16150 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
16160 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
16170 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
16180 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
16190 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
161a0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
161b0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
161c0 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
161d0 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
161e0 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
16200 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
16210 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
16220 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
16230 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
16240 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
16250 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
16260 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
16270 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
16280 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
16290 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
162a0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
162b0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
162c0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
162d0 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
162e0 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
162f0 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
16310 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
16320 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
16330 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
16340 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16350 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
16360 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
16370 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
16380 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
16390 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
163a0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
163b0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
163c0 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
163d0 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
163e0 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
163f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16400 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
16410 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
16420 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
16430 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
16440 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
16450 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
16460 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
16470 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
16480 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
16490 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
164a0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
164b0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
164c0 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
164d0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
164e0 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
164f0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
16500 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
16510 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16520 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
16530 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
16540 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16550 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
16560 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
16570 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
16580 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
16590 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
165a0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
165b0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
165c0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
165d0 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
165e0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
165f0 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
16600 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
16610 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
16620 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
16630 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
16640 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
16650 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
16660 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16670 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
16680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16690 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
166a0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
166b0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
166c0 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
166d0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
166e0 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
166f0 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
16700 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
16710 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
16720 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
16730 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
16740 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
16750 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
16760 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
16770 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
16780 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16790 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
167a0 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
167b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
167c0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
167d0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
167e0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
167f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
16800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16810 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
16820 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16830 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16840 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
16850 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
16860 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
16870 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16880 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
16890 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
168a0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
168b0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
168c0 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
168d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
168e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
168f0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16900 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16910 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
16920 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
16930 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
16940 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
16950 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
16960 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
16970 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16980 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16990 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
169a0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
169b0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
169c0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
169d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
169e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
169f0 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
16a00 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
16a10 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16a20 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
16a30 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
16a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16a50 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
16a60 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
16a70 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
16a80 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
16a90 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
16aa0 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
16ab0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
16ac0 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16ad0 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
16ae0 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
16af0 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
16b00 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16b10 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
16b20 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
16b30 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
16b40 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
16b50 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
16b60 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
16b70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
16b80 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
16b90 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
16ba0 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
16bb0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
16bc0 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
16bd0 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
16be0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
16bf0 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
16c00 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
16c30 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
16c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c70 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
16c80 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
16c90 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
16ca0 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
16cb0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
16cc0 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
16cd0 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
16ce0 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
16cf0 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
16d00 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
16d10 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
16d20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
16d30 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
16d40 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
16d50 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
16d60 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
16d70 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
16d80 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
16d90 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
16da0 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
16db0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
16dc0 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
16dd0 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
16de0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
16df0 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
16e00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16e20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
16e30 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
16e40 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
16e50 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
16e60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16e70 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
16e80 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
16e90 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
16ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16eb0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
16ec0 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
16ed0 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
16ee0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
16ef0 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
16f00 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
16f10 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
16f20 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
16f30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
16f40 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
16f50 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
16f60 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
16f70 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
16f80 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
16f90 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
16fa0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
16fb0 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74  s modified (rest
16fc0 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74  ored).** as part
16fd0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
16fe0 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  n or savepoint r
16ff0 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c  ollback. The cal
17000 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20  lback gives .** 
17010 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
17020 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
17030 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
17040 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
17050 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20   .** agree with 
17060 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61 67  the restored pag
17070 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
17080 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
17090 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
170a0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
170b0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29  einit)(DbPage*))
170c0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
170d0 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
170e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
170f0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 75   the page size u
17100 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65 72  sed by the Pager
17110 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65 77   object. The new
17120 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20 69   page size .** i
17130 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50 61  s passed in *pPa
17140 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  geSize..**.** If
17150 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
17160 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
17170 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17180 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
17190 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  t.** is a no-op.
171a0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
171b0 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f 72  ned is the error
171c0 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
171d0 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65 20  e (i.e. .** one 
171e0 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  of SQLITE_IOERR,
171f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
17200 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 2e  or SQLITE_FULL).
17210 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
17220 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  , if all of the 
17230 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
17240 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68  ue:.**.**   * th
17250 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  e new page size 
17260 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67 65  (value of *pPage
17270 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20 28  Size) is valid (
17280 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20 20  a power .**     
17290 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20 35  of two between 5
172a0 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d 41  12 and SQLITE_MA
172b0 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e 63  X_PAGE_SIZE, inc
172c0 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a 0a  lusive), and.**.
172d0 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72 65  **   * there are
172e0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
172f0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 2c  page references,
17300 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
17310 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
17320 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e 2d  ither not an in-
17330 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
17340 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20 20  or it is.**     
17350 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
17360 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72 65  abase that curre
17370 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f 66  ntly consists of
17380 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a 0a   zero pages..**.
17390 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  ** then the page
173a0 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73 69  r object page si
173b0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70 50  ze is set to *pP
173c0 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
173d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
173e0 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65 6e  is changed, then
173f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
17400 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ses sqlite3Pager
17410 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f 20  Malloc() .** to 
17420 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61 67  obtain a new Pag
17430 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66  er.pTmpSpace buf
17440 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c 6c  fer. If this all
17450 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
17460 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
17470 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
17480 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
17490 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75 6e   size remains un
174a0 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e 20  changed. .** In 
174b0 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73 2c  all other cases,
174c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
174d0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
174e0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
174f0 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20 65  s not changed, e
17500 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f 6e  ither because on
17510 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72 61  e of the enumera
17520 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  ted.** condition
17530 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 74  s above is not t
17540 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  rue, the pager w
17550 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  as in error stat
17560 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 66  e when this.** f
17570 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
17580 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20 74  ed, or because t
17590 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
175a0 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61 69  tion attempt fai
175b0 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a 70  led, .** then *p
175c0 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74 20  PageSize is set 
175d0 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74 61  to the old, reta
175e0 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20 62  ined page size b
175f0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
17600 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17610 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
17620 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
17630 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a  16 *pPageSize){.
17640 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
17650 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
17660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17670 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
17680 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
17690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
176a0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
176b0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
176c0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
176d0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
176e0 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
176f0 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
17700 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17710 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
17720 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
17730 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
17740 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
17750 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
17760 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
17770 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
17780 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
17790 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
177a0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
177b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
177c0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
177d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
177e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
177f0 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
17800 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
17810 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
17820 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
17830 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17840 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
17850 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
17860 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
17870 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
17880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
17890 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
178a0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
178b0 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
178c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
178d0 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
178e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
178f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
17910 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
17920 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
17930 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
17940 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
17950 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
17960 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
17970 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
17980 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
17990 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
179a0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
179b0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
179c0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
179d0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
179e0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
179f0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
17a00 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
17a10 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
17a20 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
17a30 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
17a40 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
17a50 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
17a60 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
17a70 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
17a80 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
17a90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
17aa0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
17ab0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
17ac0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
17ad0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
17ae0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
17af0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
17b00 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
17b10 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
17b20 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
17b30 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
17b40 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
17b50 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
17b60 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
17b70 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
17b80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
17b90 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
17ba0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
17bb0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
17bc0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
17bd0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
17be0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
17bf0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
17c00 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
17c10 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
17c20 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
17c30 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
17c40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
17c50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17c60 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
17c70 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
17c80 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
17c90 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
17ca0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
17cb0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
17cc0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
17cd0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
17ce0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
17cf0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
17d00 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
17d10 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
17d20 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
17d30 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
17d40 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
17d50 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
17d60 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
17d70 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
17d80 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
17d90 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
17da0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
17db0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
17dc0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17dd0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
17de0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17df0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
17e00 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
17e10 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
17e20 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
17e30 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
17e40 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
17e50 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
17e60 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
17e70 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
17e80 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
17e90 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
17ea0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
17eb0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
17ec0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
17ed0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
17ee0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
17ef0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
17f00 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
17f10 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
17f20 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
17f30 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
17f40 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
17f50 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
17f60 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
17f70 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
17f80 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
17f90 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  s to. .**.** If 
17fa0 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f 70  the pager was op
17fb0 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73 69  ened on a transi
17fc0 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65 6e  ent file (zFilen
17fd0 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a 20  ame==""), or.** 
17fe0 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c 65  opened on a file
17ff0 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79 74   less than N byt
18000 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 20  es in size, the 
18010 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
18020 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20 53  .** zeroed and S
18030 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
18040 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 65  d. The rationale
18050 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
18060 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  t this .** funct
18070 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
18080 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65 61  ead database hea
18090 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77 20  ders, and a new 
180a0 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a 20  transient or.** 
180b0 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61 62  zero sized datab
180c0 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65 72  ase has a header
180d0 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20 65   than consists e
180e0 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f 65  ntirely of zeroe
180f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  s..**.** If any 
18100 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20 66  IO error apart f
18110 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  rom SQLITE_IOERR
18120 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20 65  _SHORT_READ is e
18130 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20 74  ncountered,.** t
18140 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
18150 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
18160 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65 20   caller and the 
18170 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
18180 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
18190 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69   undefined..*/.i
181a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
181b0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61  eadFileheader(Pa
181c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
181d0 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
181e0 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74  r *pDest){.  int
181f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18200 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c  .  memset(pDest,
18210 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74   0, N);.  assert
18220 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18230 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
18240 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69 66  tempFile );.  if
18250 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
18260 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54 52  >fd) ){.    IOTR
18270 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
18280 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
18290 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
182a0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
182b0 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c  r->fd, pDest, N,
182c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
182d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
182e0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
182f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
18300 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
18310 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18320 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
18330 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
18340 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
18350 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
18360 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61 67  ed .** with pPag
18370 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68  er. Normally, th
18380 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  is is calculated
18390 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73 69   as (<db file si
183a0 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29  ze>/<page-size>)
183b0 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69 66  ..** However, if
183c0 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65 74   the file is bet
183d0 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67 65  ween 1 and <page
183e0 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e 20  -size> bytes in 
183f0 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  size, then .** t
18400 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72 65  his is considere
18410 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65 2e  d a 1 page file.
18420 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
18430 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 20  ger is in error 
18440 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20  state when this 
18450 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18460 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
18470 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
18480 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
18490 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c  ed and *pnPage l
184a0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f  eft unchanged. O
184b0 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69 6c  r,.** if the fil
184c0 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f 20  e system has to 
184d0 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20 74  be queried for t
184e0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
184f0 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71  ile and.** the q
18500 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65 74  uery attempt ret
18510 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f 72  urns an IO error
18520 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63  , the IO error c
18530 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
18540 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69  ** and *pnPage i
18550 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
18560 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
18570 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
18580 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
18590 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  then SQLITE_OK i
185a0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
185b0 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65 74  d *pnPage is set
185c0 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
185d0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
185e0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
185f0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
18600 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
18610 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
18620 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b  ){.  Pgno nPage;
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18640 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
18650 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f  n via *pnPage */
18660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
18670 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
18680 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
18690 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
186a0 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 69  ror code. */.  i
186b0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
186c0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
186d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
186e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 65  ;.  }..  /* Dete
186f0 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72  rmine the number
18700 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18710 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68 69   file. Store thi
18720 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a 20  s in nPage. */. 
18730 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
18740 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  izeValid ){.    
18750 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
18760 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b  dbSize;.  }else{
18770 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20  .    int rc;    
18780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18790 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 62  Error returned b
187a0 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a  y OsFileSize() *
187b0 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30 3b  /.    i64 n = 0;
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
187d0 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62 79   File size in by
187e0 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  tes returned by 
187f0 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a  OsFileSize() */.
18800 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
18810 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18820 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18830 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 69  ile );.    if( i
18840 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
18850 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d  ) && (0 != (rc =
18860 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
18870 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
18880 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70 61  n))) ){.      pa
18890 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
188a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
188b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
188c0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
188d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
188e0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
188f0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
18900 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67       nPage = (Pg
18910 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e  no)(n / pPager->
18920 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
18930 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18940 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
18950 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
18960 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
18970 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61 67  Page;.      pPag
18980 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d  er->dbFileSize =
18990 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50   nPage;.      pP
189a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
189b0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
189c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
189d0 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrent number of 
189e0 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c  pages in the fil
189f0 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  e is greater tha
18a00 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e 66  n the .  ** conf
18a10 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20 70  igured maximum p
18a20 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e 63  ager number, inc
18a30 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77 65  rease the allowe
18a40 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a 20  d limit so.  ** 
18a50 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63 61  that the file ca
18a60 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f 0a  n be read..  */.
18a70 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61 67    if( nPage>pPag
18a80 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20  er->mxPgno ){.  
18a90 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
18aa0 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b 0a   = (Pgno)nPage;.
18ab0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
18ac0 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
18ad0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
18ae0 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28 20  ITE_OK */.  if( 
18af0 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  pnPage ){.    *p
18b00 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
18b10 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18b20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
18b30 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
18b40 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c 6f   lock of type lo
18b50 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64 61  cktype on the da
18b60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a  tabase file. If.
18b70 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72 20  ** a similar or 
18b80 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73 20  greater lock is 
18b90 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74 68  already held, th
18ba0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
18bb0 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75 72   no-op.** (retur
18bc0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ning SQLITE_OK i
18bd0 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a 0a  mmediately)..**.
18be0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  ** Otherwise, at
18bf0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
18c00 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 73  the lock using s
18c10 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e 20  qlite3OsLock(). 
18c20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20 62  Invoke .** the b
18c30 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
18c40 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72 72  the lock is curr
18c50 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
18c60 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a 20  ble. Repeat .** 
18c70 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
18c80 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
18c90 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
18ca0 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a 2a  he attempt to .*
18cb0 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  * obtain the loc
18cc0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
18cd0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18ce0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
18cf0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
18d00 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
18d10 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
18d20 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
18d30 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73 73  obtained success
18d40 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20 50  fully, set the P
18d50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20 76  ager.state .** v
18d60 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 74  ariable to lockt
18d70 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ype before retur
18d80 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
18d90 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
18da0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
18db0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
18dc0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  pe){.  int rc;  
18dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18df0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
18e00 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
18e10 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
18e20 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
18e30 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
18e40 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
18e50 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
18e60 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
18e70 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
18e80 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
18e90 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18ea0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
18eb0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18ec0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18ed0 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
18ee0 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
18ef0 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
18f00 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
18f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18f20 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
18f30 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
18f40 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a  izeValid==0 );..
18f50 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
18f60 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20 61  this is either a
18f70 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65 20   no-op (because 
18f80 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
18f90 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72 65  ck is .  ** alre
18fa0 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e 65  ady held, or one
18fb0 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73 74   of the transist
18fc0 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62 75  ions that the bu
18fd0 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20  sy-handler.  ** 
18fe0 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20 64  may be invoked d
18ff0 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e 67  uring, according
19000 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20   to the comment 
19010 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69 74  above.  ** sqlit
19020 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
19030 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ndler()..  */.  
19040 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
19050 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
19060 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61  ).       || (pPa
19070 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19080 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63 6b  R_UNLOCK && lock
19090 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  type==PAGER_SHAR
190a0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  ED).       || (p
190b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
190c0 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26 20  GER_RESERVED && 
190d0 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
190e0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b 0a  EXCLUSIVE).  );.
190f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19100 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
19110 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19120 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
19130 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
19140 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
19150 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
19160 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
19170 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
19180 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
19190 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
191a0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
191b0 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
191c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
191d0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
191e0 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
191f0 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
19200 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
19210 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
19220 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
19230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19240 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
19250 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  the in-memory da
19260 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67  tabase file imag
19270 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  e to nPage pages
19280 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
19290 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74  ion does not act
192a0 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65  ually modify the
192b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
192c0 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a  n disk. It .** j
192d0 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e 74  ust sets the int
192e0 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74  ernal state of t
192f0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
19300 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  so that the .** 
19310 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20  truncation will 
19320 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65  be done when the
19330 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
19340 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
19350 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
19360 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
19370 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  mage(Pager *pPag
19380 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
19390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
193a0 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
193b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
193c0 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67  er->dbSize>=nPag
193d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
193e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
193f0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
19400 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
19410 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a   = nPage;.}../*.
19420 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20  ** Shutdown the 
19430 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72 65  page cache.  Fre
19440 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64  e all memory and
19450 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73   close all files
19460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
19470 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20  nsaction was in 
19480 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68  progress when th
19490 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
194a0 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72  lled, that.** tr
194b0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
194c0 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f  led back.  All o
194d0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
194e0 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
194f0 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65  .** and their me
19500 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20 20  mory is freed.  
19510 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
19520 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63 69  se a page associ
19530 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69  ated.** with thi
19540 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66 74  s page cache aft
19550 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
19560 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69   returns will li
19570 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69  kely.** result i
19580 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a  n a coredump..**
19590 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
195a0 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  n always succeed
195b0 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  s. If a transact
195c0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
195d0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d   attempt.** is m
195e0 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62  ade to roll it b
195f0 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ack. If an error
19600 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
19610 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20  he rollback .** 
19620 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61  a hot journal ma
19630 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  y be left in the
19640 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20   filesystem but 
19650 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  no error is retu
19660 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63  rned.** to the c
19670 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  aller..*/.int sq
19680 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
19690 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
196a0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
196b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
196c0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
196d0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
196e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
196f0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19700 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
19710 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
19720 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
19730 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
19740 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
19750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19760 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f 75  /* Set Pager.jou
19770 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f  rnalHdr to -1 fo
19780 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f 66  r the benefit of
19790 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
197a0 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ack() .    ** ca
197b0 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  ll which may be 
197c0 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  made from within
197d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
197e0 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69 74  ollback(). If it
197f0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d  .    ** is not -
19800 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73 79  1, then the unsy
19810 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  nced portion of 
19820 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  an open journal 
19830 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  file may.    ** 
19840 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  be played back i
19850 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
19860 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69  . If a power fai
19870 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
19880 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
19890 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65 20   happening, the 
198a0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 63  database may bec
198b0 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20  ome corrupt..   
198c0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
198d0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b  journalHdr = -1;
198e0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
198f0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
19900 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
19910 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
19920 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  c();.  enable_si
19930 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
19940 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
19950 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E(("CLOSE %d\n",
19960 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19970 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
19980 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
19990 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33 4f  ger)).  sqlite3O
199a0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
199b0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  d);.  sqlite3Pag
199c0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
199d0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
199e0 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70  te3PcacheClose(p
199f0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
19a00 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
19a10 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20  ger->aSavepoint 
19a20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a  && !pPager->pInJ
19a30 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
19a40 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  rt( !isOpen(pPag
19a50 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73 4f  er->jfd) && !isO
19a60 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
19a70 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ) );..  sqlite3_
19a80 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  free(pPager);.  
19a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19aa0 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
19ab0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
19ac0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
19ad0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
19ae0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
19af0 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
19b00 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
19b10 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
19b20 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
19b30 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a  rn pPg->pgno;.}.
19b40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
19b50 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
19b60 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
19b70 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f 69  page pPg..*/.voi
19b80 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  d sqlite3PagerRe
19b90 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
19ba0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
19bb0 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ef(pPg);.}../*.*
19bc0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
19bd0 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  al. In other wor
19be0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
19bf0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
19c00 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
19c10 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
19c20 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
19c30 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
19c40 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
19c50 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62 65   disk and can be
19c60 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68 65   restored in the
19c70 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74 2d   event of a hot-
19c80 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
19c90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
19ca0 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
19cb0 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20 74  ag is not set, t
19cc0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
19cd0 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e  n is a.** no-op.
19ce0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
19cf0 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65 64  actions required
19d00 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20 6a   depend on the j
19d10 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20 61  ournal-mode.** a
19d20 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63 68  nd the device ch
19d30 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f 66  aracteristics of
19d40 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73 79   the the file-sy
19d50 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77 73  stem, as follows
19d60 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  :.**.**   * If t
19d70 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19d80 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
19d90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e 6f  journal file, no
19da0 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a 20   action need.** 
19db0 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a 2a      be taken..**
19dc0 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69 73  .**   * Otherwis
19dd0 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63 65  e, if the device
19de0 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72   does not suppor
19df0 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45 4e  t the SAFE_APPEN
19e00 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20 20  D property,.**  
19e10 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63     then the nRec
19e20 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f   field of the mo
19e30 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74  st recently writ
19e40 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ten journal head
19e50 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70 64  er.**     is upd
19e60 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ated to contain 
19e70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a 6f  the number of jo
19e80 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74 68  urnal records th
19e90 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 62  at have.**     b
19ea0 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c 6c  een written foll
19eb0 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68 65  owing it. If the
19ec0 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61 74   pager is operat
19ed0 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63  ing in full-sync
19ee0 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74 68  .**     mode, th
19ef0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
19f00 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62 65  ile is synced be
19f10 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64 20  fore this field 
19f20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  is updated..**.*
19f30 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65 76  *   * If the dev
19f40 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
19f50 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e 54  port the SEQUENT
19f60 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74 68  IAL property, th
19f70 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e  en .**     journ
19f80 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
19f90 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e 20  d..**.** Or, in 
19fa0 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a  pseudo-code:.**.
19fb0 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69 6e  **   if( NOT <in
19fc0 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 3e  -memory journal>
19fd0 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   ){.**     if( N
19fe0 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20 29  OT SAFE_APPEND )
19ff0 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20 3c  {.**       if( <
1a000 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e 20  full-sync mode> 
1a010 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a020 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20 20   file>);.**     
1a030 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20 66    <update nRec f
1a040 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20 0a  ield>.**     } .
1a050 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53  **     if( NOT S
1a060 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79 6e  EQUENTIAL ) xSyn
1a070 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e  c(<journal file>
1a080 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  );.**   }.**.** 
1a090 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  The Pager.needSy
1a0a0 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65 72  nc flag is never
1a0b0 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d 70   be set for temp
1a0c0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72 20  orary files, or 
1a0d0 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 72  any.** file oper
1a0e0 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  ating in no-sync
1a0f0 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f 53   mode (Pager.noS
1a100 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a  ync set to non-z
1a110 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ero)..**.** If s
1a120 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
1a130 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
1a140 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
1a150 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72 79  NC flag of every
1a160 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65 6e   .** page curren
1a170 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f  tly held in memo
1a180 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ry before return
1a190 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  ing SQLITE_OK. I
1a1a0 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  f an IO.** error
1a1b0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1a1c0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
1a1d0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1a1e0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
1a1f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a200 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
1a210 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1a220 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
1a230 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ync ){.    asser
1a240 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
1a250 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
1a260 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1a270 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
1a280 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
1a290 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20 20  .      int rc;  
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1a2c0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1a2d0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44      const int iD
1a2e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1a2f0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1a300 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1a310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1a320 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
1a330 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ) );..      if( 
1a340 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1a350 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1a360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1a370 56 61 72 69 61 62 6c 65 20 69 4e 52 65 63 4f 66  Variable iNRecOf
1a380 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
1a390 68 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  he offset in the
1a3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
1a3b0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
1a3c0 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
1a3d0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1a3e0 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
1a3f0 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20  header..        
1a400 2a 2a 20 54 68 69 73 20 66 69 65 6c 64 20 77 69  ** This field wi
1a410 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  ll be updated fo
1a420 6c 6c 6f 77 69 6e 67 20 74 68 65 20 78 53 79 6e  llowing the xSyn
1a430 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20 20  c() operation.  
1a440 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1a450 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
1a460 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 52  .        i64 iNR
1a470 65 63 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  ecOffset = pPage
1a480 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
1a490 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1a4a0 61 67 69 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  agic);..        
1a4b0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1a4c0 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1a4d0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1a4e0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1a4f0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1a500 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1a510 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1a520 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1a530 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1a540 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1a550 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1a560 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1a570 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1a580 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1a590 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1a5a0 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1a5b0 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1a5c0 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1a5d0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1a5e0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1a5f0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1a600 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1a610 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1a620 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1a630 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
1a640 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
1a650 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
1a660 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
1a670 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
1a680 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
1a690 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
1a6a0 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
1a6b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
1a6c0 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
1a6d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1a6e0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
1a6f0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
1a700 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a710 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
1a720 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
1a730 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
1a740 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
1a750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1a760 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
1a770 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
1a780 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
1a790 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
1a7a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
1a7b0 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
1a7c0 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
1a7d0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
1a7e0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
1a7f0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1a800 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
1a810 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1a820 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1a830 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1a840 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
1a850 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
1a860 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
1a870 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
1a880 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
1a890 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
1a8a0 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
1a8b0 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
1a8c0 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
1a8d0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
1a8e0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
1a8f0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
1a900 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1a910 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 69     ** Variable i
1a920 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69 73  NextHdrOffset is
1a930 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
1a940 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69 73  et at which this
1a950 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
1a960 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20 77  lematic header w
1a970 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69 74  ill occur, if it
1a980 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63 20   exists. aMagic 
1a990 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20 20  is used .       
1a9a0 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72 61   ** as a tempora
1a9b0 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e 73  ry buffer to ins
1a9c0 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20 63  pect the first c
1a9d0 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20 6f  ouple of bytes o
1a9e0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
1a9f0 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72 6e   potential journ
1aa00 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20  al header..     
1aa10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
1aa20 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  4 iNextHdrOffset
1aa30 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
1aa40 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
1aa50 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b 38       u8 aMagic[8
1aa60 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ];.        rc = 
1aa70 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
1aa80 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
1aa90 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f 66  c, 8, iNextHdrOf
1aaa0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 69  fset);.        i
1aab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1aac0 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61 4d   && 0==memcmp(aM
1aad0 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
1aae0 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20  gic, 8) ){.     
1aaf0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1ab00 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20  t u8 zerobyte = 
1ab10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
1ab20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1ab30 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a  (pPager->jfd, &z
1ab40 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65 78  erobyte, 1, iNex
1ab50 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1ab60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ab70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ab80 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
1ab90 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
1aba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1abb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1abc0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  }..        /* Wr
1abd0 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
1abe0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
1abf0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
1ac00 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
1ac10 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
1ac20 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
1ac30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
1ac40 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
1ac50 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
1ac60 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
1ac70 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
1ac80 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
1ac90 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
1aca0 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
1acb0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
1acc0 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
1acd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
1ace0 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1acf0 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
1ad00 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
1ad10 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
1ad20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
1ad30 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
1ad40 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
1ad50 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1ad60 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
1ad70 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
1ad80 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
1ad90 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
1ada0 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
1adb0 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
1adc0 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
1add0 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
1ade0 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
1adf0 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
1ae00 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
1ae10 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
1ae20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1ae30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
1ae40 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44  llSync && 0==(iD
1ae50 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1ae60 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1ae70 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1ae80 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1ae90 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1aea0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1aeb0 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45           IOTRACE
1aec0 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
1aed0 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
1aee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1aef0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
1af00 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1af10 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20  flags);.        
1af20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1af30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1af40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1af50 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44     IOTRACE(("JHD
1af60 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  R %p %lld %d\n",
1af70 20 70 50 61 67 65 72 2c 20 69 4e 52 65 63 4f 66   pPager, iNRecOf
1af80 66 73 65 74 2c 20 34 29 29 3b 0a 20 20 20 20 20  fset, 4));.     
1af90 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1afa0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
1afb0 20 69 4e 52 65 63 4f 66 66 73 65 74 2c 20 70 50   iNRecOffset, pP
1afc0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
1afd0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1afe0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1aff0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1b000 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1b010 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1b020 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
1b030 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1b040 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
1b050 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1b060 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
1b070 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1b080 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1b090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1b0a0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1b0b0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b0c0 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
1b0d0 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1b0e0 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
1b0f0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
1b100 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1b110 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
1b120 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b140 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b150 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1b160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
1b170 61 73 20 6a 75 73 74 20 73 75 63 63 65 73 73 66  as just successf
1b180 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74  ully synced. Set
1b190 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
1b1a0 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20  .    ** to zero 
1b1b0 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 50 47  and clear the PG
1b1c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1b1d0 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73  ag on all pagess
1b1e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1b1f0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
1b200 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
1b210 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1b220 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  1;.    sqlite3Pc
1b230 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61  acheClearSyncFla
1b240 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  gs(pPager->pPCac
1b250 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  he);.  }..  retu
1b260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b270 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  ./*.** The argum
1b280 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74  ent is the first
1b290 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   in a linked lis
1b2a0 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65 73  t of dirty pages
1b2b0 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79   connected.** by
1b2c0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
1b2d0 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20  y pointer. This 
1b2e0 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20  function writes 
1b2f0 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a  each one of the.
1b300 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ** in-memory pag
1b310 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74  es in the list t
1b320 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b330 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ile. The argumen
1b340 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c  t may.** be NULL
1b350 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  , representing a
1b360 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e  n empty list. In
1b370 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
1b380 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61  function is.** a
1b390 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68   no-op..**.** Th
1b3a0 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c  e pager must hol
1b3b0 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53  d at least a RES
1b3c0 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20  ERVED lock when 
1b3d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
1b3e0 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f   is called. Befo
1b3f0 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68  re writing anyth
1b400 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1b410 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c  ase file, this l
1b420 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64  ock.** is upgrad
1b430 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ed to an EXCLUSI
1b440 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20  VE lock. If the 
1b450 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f  lock cannot be o
1b460 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49  btained,.** SQLI
1b470 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
1b480 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20  ned and no data 
1b490 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  is written to th
1b4a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b4b0 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70  .** .** If the p
1b4c0 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66  ager is a temp-f
1b4d0 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74 68  ile pager and th
1b4e0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79  e actual file-sy
1b4f0 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20  stem file.** is 
1b500 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74  not yet open, it
1b510 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
1b520 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e  opened before an
1b530 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72  y data is .** wr
1b540 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a  itten out..**.**
1b550 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68   Once the lock h
1b560 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65 64  as been upgraded
1b570 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61   and, if necessa
1b580 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65  ry, the file ope
1b590 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ned,.** the page
1b5a0 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75  s are written ou
1b5b0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1b5c0 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f  e file in list o
1b5d0 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a  rder. Writing.**
1b5e0 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70 70   a page is skipp
1b5f0 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20 65  ed if it meets e
1b600 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c  ither of the fol
1b610 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a  lowing criteria:
1b620 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70  .**.**   * The p
1b630 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72  age number is gr
1b640 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65 72  eater than Pager
1b650 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20  .dbSize, or.**  
1b660 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e   * The PGHDR_DON
1b670 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73 20  T_WRITE flag is 
1b680 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  set on the page.
1b690 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e  .**.** If writin
1b6a0 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61 75  g out a page cau
1b6b0 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
1b6c0 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50   file to grow, P
1b6d0 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a  ager.dbFileSize.
1b6e0 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61 63  ** is updated ac
1b6f0 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61  cordingly. If pa
1b700 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e 20  ge 1 is written 
1b710 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61  out, then the va
1b720 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e  lue cached.** in
1b730 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1b740 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20 74  s[] is updated t
1b750 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  o match the new 
1b760 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
1b770 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1b780 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65  file..**.** If e
1b790 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
1b7a0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
1b7b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1b7c0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a  If an IO error .
1b7d0 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  ** occurs, an IO
1b7e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1b7f0 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20  eturned. Or, if 
1b800 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  the EXCLUSIVE lo
1b810 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20  ck cannot.** be 
1b820 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45  obtained, SQLITE
1b830 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1b840 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b850 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1b860 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
1b870 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
1b880 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
1b890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1b8a0 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
1b8b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1b8e0 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70  code */..  if( p
1b8f0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1b900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
1b910 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
1b920 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
1b930 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
1b940 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
1b950 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
1b960 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1b970 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
1b980 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
1b990 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
1b9a0 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
1b9b0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
1b9c0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
1b9d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
1b9e0 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
1b9f0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
1ba00 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
1ba10 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
1ba20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
1ba30 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
1ba40 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
1ba50 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
1ba60 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
1ba70 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
1ba80 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
1ba90 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
1baa0 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
1bab0 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
1bac0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
1bad0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
1bae0 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
1baf0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
1bb00 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
1bb10 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
1bb20 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
1bb30 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
1bb40 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
1bb50 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
1bb60 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
1bb70 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
1bb80 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
1bb90 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
1bba0 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
1bbb0 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
1bbc0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
1bbd0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
1bbe0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1bbf0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
1bc00 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
1bc10 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
1bc20 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1bc30 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
1bc40 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
1bc50 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
1bc60 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
1bc70 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
1bc80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1bc90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1bca0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1bcb0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
1bcc0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1bcd0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
1bce0 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  K);..  /* If the
1bcf0 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70 2d   file is a temp-
1bd00 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
1bd10 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
1bd20 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20 20  en it now. It.  
1bd30 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
1bd40 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65 20  le for rc to be 
1bd50 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1bd60 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72 61  E_OK if this bra
1bd70 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b 65  nch.  ** is take
1bd80 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69 74  n, as pager_wait
1bd90 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61 20  _on_lock() is a 
1bda0 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d 66  no-op for temp-f
1bdb0 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  iles..  */.  if(
1bdc0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
1bdd0 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  >fd) ){.    asse
1bde0 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  rt( pPager->temp
1bdf0 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  File && rc==SQLI
1be00 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63 20  TE_OK );.    rc 
1be10 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  = pagerOpentemp(
1be20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
1be30 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46  fd, pPager->vfsF
1be40 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77 68  lags);.  }..  wh
1be50 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1be60 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20  OK && pList ){. 
1be70 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
1be80 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 20  List->pgno;..   
1be90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1bea0 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
1beb0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
1bec0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
1bed0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
1bee0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
1bef0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
1bf00 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
1bf10 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61  teImage() was ca
1bf20 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
1bf30 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
1bf40 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
1bf50 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
1bf60 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
1bf70 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
1bf80 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
1bf90 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
1bfa0 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e 6f    ** Also, do no
1bfb0 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79 20  t write out any 
1bfc0 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74 68  page that has th
1bfd0 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1bfe0 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20 73  TE flag.    ** s
1bff0 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69 74  et (set by sqlit
1c000 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1c010 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ())..    */.    
1c020 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65 72  if( pgno<=pPager
1c030 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28  ->dbSize && 0==(
1c040 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48  pList->flags&PGH
1c050 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29  DR_DONT_WRITE) )
1c060 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73  {.      i64 offs
1c070 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1c080 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1c090 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
1c0a0 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c0b0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c0c0 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
1c0d0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c0e0 74 61 2c 20 70 67 6e 6f 2c 20 36 29 3b 20 2f 2a  ta, pgno, 6); /*
1c0f0 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20 2a   Data to write *
1c100 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  /..      /* Writ
1c110 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20 64  e out the page d
1c120 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63  ata. */.      rc
1c130 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1c140 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  e(pPager->fd, pD
1c150 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
1c160 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
1c170 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61 67  .      /* If pag
1c180 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72 69  e 1 was just wri
1c190 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61 67  tten, update Pag
1c1a0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74 6f  er.dbFileVers to
1c1b0 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20   match.      ** 
1c1c0 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73 74  the value now st
1c1d0 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
1c1e0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77 72  base file. If wr
1c1f0 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20 20  iting this .    
1c200 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65 64    ** page caused
1c210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c220 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64 61  le to grow, upda
1c230 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20 0a  te dbFileSize. .
1c240 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1c250 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
1c260 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
1c270 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1c280 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
1c290 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
1c2a0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
1c2b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e   }.      if( pgn
1c2c0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
1c2d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1c2e0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
1c2f0 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20  ze = pgno;.     
1c300 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   }..      /* Upd
1c310 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20 6f  ate any backup o
1c320 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20 74  bjects copying t
1c330 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1c340 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20 20  his pager. */.  
1c350 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75      sqlite3Backu
1c360 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e  pUpdate(pPager->
1c370 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28  pBackup, pgno, (
1c380 75 38 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20 20  u8 *)pData);..  
1c390 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1c3a0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
1c3b0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c3d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1c3e0 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
1c3f0 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1c400 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1c410 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
1c420 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1c430 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  ));.      PAGER_
1c440 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1c450 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
1c460 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
1c470 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
1c480 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  te);.    }else{.
1c490 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1c4a0 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  (("NOSTORE %d pa
1c4b0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1c4c0 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
1c4d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
1c4e0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1c4f0 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61  ES.    pList->pa
1c500 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1c510 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a  agehash(pList);.
1c520 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74  #endif.    pList
1c530 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
1c540 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  rc;.}../*.** App
1c560 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20  end a record of 
1c570 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1c580 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f  e of page pPg to
1c590 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c5a0 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20  . .** It is the 
1c5b0 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
1c5c0 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75  bility to use su
1c5d0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
1c5e0 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68   to check .** th
1c5f0 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20  at it is really 
1c600 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1c610 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1c620 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
1c630 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20  successful, set 
1c640 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  the bit correspo
1c650 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67  nding to pPg->pg
1c660 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  no in the bitvec
1c670 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65  s.** for all ope
1c680 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66  n savepoints bef
1c690 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c6a0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c6b0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
1c6c0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1c6d0 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
1c6e0 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72  , an IO.** error
1c6f0 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74 74   code if the att
1c700 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
1c710 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
1c720 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53   fails, or .** S
1c730 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61  QLITE_NOMEM if a
1c740 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68   malloc fails wh
1c750 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62 69  ile setting a bi
1c760 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74  t in a savepoint
1c770 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73  .** bitvec..*/.s
1c780 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75  tatic int subjou
1c790 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a  rnalPage(PgHdr *
1c7a0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
1c7b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1c7c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1c7d0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
1c7e0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1c7f0 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69  sjfd) ){.    voi
1c800 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
1c810 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f  pData;.    i64 o
1c820 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
1c830 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
1c840 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1c850 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1c860 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1c870 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1c880 2c 20 37 29 3b 0a 20 20 0a 20 20 20 20 50 41 47  , 7);.  .    PAG
1c890 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d 4a  ERTRACE(("STMT-J
1c8a0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1c8b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1c8c0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1c8d0 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65 72  ));.  .    asser
1c8e0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1c8f0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
1c900 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
1c910 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63 20  gSize );.    rc 
1c920 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1c930 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66 73  ager->sjfd, offs
1c940 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  et, pPg->pgno);.
1c950 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c970 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c980 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  te(pPager->sjfd,
1c990 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c9a0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c9b0 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t+4);.    }.  }.
1c9c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c9d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
1c9e0 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20  r->nSubRec++;.  
1c9f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ca00 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29  ->nSavepoint>0 )
1ca10 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f  ;.    rc = addTo
1ca20 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1ca30 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1ca40 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  no);.    testcas
1ca50 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
1ca60 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
1ca70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1ca80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1ca90 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63  called by the pc
1caa0 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20  ache layer when 
1cab0 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73  it has reached s
1cac0 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f  ome.** soft memo
1cad0 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69  ry limit. The fi
1cae0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1caf0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50  a pointer to a P
1cb00 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28  ager object.** (
1cb10 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29  cast as a void*)
1cb20 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61  . The pager is a
1cb30 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65  lways 'purgeable
1cb40 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d  ' (not an in-mem
1cb50 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29  ory.** database)
1cb60 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
1cb70 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72  ument is a refer
1cb80 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74  ence to a page t
1cb90 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65  hat is .** curre
1cba0 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68  ntly dirty but h
1cbb0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
1cbc0 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68  g references. Th
1cbd0 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77  e page.** is alw
1cbe0 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ays associated w
1cbf0 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62  ith the Pager ob
1cc00 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
1cc10 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67  he first .** arg
1cc20 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ument..**.** The
1cc30 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e   job of this fun
1cc40 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65  ction is to make
1cc50 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72   pPg clean by wr
1cc60 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e  iting its conten
1cc70 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65  ts.** out to the
1cc80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1cc90 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69  if possible. Thi
1cca0 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79  s may involve sy
1ccb0 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75  ncing the.** jou
1ccc0 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  rnal file. .**.*
1ccd0 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1cce0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1ccf0 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c  keClean() is cal
1cd00 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20  led on the page 
1cd10 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1cd20 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1cd30 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
1cd40 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
1cd50 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67   make the.** pag
1cd60 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20  e clean, the IO 
1cd70 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1cd80 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70  turned. If the p
1cd90 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  age cannot be.**
1cda0 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20   made clean for 
1cdb0 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f  some other reaso
1cdc0 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  n, but no error 
1cdd0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
1cde0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
1cdf0 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
1ce00 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
1ce10 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e  ) is not called.
1ce20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1ce30 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
1ce40 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  *p, PgHdr *pPg){
1ce50 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ce60 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20   = (Pager *)p;. 
1ce70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ce80 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
1ce90 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61  pPg->pPager==pPa
1cea0 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ger );.  assert(
1ceb0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1cec0 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f 2a  R_DIRTY );..  /*
1ced0 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   The doNotSync f
1cee0 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74 68  lag is set by th
1cef0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  e sqlite3PagerWr
1cf00 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 77  ite() function w
1cf10 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73 20  hile it.  ** is 
1cf20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65  journalling a se
1cf30 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  t of two or more
1cf40 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20   database pages 
1cf50 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a  that are stored.
1cf60 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65    ** on the same
1cf70 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79   disk sector. Sy
1cf80 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ncing the journa
1cf90 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  l is not allowed
1cfa0 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69 73   while.  ** this
1cfb0 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 73   is happening as
1cfc0 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
1cfd0 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65 72   that all member
1cfe0 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a 2a  s of such a.  **
1cff0 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61 72   set of pages ar
1d000 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
1d010 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20 69   together. So, i
1d020 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73 20  f the page this 
1d030 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
1d040 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65 20   trying to make 
1d050 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75 69  clean will requi
1d060 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e  re a journal syn
1d070 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74 53  c and the doNotS
1d080 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69 73  ync.  ** flag is
1d090 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69 74   set, return wit
1d0a0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
1d0b0 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65 20  ing. The pcache 
1d0c0 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a 20  layer will.  ** 
1d0d0 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f 20  just have to go 
1d0e0 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63 61  ahead and alloca
1d0f0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62 75  te a new page bu
1d100 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66 0a  ffer instead of.
1d110 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50 67    ** reusing pPg
1d120 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69  ..  **.  ** Simi
1d130 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61  larly, if the pa
1d140 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
1d150 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
1d160 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a  r state, do not.
1d170 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69 74    ** try to writ
1d180 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
1d190 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a 20  f pPg to disk.. 
1d1a0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
1d1b0 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
1d1c0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1d1d0 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  && pPg->flags&PG
1d1e0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 29  HDR_NEED_SYNC) )
1d1f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d200 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1d210 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
1d220 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75 69  al file if requi
1d230 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  red. */.  if( pP
1d240 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d250 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
1d260 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1d270 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1d280 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d290 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  && pPager->fullS
1d2a0 79 6e 63 20 26 26 20 0a 20 20 20 20 20 20 21 28  ync && .      !(
1d2b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
1d2c0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
1d2d0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26  ALMODE_MEMORY) &
1d2e0 26 0a 20 20 20 20 20 20 21 28 73 71 6c 69 74 65  &.      !(sqlite
1d2f0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1d300 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1d310 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
1d320 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20  P_SAFE_APPEND). 
1d330 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67     ){.      pPag
1d340 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
1d350 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
1d360 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1d370 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d380 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
1d390 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61 67  mber of this pag
1d3a0 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
1d3b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1d3c0 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64 61  e of.  ** the da
1d3d0 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 74  tabase image, it
1d3e0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
1d3f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1d400 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a  ub-journal..  **
1d410 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1d420 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61 67   the call to pag
1d430 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1d440 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  t() below will n
1d450 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  ot.  ** actually
1d460 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20 74   write data to t
1d470 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20  he file in this 
1d480 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
1d490 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
1d4a0 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
1d4b0 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a  of events:.  **.
1d4c0 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
1d4d0 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
1d4e0 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20  page X>.  **    
1d4f0 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58 3e   <modify page X>
1d500 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
1d510 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20 20  INT sp;.  **    
1d520 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61 62     <shrink datab
1d530 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70 61  ase file to Y pa
1d540 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20 20  ges>.  **       
1d550 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67 65  pagerStress(page
1d560 20 58 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   X).  **     ROL
1d570 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 2a  LBACK TO sp;.  *
1d580 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e 59 29 2c  *.  ** If (X>Y),
1d590 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65 72   then when pager
1d5a0 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65 64  Stress is called
1d5b0 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f 74   page X will not
1d5c0 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a   be written.  **
1d5d0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1d5e0 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20 77  base file, but w
1d5f0 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
1d600 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20 54  rom the cache. T
1d610 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77  hen,.  ** follow
1d620 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  ing the "ROLLBAC
1d630 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d 65  K TO sp" stateme
1d640 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67 65  nt, reading page
1d650 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20 2a   X will read.  *
1d660 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1d670 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
1d680 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
1d690 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20 61  copy of page X a
1d6a0 73 20 69 74 0a 20 20 2a 2a 20 77 61 73 20 77 68  s it.  ** was wh
1d6b0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1d6c0 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74 20  on started, not 
1d6d0 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 22  as it was when "
1d6e0 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20 20  SAVEPOINT sp".  
1d6f0 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64 2e  ** was executed.
1d700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
1d710 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77 72  olution is to wr
1d720 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
1d730 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58 20  data for page X 
1d740 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73  into the .  ** s
1d750 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1d760 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e 6f  now (if it is no
1d770 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65 29  t already there)
1d780 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c  , so that it wil
1d790 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73 74 6f 72  l.  ** be restor
1d7a0 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65 6e  ed to its curren
1d7b0 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68 65  t value when the
1d7c0 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70   "ROLLBACK TO sp
1d7d0 22 20 69 73 20 0a 20 20 2a 2a 20 65 78 65 63 75  " is .  ** execu
1d7e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
1d7f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d800 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1d810 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
1d820 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
1d830 67 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  g) ){.    rc = s
1d840 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
1d850 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  g);.  }..  /* Wr
1d860 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
1d870 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75 74   of the page out
1d880 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d890 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28 20   file. */.  if( 
1d8a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d8b0 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1d8c0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1d8d0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1d8e0 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ist(pPg);.  }.. 
1d8f0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1d900 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20  e as clean. */. 
1d910 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d920 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  OK ){.    PAGERT
1d930 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25 64  RACE(("STRESS %d
1d940 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1d950 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d960 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73  g->pgno));.    s
1d970 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1d980 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
1d990 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
1d9a0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1d9b0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  );.}.../*.** All
1d9c0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1d9d0 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72  lize a new Pager
1d9e0 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20   object and put 
1d9f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a  a pointer to it.
1da00 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20  ** in *ppPager. 
1da10 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64  The pager should
1da20 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66   eventually be f
1da30 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67 20  reed by passing 
1da40 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  it.** to sqlite3
1da50 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a  PagerClose()..**
1da60 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d  .** The zFilenam
1da70 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  e argument is th
1da80 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
1da90 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1daa0 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  pen..** If zFile
1dab0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
1dac0 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
1dad0 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
1dae0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
1daf0 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
1db00 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
1db10 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c  d. Temporary fil
1db20 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74 65  es are be delete
1db30 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
1db40 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  ly when they are
1db50 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c   closed. If zFil
1db60 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
1db70 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c  y:" then .** all
1db80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1db90 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49  held in cache. I
1dba0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
1dbb0 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20  en to disk. .** 
1dbc0 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1dbd0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
1dbe0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1dbf0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ase..**.** The n
1dc00 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 20  Extra parameter 
1dc10 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e 75  specifies the nu
1dc20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1dc30 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1dc40 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65  .** along with e
1dc50 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65 6e  ach page referen
1dc60 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20 69  ce. This space i
1dc70 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  s available to t
1dc80 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74  he user.** via t
1dc90 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  he sqlite3PagerG
1dca0 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a  etExtra() API..*
1dcb0 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61  *.** The flags a
1dcc0 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20  rgument is used 
1dcd0 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70 65  to specify prope
1dce0 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65 63  rties that affec
1dcf0 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69  t the.** operati
1dd00 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e  on of the pager.
1dd10 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61   It should be pa
1dd20 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73  ssed some bitwis
1dd30 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a  e combination.**
1dd40 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d   of the PAGER_OM
1dd50 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50  IT_JOURNAL and P
1dd60 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
1dd70 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   flags..**.** Th
1dd80 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d  e vfsFlags param
1dd90 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
1dda0 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65  k to pass to the
1ddb0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
1ddc0 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e  .** of the xOpen
1ddd0 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  () method of the
1dde0 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77 68   supplied VFS wh
1ddf0 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73  en opening files
1de00 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
1de10 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20  pager object is 
1de20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1de30 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1de40 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63   opened .** succ
1de50 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45  essfully, SQLITE
1de60 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1de70 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65 74  and *ppPager set
1de80 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
1de90 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62  the new pager ob
1dea0 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  ject. If an erro
1deb0 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67  r occurs, *ppPag
1dec0 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  er is set to NUL
1ded0 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63  L.** and error c
1dee0 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68  ode returned. Th
1def0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
1df00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1df10 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d  MEM.** (sqlite3M
1df20 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20  alloc() is used 
1df30 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
1df40 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ry), SQLITE_CANT
1df50 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69  OPEN or .** vari
1df60 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58  ous SQLITE_IO_XX
1df70 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74  X errors..*/.int
1df80 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1df90 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
1dfa0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a   *pVfs,       /*
1dfb0 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c   The virtual fil
1dfc0 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20  e system to use 
1dfd0 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  */.  Pager **ppP
1dfe0 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
1dff0 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65   OUT: Return the
1e000 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1e010 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
1e020 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1e030 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
1e040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e050 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1e060 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
1e070 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
1e080 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
1e090 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
1e0a0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
1e0b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1e0c0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
1e0d0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
1e0e0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
1e0f0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
1e100 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
1e110 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
1e120 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
1e130 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
1e140 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e150 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  = 0;       /* Pa
1e160 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c  ger object to al
1e170 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
1e180 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
1e190 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
1e1a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1e1b0 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  /.  int tempFile
1e1c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1e1d0 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69  True for temp fi
1e1e0 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65  les (incl. in-me
1e1f0 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20  mory files) */. 
1e200 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20   int memDb = 0; 
1e210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e220 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
1e230 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  in-memory file *
1e240 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  /.  int readOnly
1e250 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
1e260 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
1e270 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65  a read-only file
1e280 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61   */.  int journa
1e290 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f  lFileSize;     /
1e2a0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e2b0 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  ate for each jou
1e2c0 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61  rnal fd */.  cha
1e2d0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30  r *zPathname = 0
1e2e0 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61  ;     /* Full pa
1e2f0 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  th to database f
1e300 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
1e310 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  thname = 0;     
1e320 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1e330 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d  ytes in zPathnam
1e340 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f  e */.  int useJo
1e350 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
1e360 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
1e370 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73  NAL)==0; /* Fals
1e380 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61  e to omit journa
1e390 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61  l */.  int noRea
1e3a0 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
1e3b0 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
1e3c0 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65  CK)!=0;  /* True
1e3d0 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f   to omit read-lo
1e3e0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63  ck */.  int pcac
1e3f0 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  heSize = sqlite3
1e400 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20  PcacheSize();   
1e410 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20      /* Bytes to 
1e420 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61  allocate for PCa
1e430 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50  che */.  u16 szP
1e440 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
1e450 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1e460 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  ZE;  /* Default 
1e470 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20  page size */..  
1e480 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
1e490 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73 20  w much space is 
1e4a0 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
1e4b0 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68  h journal file-h
1e4c0 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72  andle.  ** (ther
1e4d0 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65  e are two of the
1e4e0 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  m, the main jour
1e4f0 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d  nal and the sub-
1e500 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20  journal). This. 
1e510 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d   ** is the maxim
1e520 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65  um space require
1e530 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  d for an in-memo
1e540 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ry journal file 
1e550 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64  handle .  ** and
1e560 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e   a regular journ
1e570 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20  al file-handle. 
1e580 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65 67  Note that a "reg
1e590 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e  ular journal-han
1e5a0 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65  dle".  ** may be
1e5b0 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61 62   a wrapper capab
1e5c0 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68  le of caching th
1e5d0 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20  e first portion 
1e5e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
1e5f0 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f   ** file in memo
1e600 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ry to implement 
1e610 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
1e620 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73   optimization (s
1e630 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20  ee .  ** source 
1e640 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e  file journal.c).
1e650 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
1e660 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
1e670 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
1e680 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
1e690 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
1e6a0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ize = sqlite3Jou
1e6b0 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a  rnalSize(pVfs);.
1e6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
1e6d0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73  rnalFileSize = s
1e6e0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1e6f0 53 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Size();.  }..  /
1e700 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74  * Set the output
1e710 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c   variable to NUL
1e720 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  L in case an err
1e730 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
1e740 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
1e750 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
1e760 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
1e770 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
1e780 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
1e790 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
1e7a0 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
1e7b0 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
1e7c0 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
1e7d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
1e7e0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
1e7f0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
1e800 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
1e810 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
1e820 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
1e830 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
1e840 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
1e850 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
1e860 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
1e870 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
1e880 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
1e890 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
1e8a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1e8b0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1e8c0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1e8d0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
1e8e0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
1e8f0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
1e900 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
1e910 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
1e920 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
1e930 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
1e940 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
1e950 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
1e960 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  0; /* Make sure 
1e970 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e  initialized even
1e980 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65   if FullPathname
1e990 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  () fails */.    
1e9a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e9b0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
1e9c0 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  s, zFilename, nP
1e9d0 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  athname, zPathna
1e9e0 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  me);.    }..    
1e9f0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  nPathname = sqli
1ea00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
1ea10 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  hname);.    if( 
1ea20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ea30 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66   nPathname+8>pVf
1ea40 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b  s->mxPathname ){
1ea50 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62  .      /* This b
1ea60 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77  ranch is taken w
1ea70 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1ea80 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62 79  path required by
1ea90 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61  .      ** the da
1eaa0 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65  tabase being ope
1eab0 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65  ned will be more
1eac0 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61   than pVfs->mxPa
1ead0 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20  thname.      ** 
1eae0 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e  bytes in length.
1eaf0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
1eb00 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20  database cannot 
1eb10 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20  be opened,.     
1eb20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e   ** as it will n
1eb30 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ot be possible t
1eb40 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
1eb50 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a  al file or even.
1eb60 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66        ** check f
1eb70 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
1eb80 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e   before reading.
1eb90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1eba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
1ebb0 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OPEN;.    }.    
1ebc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ebd0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1ebe0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
1ebf0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1ec00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
1ec10 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65    /* Allocate me
1ec20 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61 67  mory for the Pag
1ec30 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50 43  er structure, PC
1ec40 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68 65  ache object, the
1ec50 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c 65  .  ** three file
1ec60 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74 68   descriptors, th
1ec70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1ec80 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f 75  name and the jou
1ec90 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20  rnal .  ** file 
1eca0 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75 74  name. The layout
1ecb0 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61 73   in memory is as
1ecc0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
1ecd0 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f 62   **     Pager ob
1ece0 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1ecf0 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28          (sizeof(
1ed00 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20 20  Pager) bytes).  
1ed10 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f 62  **     PCache ob
1ed20 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20 20  ject            
1ed30 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 50         (sqlite3P
1ed40 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74 65  cacheSize() byte
1ed50 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61  s).  **     Data
1ed60 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
1ed70 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56 66              (pVf
1ed80 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74 65  s->szOsFile byte
1ed90 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62 2d  s).  **     Sub-
1eda0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e  journal file han
1edb0 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f 75  dle         (jou
1edc0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79 74  rnalFileSize byt
1edd0 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61 69  es).  **     Mai
1ede0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  n journal file h
1edf0 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a 6f  andle        (jo
1ee00 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
1ee10 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61  tes).  **     Da
1ee20 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1ee40 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65 73  Pathname+1 bytes
1ee50 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72 6e  ).  **     Journ
1ee60 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  al file name    
1ee70 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74             (nPat
1ee80 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73 29  hname+8+1 bytes)
1ee90 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20 28  .  */.  pPtr = (
1eea0 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  u8 *)sqlite3Mall
1eeb0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
1eec0 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
1eed0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
1eee0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
1eef0 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20    pcacheSize    
1ef00 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
1ef10 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
1ef20 2f 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73  /.    pVfs->szOs
1ef30 46 69 6c 65 20 20 2b 20 20 20 20 20 20 20 20 20  File  +         
1ef40 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62    /* The main db
1ef50 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f 75   file */.    jou
1ef60 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20 32  rnalFileSize * 2
1ef70 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   +       /* The 
1ef80 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  two journal file
1ef90 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e  s */ .    nPathn
1efa0 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
1efb0 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1efc0 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
1efd0 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20  ame + 8 + 1     
1efe0 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61        /* zJourna
1eff0 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
1f000 21 70 50 74 72 20 29 7b 0a 20 20 20 20 73 71 6c  !pPtr ){.    sql
1f010 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
1f020 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
1f030 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1f040 20 7d 0a 20 20 70 50 61 67 65 72 20 3d 20 20 20   }.  pPager =   
1f050 20 20 20 20 20 20 20 20 20 20 20 28 50 61 67 65             (Page
1f060 72 2a 29 28 70 50 74 72 29 3b 0a 20 20 70 50 61  r*)(pPtr);.  pPa
1f070 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d 20 20  ger->pPCache =  
1f080 20 20 28 50 43 61 63 68 65 2a 29 28 70 50 74 72    (PCache*)(pPtr
1f090 20 2b 3d 20 73 69 7a 65 6f 66 28 2a 70 50 61 67   += sizeof(*pPag
1f0a0 65 72 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  er));.  pPager->
1f0b0 66 64 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f  fd =   (sqlite3_
1f0c0 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 70  file*)(pPtr += p
1f0d0 63 61 63 68 65 53 69 7a 65 29 3b 0a 20 20 70 50  cacheSize);.  pP
1f0e0 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71  ager->sjfd = (sq
1f0f0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28 70 50 74  lite3_file*)(pPt
1f100 72 20 2b 3d 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r += pVfs->szOsF
1f110 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
1f120 6a 66 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f  jfd =  (sqlite3_
1f130 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a  file*)(pPtr += j
1f140 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b  ournalFileSize);
1f150 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
1f160 6e 61 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a  name =    (char*
1f170 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f180 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 0a 20 20 2f  lFileSize);..  /
1f190 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 50 61  * Fill in the Pa
1f1a0 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e  ger.zFilename an
1f1b0 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  d Pager.zJournal
1f1c0 20 62 75 66 66 65 72 73 2c 20 69 66 20 72 65 71   buffers, if req
1f1d0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  uired. */.  if( 
1f1e0 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
1f1f0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1f200 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28 70 50  l =   (char*)(pP
1f210 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20  tr += nPathname 
1f220 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  + 1);.    memcpy
1f230 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
1f240 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
1f250 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d  Pathname);.    m
1f260 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  emcpy(pPager->zJ
1f270 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d  ournal, zPathnam
1f280 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
1f290 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1f2a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74  r->zJournal[nPat
1f2b0 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61  hname], "-journa
1f2c0 6c 22 2c 20 38 29 3b 0a 20 20 20 20 73 71 6c 69  l", 8);.    sqli
1f2d0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
1f2e0 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  me);.  }.  pPage
1f2f0 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
1f300 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61    pPager->vfsFla
1f310 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a  gs = vfsFlags;..
1f320 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
1f330 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
1f340 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
1f350 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
1f360 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
1f370 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 20 20 20  int fout = 0;   
1f380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f390 20 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 72 65   /* VFS flags re
1f3a0 74 75 72 6e 65 64 20 62 79 20 78 4f 70 65 6e 28  turned by xOpen(
1f3b0 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ) */.    rc = sq
1f3c0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
1f3d0 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
1f3e0 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ame, pPager->fd,
1f3f0 20 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74   vfsFlags, &fout
1f400 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  );.    readOnly 
1f410 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  = (fout&SQLITE_O
1f420 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a  PEN_READONLY);..
1f430 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
1f440 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
1f450 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
1f460 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
1f470 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20  ,.    ** choose 
1f480 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  a default page s
1f490 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20 68  ize in case we h
1f4a0 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74 68  ave to create th
1f4b0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
1f4c0 65 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61  e file. The defa
1f4d0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ult page size is
1f4e0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a   the maximum of:
1f4f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1f500 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
1f510 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
1f520 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76 61    **    + The va
1f530 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1f540 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
1f550 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20 20 20 20  ize().    **    
1f560 2b 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61  + The largest pa
1f570 67 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e  ge size that can
1f580 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d   be written atom
1f590 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20  ically..    */. 
1f5a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f5b0 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
1f5c0 79 20 29 7b 0a 20 20 20 20 20 20 73 65 74 53 65  y ){.      setSe
1f5d0 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
1f5e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 53  ;.      assert(S
1f5f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1f600 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f  GE_SIZE<=SQLITE_
1f610 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f620 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 69 66  _SIZE);.      if
1f630 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61  ( szPageDflt<pPa
1f640 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
1f650 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1f660 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1f670 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  e>SQLITE_MAX_DEF
1f680 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29  AULT_PAGE_SIZE )
1f690 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
1f6a0 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f  geDflt = SQLITE_
1f6b0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
1f6c0 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
1f6d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1f6e0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 28 75 31  szPageDflt = (u1
1f6f0 36 29 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  6)pPager->sector
1f700 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Size;.        }.
1f710 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
1f720 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1f730 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
1f740 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  {.        int iD
1f750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
1f760 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f770 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
1f780 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a          int ii;.
1f790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1f7a0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f7b0 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
1f7c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f7d0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
1f7e0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
1f7f0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  >8));.        as
1f800 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f  sert(SQLITE_MAX_
1f810 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f820 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20  E<=65536);.     
1f830 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67 65     for(ii=szPage
1f840 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Dflt; ii<=SQLITE
1f850 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
1f860 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
1f870 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f880 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  iDc&(SQLITE_IOCA
1f890 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29  P_ATOMIC|(ii>>8)
1f8a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1f8b0 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
1f8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1f8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f8e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1f8f0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1f900 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1f910 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1f920 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
1f930 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
1f940 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
1f950 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
1f960 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f970 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
1f980 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
1f990 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
1f9a0 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
1f9b0 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
1f9c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1f9d0 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
1f9e0 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
1f9f0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
1fa00 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
1fa10 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
1fa20 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
1fa30 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
1fa40 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
1fa50 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
1fa60 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
1fa70 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
1fa80 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
1fa90 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
1faa0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1fab0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1fac0 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f  LUSIVE;.  }..  /
1fad0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1fae0 63 61 6c 6c 20 74 6f 20 50 61 67 65 72 53 65 74  call to PagerSet
1faf0 50 61 67 65 73 69 7a 65 28 29 20 73 65 72 76 65  Pagesize() serve
1fb00 73 20 74 6f 20 73 65 74 20 74 68 65 20 76 61 6c  s to set the val
1fb10 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65  ue of .  ** Page
1fb20 72 2e 70 61 67 65 53 69 7a 65 20 61 6e 64 20 74  r.pageSize and t
1fb30 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 50  o allocate the P
1fb40 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62  ager.pTmpSpace b
1fb50 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  uffer..  */.  if
1fb60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fb70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1fb80 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
1fb90 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1fba0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
1fbb0 69 7a 65 28 70 50 61 67 65 72 2c 20 26 73 7a 50  ize(pPager, &szP
1fbc0 61 67 65 44 66 6c 74 29 3b 0a 20 20 20 20 74 65  ageDflt);.    te
1fbd0 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
1fbe0 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20  TE_OK );.  }..  
1fbf0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
1fc00 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65  ccurred in eithe
1fc10 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
1fc20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20  above, free the 
1fc30 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75  .  ** Pager stru
1fc40 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
1fc50 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  the file..  */. 
1fc60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fc70 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1fc80 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ( !pPager->pTmpS
1fc90 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  pace );.    sqli
1fca0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
1fcb0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
1fcc0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
1fcd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1fce0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
1fcf0 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65  alize the PCache
1fd00 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45   object. */.  nE
1fd10 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45  xtra = ROUND8(nE
1fd20 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
1fd30 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
1fd40 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
1fd50 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
1fd60 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
1fd70 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
1fd80 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
1fd90 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1fda0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
1fdb0 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
1fdc0 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
1fdd0 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
1fde0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
1fdf0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
1fe00 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
1fe10 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
1fe20 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61 67 65  ename))..  pPage
1fe30 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
1fe40 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  (u8)useJournal;.
1fe50 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
1fe60 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f  lock = (noReadlo
1fe70 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20  ck && readOnly) 
1fe80 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65  ?1:0;.  /* pPage
1fe90 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
1fea0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
1feb0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
1fec0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1fed0 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
1fee0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
1fef0 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  id = (u8)memDb;.
1ff00 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
1ff10 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
1ff20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
1ff30 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
1ff40 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
1ff50 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
1ff60 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
1ff70 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
1ff80 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
1ff90 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
1ffa0 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
1ffb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
1ffc0 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
1ffd0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
1ffe0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
1fff0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
20000 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
20010 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
20020 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
20030 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
20040 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
20050 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
20060 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
20070 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
20080 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
20090 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
200a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
200b0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
200c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
200d0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
200e0 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61  tempFile; .  pPa
200f0 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
20100 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
20110 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
20120 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
20130 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
20140 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
20150 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
20160 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
20170 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20180 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65  >noSync = (pPage
20190 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
201a0 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30  useJournal) ?1:0
201b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
201c0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
201d0 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
201e0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
201f0 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
20200 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
20210 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
20220 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
20230 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
20240 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20250 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
20260 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
20270 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
20280 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
20290 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
202a0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
202b0 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
202c0 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
202d0 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46  er->fd) || tempF
202e0 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65 63 74  ile );.  setSect
202f0 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
20300 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20    if( memDb ){. 
20310 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
20320 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a  alMode = PAGER_J
20330 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
20340 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  Y;.  }.  /* pPag
20350 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
20360 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
20370 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
20380 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20  erArg = 0; */.  
20390 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
203a0 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
203b0 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
203c0 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
203d0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
203e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
203f0 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }..../*.** This 
20400 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20410 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69 74  ed after transit
20420 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47 45  ioning from PAGE
20430 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50  R_UNLOCK to.** P
20440 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74  AGER_SHARED stat
20450 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20 74  e. It tests if t
20460 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
20470 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69 6e  urnal present in
20480 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73  .** the file-sys
20490 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76 65  tem for the give
204a0 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20 6a  n pager. A hot j
204b0 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
204c0 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20  at .** needs to 
204d0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20  be played back. 
204e0 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 69  According to thi
204f0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f  s function, a ho
20500 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  t-journal.** fil
20510 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65 20  e exists if the 
20520 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
20530 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a  ia are met:.**.*
20540 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61  *   * The journa
20550 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69 6e  l file exists in
20560 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d   the file system
20570 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20  , and.**   * No 
20580 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20590 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65 61  RESERVED or grea
205a0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
205b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61  database file, a
205c0 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  nd.**   * The da
205d0 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65  tabase file itse
205e0 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68  lf is greater th
205f0 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73 69  an 0 bytes in si
20600 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ze, and.**   * T
20610 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
20620 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20630 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20  e exists and is 
20640 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20  not 0x00..**.** 
20650 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
20660 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
20670 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
20680 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
20690 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
206a0 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
206b0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
206c0 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
206d0 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
206e0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
206f0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
20700 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20710 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65   is.** just dele
20720 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c 65  ted using OsDele
20730 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73 20  te, *pExists is 
20740 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20750 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
20760 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
20770 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e  s routine does n
20780 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65 72  ot check if ther
20790 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a 6f  e is a master jo
207a0 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a  urnal filename.*
207b0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
207c0 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  the file. If the
207d0 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74 20  re is, and that 
207e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
207f0 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ile.** does not 
20800 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65 20  exist, then the 
20810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20820 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20  not really hot. 
20830 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65 20  In this.** case 
20840 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
20850 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73 65  l return a false
20860 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20 70  -positive. The p
20870 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a  ager_playback().
20880 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  ** routine will 
20890 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68  discover that th
208a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
208b0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
208c0 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f   and .** will no
208d0 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  t roll it back. 
208e0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d  .**.** If a hot-
208f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20900 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20  found to exist, 
20910 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20  *pExists is set 
20920 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c  to 1 and .** SQL
20930 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20940 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e   If no hot-journ
20950 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
20960 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a  nt, *pExists is.
20970 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20  ** set to 0 and 
20980 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
20990 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
209a0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
209b0 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74  trying.** to det
209c0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
209d0 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72  r not a hot-jour
209e0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
209f0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a   the IO error.**
20a00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20a10 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
20a20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20 75  of *pExists is u
20a30 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
20a40 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
20a50 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
20a60 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
20a70 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
20a80 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
20a90 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
20aa0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ac0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
20ad0 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20 20  .  int exists;  
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20af0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f   /* True if a jo
20b00 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72  urnal file is pr
20b10 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  esent */..  asse
20b20 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
20b30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20b40 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
20b50 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
20b60 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b  n(pPager->fd) );
20b70 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
20b80 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
20b90 29 3b 0a 0a 20 20 2a 70 45 78 69 73 74 73 20 3d  );..  *pExists =
20ba0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
20bb0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
20bc0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
20bd0 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
20be0 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
20bf0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20c00 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
20c10 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b   ){.    int lock
20c20 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
20c30 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 73      /* True if s
20c40 6f 6d 65 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  ome process hold
20c50 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
20c60 6b 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  k */.    rc = sq
20c70 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
20c80 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
20c90 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20  >fd, &locked);. 
20ca0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20cb0 45 5f 4f 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20  E_OK && !locked 
20cc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
20cd0 67 65 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68  ge;..      /* Ch
20ce0 65 63 6b 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eck the size of 
20cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20d00 65 2e 20 49 66 20 69 74 20 63 6f 6e 73 69 73 74  e. If it consist
20d10 73 20 6f 66 20 30 20 70 61 67 65 73 2c 0a 20 20  s of 0 pages,.  
20d20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65      ** then dele
20d30 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
20d40 69 6c 65 2e 20 53 65 65 20 74 68 65 20 68 65 61  ile. See the hea
20d50 64 65 72 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76  der comment abov
20d60 65 20 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20  e for .      ** 
20d70 74 68 65 20 72 65 61 73 6f 6e 69 6e 67 20 68 65  the reasoning he
20d80 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
20d90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20da0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
20db0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
20dc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20de0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
20df0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20e00 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
20e10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20e20 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
20e30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20e40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75        /* The jou
20e50 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
20e60 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f   and no other co
20e70 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72  nnection has a r
20e80 65 73 65 72 76 65 64 0a 20 20 20 20 20 20 20 20  eserved.        
20e90 20 20 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20    ** or greater 
20ea0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
20eb0 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63  base file. Now c
20ec0 68 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20  heck that there 
20ed0 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
20ee0 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e  at least one non
20ef0 2d 7a 65 72 6f 20 62 79 74 65 73 20 61 74 20 74  -zero bytes at t
20f00 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20f10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
20f20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
20f30 65 72 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20  ere is, then we 
20f40 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f  consider this jo
20f50 75 72 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e  urnal to be hot.
20f60 20 49 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20   If not, .      
20f70 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
20f80 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
20f90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
20fa0 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
20fb0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
20fc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
20fd0 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20  OURNAL;.        
20fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20ff0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
21000 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
21010 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29  ger->jfd, f, &f)
21020 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21040 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 38 20  .            u8 
21050 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  first = 0;.     
21060 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21070 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
21080 2d 3e 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26  ->jfd, (void *)&
21090 66 69 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20  first, 1, 0);.  
210a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
210b0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
210c0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
210d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
210e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
210f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21100 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
21110 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
21120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
21130 45 78 69 73 74 73 20 3d 20 28 66 69 72 73 74 21  Exists = (first!
21140 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  =0);.          }
21150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21160 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
21170 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21180 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
21190 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
211a0 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
211b0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
211c0 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
211d0 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
211e0 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
211f0 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
21200 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
21210 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
21220 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21230 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
21240 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
21250 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
21260 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
21270 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
21280 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
21290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
212a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
212b0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
212c0 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
212d0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
212e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
212f0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
21300 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21310 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
21320 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
21330 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
21340 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21350 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
21360 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
21370 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
21380 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
21390 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
213a0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
213b0 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
213c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
213d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
213e0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
213f0 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21410 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
21420 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
21430 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21440 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21450 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
21460 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21  EMDB );..  if( !
21470 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
21480 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
21490 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
214a0 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
214b0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
214c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
214d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
214e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
214f0 69 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d  iOffset = (pgno-
21500 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
21510 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
21520 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
21530 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
21540 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
21550 61 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74  ageSize, iOffset
21560 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21570 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
21580 52 45 41 44 20 29 7b 0a 20 20 20 20 6d 65 6d 73  READ ){.    mems
21590 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
215a0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
215b0 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ze);.    rc = SQ
215c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
215d0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
215e0 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73    u8 *dbFileVers
215f0 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70   = &((u8*)pPg->p
21600 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d  Data)[24];.    m
21610 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
21620 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
21630 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50  eVers, sizeof(pP
21640 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
21650 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31  ));.  }.  CODEC1
21660 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44  (pPager, pPg->pD
21670 61 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 0a  ata, pgno, 3);..
21680 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
21690 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
216a0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
216b0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
216c0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
216d0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
216e0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
216f0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
21700 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
21710 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
21720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21730 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21740 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67   pgno, pager_pag
21750 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20  ehash(pPg)));.. 
21760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21770 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21780 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
21790 6e 65 76 65 72 20 74 68 65 20 75 70 70 65 72 20  never the upper 
217a0 6c 61 79 65 72 20 72 65 71 75 65 73 74 73 20 61  layer requests a
217b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67   database.** pag
217c0 65 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  e is requested, 
217d0 62 65 66 6f 72 65 20 74 68 65 20 63 61 63 68 65  before the cache
217e0 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
217f0 61 20 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a  a suitable page.
21800 2a 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69  ** or any data i
21810 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
21820 64 61 74 61 62 61 73 65 2e 20 49 74 20 70 65 72  database. It per
21830 66 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77  forms the follow
21840 69 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74  ing.** two funct
21850 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ions:.**.**   1)
21860 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
21870 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41   currently in PA
21880 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
21890 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a   (no lock held.*
218a0 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61  *      on the da
218b0 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68  tabase file), th
218c0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
218d0 20 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20   made to obtain 
218e0 61 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44  a.**      SHARED
218f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
21900 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65  abase file. Imme
21910 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
21920 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  taining.**      
21930 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
21940 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
21950 20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20   is checked for 
21960 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a  a hot-journal,.*
21970 2a 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20  *      which is 
21980 70 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70  played back if p
21990 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e  resent. Followin
219a0 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61  g any hot-journa
219b0 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62  l .**      rollb
219c0 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ack, the content
219d0 73 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61  s of the cache a
219e0 72 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20  re validated by 
219f0 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20  checking.**     
21a00 20 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75   the 'change-cou
21a10 6e 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74  nter' field of t
21a20 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21a30 20 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20   header and.**  
21a40 20 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66      discarded if
21a50 20 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20   they are found 
21a60 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a  to be invalid..*
21a70 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65  *.**   2) If the
21a80 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
21a90 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d  g in exclusive-m
21aa0 6f 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61  ode, and there a
21ab0 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  re currently.** 
21ac0 20 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64       no outstand
21ad0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
21ae0 6f 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64  o any pages, and
21af0 20 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72   is in the error
21b00 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20   state,.**      
21b10 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  then an attempt 
21b20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72  is made to clear
21b30 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
21b40 20 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a   by discarding.*
21b50 2a 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65  *      the conte
21b60 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  nts of the page 
21b70 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e  cache and rollin
21b80 67 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20  g back any open 
21b90 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
21ba0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
21bb0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73  he operation des
21bc0 63 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62  cribed by (2) ab
21bd0 6f 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  ove is not attem
21be0 70 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65  pted, and if the
21bf0 0a 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20  .** pager is in 
21c00 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
21c10 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
21c20 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20  _FULL when this 
21c30 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68  is called,.** th
21c40 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72  e error state er
21c50 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
21c60 72 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d  rned. It is perm
21c70 69 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68  itted to read th
21c80 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68  e.** database wh
21c90 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c  en in SQLITE_FUL
21ca0 4c 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a  L error state..*
21cb0 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
21cc0 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
21cd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
21ce0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
21cf0 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20  ed. If an.** IO 
21d00 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
21d10 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64  le locking the d
21d20 61 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e  atabase, checkin
21d30 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  g for a hot-jour
21d40 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72  nal.** file or r
21d50 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
21d60 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
21d70 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
21d80 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
21d90 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
21da0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
21db0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
21dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
21dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21de0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
21df0 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
21e00 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  et = 0;         
21e10 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
21e20 72 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20  recovering from 
21e30 65 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a  error state */..
21e40 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
21e50 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
21e60 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
21e70 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
21e80 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
21e90 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
21ea0 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
21eb0 72 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69 73  r-state, this is
21ec0 20 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65   a chance to cle
21ed0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
21ee0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
21ef0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
21f00 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
21f10 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
21f20 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
21f30 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
21f40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
21f50 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
21f60 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
21f70 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
21f80 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
21f90 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26  ->pPCache)==0 &&
21fa0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
21fb0 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69   .  ){.    if( i
21fc0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
21fd0 64 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  d) ){.      isEr
21fe0 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
21ff0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
22000 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
22010 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
22020 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
22030 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
22040 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
22050 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
22060 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
22070 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
22080 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
22090 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
220a0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
220b0 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
220c0 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
220d0 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
220e0 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
220f0 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
22100 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22110 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
22120 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
22130 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
22140 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
22150 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
22160 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22170 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
22180 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
22190 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
221a0 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d  s * const pVfs =
221b0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
221c0 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72     int isHotJour
221d0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  nal = 0;.    ass
221e0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
221f0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
22200 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
22210 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
22220 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )==0 );.    if( 
22230 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
22240 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ock ){.      rc 
22250 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
22260 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
22270 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
22280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22290 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  OK ){.        as
222a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
222b0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
222c0 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  K );.        ret
222d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
222e0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
222f0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
22300 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
22310 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
22320 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
22330 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
22340 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARED;.    }.    
22350 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22360 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
22370 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  CK );..    /* If
22380 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22390 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
223a0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
223b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
223c0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
223d0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
223e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
223f0 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
22400 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
22410 20 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73   if( !isErrorRes
22420 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  et ){.      rc =
22430 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
22440 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75  Pager, &isHotJou
22450 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28  rnal);.      if(
22460 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22470 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
22480 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
22490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45     }.    if( isE
224a0 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48  rrorReset || isH
224b0 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  otJournal ){.   
224c0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
224d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
224e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
224f0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
22500 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  it is.      ** i
22510 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
22520 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
22530 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
22540 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
22550 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
22560 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
22570 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
22580 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
22590 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
225a0 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
225b0 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
225c0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
225d0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
225e0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
225f0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
22600 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
22610 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
22620 67 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  g the .      ** 
22630 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b  hot-journal back
22640 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
22650 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
22660 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
22670 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
22680 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e  ot requested, an
22690 79 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  y.      ** other
226a0 20 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74   process attempt
226b0 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68  ing to access th
226c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
226d0 77 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20  will get to .   
226e0 20 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74     ** this point
226f0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
22700 20 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20   fail to obtain 
22710 69 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  its own EXCLUSIV
22720 45 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a  E lock .      **
22730 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22740 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
22750 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
22760 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
22770 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
22780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22790 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
227a0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
227b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
227c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
227d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
227e0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
227f0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
22800 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
22810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22820 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
22830 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
22840 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
22850 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
22860 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
22870 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
22880 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
22890 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
228a0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
228b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
228c0 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
228d0 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
228e0 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
228f0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
22900 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
22910 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
22920 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
22930 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
22940 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
22950 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
22960 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
22970 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
22980 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
22990 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
229a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
229b0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  d) ){.        in
229c0 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72  t res;.        r
229d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
229e0 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d  ess(pVfs,pPager-
229f0 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45  >zJournal,SQLITE
22a00 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26  _ACCESS_EXISTS,&
22a10 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66  res);.        if
22a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22a30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
22a40 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20   res ){.        
22a50 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30      int fout = 0
22a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
22a70 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
22a80 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
22a90 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
22aa0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
22ab0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
22ac0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
22ad0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22ae0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
22af0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
22b00 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
22b10 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20  d, f, &fout);.  
22b20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22b30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22b40 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
22b50 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20  ->jfd) );.      
22b60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22b70 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26  LITE_OK && fout&
22b80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22b90 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
22ba0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
22bb0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20  E_CANTOPEN;.    
22bc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
22bd0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
22be0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
22bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
22c00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22c10 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
22c20 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
22c30 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73  st, that means s
22c40 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
22c50 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
22c60 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c   has already rol
22c70 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20  led it back */. 
22c80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
22c90 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
22ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22cb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
22cc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
22cd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
22ce0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
22cf0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44   }..      /* TOD
22d00 4f 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65  O: Why are these
22d10 20 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49   cleared here? I
22d20 73 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20  s it necessary? 
22d30 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
22d40 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
22d50 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
22d60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
22d70 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
22d80 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
22d90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
22da0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
22db0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
22dc0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
22dd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
22de0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
22df0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
22e00 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
22e10 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
22e20 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
22e30 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
22e40 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
22e50 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
22e60 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
22e70 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
22e80 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
22e90 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f   cache..      */
22ea0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
22eb0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
22ec0 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 1);.      if(
22ed0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22ee0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
22ef0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
22f00 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
22f10 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
22f20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
22f30 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
22f40 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29  e==PAGER_SHARED)
22f50 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  .           || (
22f60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22f70 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
22f80 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
22f90 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20  RED).      );.  
22fa0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c    }..    if( sql
22fb0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f  ite3PcachePageco
22fc0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
22fd0 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  che)>0 ){.      
22fe0 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f  /* The shared-lo
22ff0 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ck has just been
23000 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65   acquired on the
23010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
23020 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
23030 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
23040 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
23050 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
23060 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20  s.      ** read 
23070 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
23080 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
23090 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
230a0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  base.      ** ha
230b0 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
230c0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
230d0 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
230e0 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a  lush the.      *
230f0 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a  * cache..      *
23100 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62  *.      ** Datab
23110 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64  ase changes is d
23120 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69  etected by looki
23130 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62  ng at 15 bytes b
23140 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a  eginning.      *
23150 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69  * at offset 24 i
23160 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54  nto the file.  T
23170 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68  he first 4 of th
23180 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65  ese 16 bytes are
23190 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62  .      ** a 32-b
231a0 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20  it counter that 
231b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
231c0 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e  ith each change.
231d0 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f    The.      ** o
231e0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
231f0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
23200 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
23210 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61   when.      ** a
23220 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
23230 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20  ..      ** .    
23240 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
23250 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
23260 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
23270 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
23280 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74  be .      ** det
23290 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
232a0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
232b0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
232c0 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
232d0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e    ** it can be n
232e0 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20  eglected..      
232f0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62  */.      char db
23300 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28  FileVers[sizeof(
23310 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
23320 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  rs)];.      sqli
23330 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
23340 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20  t(pPager, 0);.. 
23350 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
23360 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
23370 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
23380 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20  >errCode;.      
23390 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
233a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
233b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
233c0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20  SizeValid );.   
233d0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
233e0 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  bSize>0 ){.     
233f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
23400 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
23410 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
23420 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
23430 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23440 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
23450 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20  d, &dbFileVers, 
23460 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
23470 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  s), 24);.       
23480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
234a0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
234b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
234c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
234d0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
234e0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
234f0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  ers));.      }..
23500 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70        if( memcmp
23510 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
23520 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c  ers, dbFileVers,
23530 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
23540 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rs))!=0 ){.     
23550 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
23560 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Pager);.      }.
23570 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23580 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
23590 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
235a0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
235b0 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20  SHARED );.  }.. 
235c0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
235d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
235e0 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
235f0 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
23600 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
23610 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
23620 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
23630 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
23640 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
23650 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23660 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
23670 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
23680 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
23690 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
236a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
236b0 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
236c0 67 65 72 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ger..*/ .static 
236d0 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
236e0 49 66 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a  IfUnused(Pager *
236f0 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73  pPager){.  if( s
23700 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
23710 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
23720 61 63 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ache)==0 ){.    
23730 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
23740 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
23750 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f    }.}../*.** Dro
23760 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  p a page from th
23770 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71  e cache using sq
23780 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
23790 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  )..**.** If this
237a0 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
237b0 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69   now no pages wi
237c0 74 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  th references to
237d0 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63   them, a rollbac
237e0 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20  k.** occurs and 
237f0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
23800 64 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f  database is remo
23810 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
23820 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67  oid pagerDropPag
23830 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
23840 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
23850 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
23860 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
23870 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72  op(pPg);.  pager
23880 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
23890 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
238a0 20 41 63 71 75 69 72 65 20 61 20 72 65 66 65 72   Acquire a refer
238b0 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d  ence to page num
238c0 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65  ber pgno in page
238d0 72 20 70 50 61 67 65 72 20 28 61 20 70 61 67 65  r pPager (a page
238e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61  .** reference ha
238f0 73 20 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e  s type DbPage*).
23900 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
23910 64 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a  d reference is .
23920 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ** successfully 
23930 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20  obtained, it is 
23940 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67  copied to *ppPag
23950 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
23960 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
23970 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  This function ca
23980 6c 6c 73 20 70 61 67 65 72 53 68 61 72 65 64 4c  lls pagerSharedL
23990 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20  ock() to obtain 
239a0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
239b0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
239c0 20 66 69 6c 65 20 69 66 20 73 75 63 68 20 61 20   file if such a 
239d0 6c 6f 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20  lock or greater 
239e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68  is not already h
239f0 65 6c 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79  eld..** This may
23a00 20 63 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e   cause hot-journ
23a10 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
23a20 20 63 61 63 68 65 20 70 75 72 67 65 2e 20 53 65   cache purge. Se
23a30 65 20 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62  e comments.** ab
23a40 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67  ove function pag
23a50 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66  erSharedLock() f
23a60 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a  or details..**.*
23a70 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
23a80 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
23a90 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
23aa0 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
23ab0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
23ac0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
23ad0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
23ae0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
23af0 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
23b00 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23b10 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
23b20 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
23b30 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
23b40 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
23b50 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
23b60 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
23b70 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
23b80 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
23b90 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
23ba0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
23bb0 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
23bc0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
23bd0 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
23be0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
23bf0 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
23c00 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
23c10 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
23c20 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
23c30 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
23c40 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
23c50 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
23c60 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
23c70 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
23c80 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
23c90 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
23ca0 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
23cb0 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
23cc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
23cd0 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
23ce0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
23cf0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
23d00 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
23d10 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
23d20 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
23d30 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
23d40 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
23d50 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
23d60 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
23d70 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
23d80 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
23d90 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
23da0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
23db0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
23dc0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
23dd0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
23de0 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
23df0 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
23e00 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
23e10 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
23e20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
23e30 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
23e40 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
23e50 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
23e60 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f  eperate scenario
23e70 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
23e80 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
23e90 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
23ea0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
23eb0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
23ec0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
23ed0 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
23ee0 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
23ef0 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
23f00 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
23f10 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
23f20 6f 20 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20  o populate with 
23f30 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
23f40 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73        from the s
23f50 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  avepoint journal
23f60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  ..**.** If noCon
23f70 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68  tent is true, th
23f80 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74 75  en the data retu
23f90 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69  rned is zeroed i
23fa0 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69  nstead of.** bei
23fb0 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ng read from the
23fc0 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69 74   database. Addit
23fd0 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74  ionally, the bit
23fe0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  s corresponding.
23ff0 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61  ** to pgno in Pa
24000 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28  ger.pInJournal (
24010 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73 20  bitvec of pages 
24020 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e 20  already written 
24030 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  to the.** journa
24040 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
24050 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
24060 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76  InSavepoint bitv
24070 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a  ecs of any open.
24080 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72  ** savepoints ar
24090 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e  e set. This mean
240a0 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  s if the page is
240b0 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 61   made writable a
240c0 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69  t any.** point i
240d0 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75 73  n the future, us
240e0 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ing a call to sq
240f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
24100 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a  ), its contents.
24110 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a  ** will not be j
24120 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73  ournaled. This s
24130 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54  aves IO..**.** T
24140 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
24150 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
24160 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
24170 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
24180 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
24190 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
241a0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
241b0 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
241c0 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
241d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  o sqlite3PagerLo
241e0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
241f0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c  is routine and L
24200 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
24210 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
24220 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
24230 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
24240 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
24250 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
24260 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
24270 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
24280 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
24290 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70  n whereas Lookup
242a0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
242b0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
242c0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
242d0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
242e0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
242f0 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
24300 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
24310 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
24320 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
24330 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c  sary..** Since L
24340 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f  ookup() never go
24350 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e  es to disk, it n
24360 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c  ever has to deal
24370 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f   with locks.** o
24380 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e  r journal files.
24390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
243a0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
243b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
243c0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
243d0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
243e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
243f0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
24400 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
24410 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
24420 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
24430 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
24440 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
24450 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
24460 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
24470 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
24480 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
24490 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
244a0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
244b0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e  r *pPg = 0;.  in
244c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
244d0 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74   assert_pager_st
244e0 61 74 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20  ate(pPager) );. 
244f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24500 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
24510 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20  LOCK .       || 
24520 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24530 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
24540 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20  Cache)>0 .      
24550 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b   || pgno==1.  );
24560 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
24570 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
24580 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
24590 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
245a0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
245b0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
245c0 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
245d0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
245e0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
245f0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
24600 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
24610 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
24620 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
24630 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
24640 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
24650 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
24660 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
24670 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
24680 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
24690 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
246a0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
246b0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
246c0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
246d0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
246e0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
246f0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
24700 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
24710 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
24720 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
24730 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
24740 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
24750 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
24760 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
24770 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
24780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24790 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
247a0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
247b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
247c0 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20  UNLOCK );..  rc 
247d0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46  = sqlite3PcacheF
247e0 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
247f0 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26  ache, pgno, 1, &
24800 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  pPg);.  if( rc!=
24810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24820 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24830 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
24840 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
24850 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
24860 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50  er==pPager || pP
24870 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a  g->pPager==0 );.
24880 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65    if( pPg->pPage
24890 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  r==0 ){.    /* T
248a0 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 68  he pager cache h
248b0 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65 77  as created a new
248c0 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65   page. Its conte
248d0 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20  nt needs to .   
248e0 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a   ** be initializ
248f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
24900 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47  nt nMax;.    PAG
24910 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
24920 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d  nMiss);.    pPg-
24930 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
24940 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
24950 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
24960 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
24970 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
24980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24990 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
249a0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
249b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
249c0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
249d0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
249e0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
249f0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
24a00 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
24a10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
24a20 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
24a30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24a40 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
24a50 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24a60 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
24a70 20 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20       /* Failure 
24a80 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20  to set the bits 
24a90 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c  in the InJournal
24aa0 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20   bit-vectors is 
24ab0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20  benign..        
24ac0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61  ** It merely mea
24ad0 6e 73 20 74 68 61 74 20 77 65 20 6d 69 67 68 74  ns that we might
24ae0 20 64 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77   do some extra w
24af0 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61  ork to journal a
24b00 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67   .        ** pag
24b10 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
24b20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e  need to be journ
24b30 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c  aled.  Neverthel
24b40 65 73 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20  ess, be sure .  
24b50 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74        ** to test
24b60 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20   the case where 
24b70 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  a malloc error o
24b80 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69  ccurs while tryi
24b90 6e 67 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20  ng to set .     
24ba0 20 20 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61     ** a bit in a
24bb0 20 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20   bit vector..   
24bc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
24bd0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
24be0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
24bf0 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
24c00 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
24c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45   ){.          TE
24c20 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73  STONLY( rc = ) s
24c30 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
24c40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
24c50 61 6c 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  al, pgno);.     
24c60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
24c70 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
24c80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24c90 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72       TESTONLY( r
24ca0 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
24cb0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
24cc0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  er, pgno);.     
24cd0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
24ce0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
24cf0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24d00 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
24d10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
24d20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
24d30 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50  Pg->pData, 0, pP
24d40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
24d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
24d60 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
24d70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
24d80 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
24d90 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
24da0 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
24db0 61 67 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63  ager );.      rc
24dc0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
24dd0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
24de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24df0 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70         pagerDrop
24e00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
24e10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24e20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
24e30 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
24e40 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
24e50 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
24e60 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
24e70 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
24e80 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
24e90 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
24ea0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
24eb0 2f 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  /.    PAGER_INCR
24ec0 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
24ed0 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
24ee0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
24ef0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
24f00 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
24f10 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
24f20 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
24f30 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
24f40 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
24f50 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
24f60 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
24f70 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
24f80 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
24f90 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
24fa0 65 2e 20 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20  e. Also, return 
24fb0 30 20 69 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  0 if the .** pag
24fc0 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 55  er is in PAGER_U
24fd0 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e  NLOCK state when
24fe0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
24ff0 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20  s called,.** or 
25000 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  if the pager is 
25010 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
25020 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
25030 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  ITE_FULL..**.** 
25040 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
25050 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68 65  PagerGet().  The
25060 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
25070 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
25080 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 50  .** and sqlite3P
25090 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68 61  agerGet() is tha
250a0 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f  t _get() will go
250b0 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64   to the disk and
250c0 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
250d0 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65  page if the page
250e0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
250f0 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20  in cache.  This 
25100 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
25110 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70  ns NULL if the p
25120 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
25130 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b  che or if a disk
25140 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68   I/O error .** h
25150 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64  as ever happened
25160 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c  ..*/.DbPage *sql
25170 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
25180 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
25190 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
251a0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61  dr *pPg = 0;.  a
251b0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
251c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
251d0 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
251e0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d  (pPager->state!=
251f0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20  PAGER_UNLOCK).  
25200 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72 72   && (pPager->err
25210 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
25220 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
25230 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  de==SQLITE_FULL)
25240 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  .  ){.    sqlite
25250 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
25260 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
25270 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20  no, 0, &pPg);.  
25280 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  }..  return pPg;
25290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
252a0 65 20 61 20 70 61 67 65 20 72 65 66 65 72 65 6e  e a page referen
252b0 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ce..**.** If the
252c0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
252d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
252e0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
252f0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
25300 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
25310 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
25320 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
25330 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
25340 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
25350 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
25360 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
25370 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
25380 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76  ** removed..*/.v
25390 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
253a0 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50  Unref(DbPage *pP
253b0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b  g){.  if( pPg ){
253c0 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
253d0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
253e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
253f0 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
25400 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
25410 49 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29  IfUnused(pPager)
25420 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
25430 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
25440 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72 65  al file has alre
25450 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  ady been opened,
25460 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
25470 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  .** sub-journal 
25480 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f  file is open too
25490 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  . If the main jo
254a0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65  urnal is not ope
254b0 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  n,.** this funct
254c0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
254d0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
254e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
254f0 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20 61  verything goes a
25500 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e  ccording to plan
25510 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f  . .** An SQLITE_
25520 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20  IOERR_XXX error 
25530 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
25540 20 69 66 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a   if a call to .*
25550 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  * sqlite3OsOpen(
25560 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ) fails..*/.stat
25570 69 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f  ic int openSubJo
25580 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
25590 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
255a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
255b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
255c0 3e 6a 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e  >jfd) && !isOpen
255d0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
255e0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
255f0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
25600 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
25610 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
25620 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
25630 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
25640 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
25650 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
25660 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
25670 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  , pPager->sjfd, 
25680 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
25690 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20  OURNAL);.    }. 
256a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
256b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
256c0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
256d0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
256e0 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
256f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
25700 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
25710 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
25720 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
25730 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25740 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
25750 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
25760 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
25770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25780 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
25790 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
257a0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
257b0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
257c0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
257d0 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
257e0 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
257f0 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
25800 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
25810 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
25820 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
25830 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
25840 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
25850 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
25860 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
25870 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
25880 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
25890 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
258a0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
258b0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
258c0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
258d0 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
258e0 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
258f0 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
25900 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
25910 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
25920 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
25930 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
25940 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
25950 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
25960 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
25970 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
25980 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
25990 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
259a0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
259b0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
259c0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
259d0 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
259e0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
259f0 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
25a00 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
25a10 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
25a20 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
25a30 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
25a40 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
25a50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
25a60 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
25a70 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
25a80 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
25a90 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
25aa0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
25ab0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
25ac0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
25ad0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25ae0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25af0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
25b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25b10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73  turn code */.  s
25b20 71 6c 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e  qlite3_vfs * con
25b30 73 74 20 70 56 66 73 20 3d 20 70 50 61 67 65 72  st pVfs = pPager
25b40 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63  ->pVfs;   /* Loc
25b50 61 6c 20 63 61 63 68 65 20 6f 66 20 76 66 73 20  al cache of vfs 
25b60 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73  pointer */..  as
25b70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25b80 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
25b90 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
25ba0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
25bb0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
25bc0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
25bd0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f  nal==0 );.  .  /
25be0 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e 20  * If already in 
25bf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
25c00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25c10 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
25c20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
25c30 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
25c40 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
25c50 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44  e;.  }..  /* TOD
25c60 4f 3a 20 49 73 20 69 74 20 72 65 61 6c 6c 79 20  O: Is it really 
25c70 70 6f 73 73 69 62 6c 65 20 74 6f 20 67 65 74 20  possible to get 
25c80 68 65 72 65 20 77 69 74 68 20 64 62 53 69 7a 65  here with dbSize
25c90 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74  Valid==0? If not
25ca0 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20  ,.  ** the call 
25cb0 74 6f 20 50 61 67 65 72 50 61 67 65 63 6f 75 6e  to PagerPagecoun
25cc0 74 28 29 20 63 61 6e 20 62 65 20 72 65 6d 6f 76  t() can be remov
25cd0 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  ed..  */.  testc
25ce0 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ase( pPager->dbS
25cf0 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20  izeValid==0 );. 
25d00 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25d10 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
25d20 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 70 49  );..  pPager->pI
25d30 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
25d40 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
25d50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
25d60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
25d70 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20  nJournal==0 ){. 
25d80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25d90 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
25da0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
25db0 61 6c 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  al file if it is
25dc0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
25dd0 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  n. */.  if( !isO
25de0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25df0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
25e00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
25e10 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
25e20 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
25e30 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
25e40 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
25e50 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  >jfd);.    }else
25e60 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  {.      const in
25e70 74 20 66 6c 61 67 73 20 3d 20 20 20 20 20 20 20  t flags =       
25e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
25e90 46 53 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  FS flags to open
25ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
25eb0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25ec0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
25ed0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
25ee0 45 7c 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  E|.        (pPag
25ef0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a  er->tempFile ? .
25f00 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
25f10 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
25f20 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  LOSE|SQLITE_OPEN
25f30 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a  _TEMP_JOURNAL):.
25f40 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
25f50 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
25f60 4e 41 4c 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  NAL).        );.
25f70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
25f80 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
25f90 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  E.      rc = sql
25fa0 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  ite3JournalOpen(
25fb0 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c  .          pVfs,
25fc0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
25fd0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
25fe0 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
25ff0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
26000 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
26010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26020 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
26030 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
26040 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
26050 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
26060 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
26070 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
26080 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26090 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  fd) );.  }...  /
260a0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 72 73  * Write the firs
260b0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
260c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
260d0 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20  file and open . 
260e0 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
260f0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
26100 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
26110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26120 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
26130 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 73 65   if all of these
26140 20 61 72 65 20 72 65 61 6c 6c 79 20 72 65 71 75   are really requ
26150 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61  ired. */.    pPa
26160 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
26170 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
26180 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
26190 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
261a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
261b0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
261c0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
261d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
261e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
261f0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
26200 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
26210 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
26220 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  = 0;.    rc = wr
26230 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
26240 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
26250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26260 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
26270 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72 63 20 3d  oint ){.    rc =
26280 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
26290 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
262a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
262b0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
262c0 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
262d0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
262e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
262f0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
26300 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
26310 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
26320 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
26330 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  on on the specif
26340 69 65 64 20 70 61 67 65 72 20 6f 62 6a 65 63 74  ied pager object
26350 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72 69 74 65  . If a .** write
26360 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73  -transaction has
26370 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
26380 65 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ened, this funct
26390 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
263a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 46  **.** If the exF
263b0 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
263c0 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 63 71 75  false, then acqu
263d0 69 72 65 20 61 74 20 6c 65 61 73 74 20 61 20 52  ire at least a R
263e0 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
263f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26400 66 69 6c 65 2e 20 49 66 20 65 78 46 6c 61 67 20  file. If exFlag 
26410 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 63  is true, then ac
26420 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 0a 2a  quire at least.*
26430 2a 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  * an EXCLUSIVE l
26440 6f 63 6b 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ock. If such a l
26450 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
26460 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20  eld, no locking 
26470 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65  .** functions ne
26480 65 64 20 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ed be called..**
26490 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e  .** If this is n
264a0 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 6f  ot a temporary o
264b0 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  r in-memory file
264c0 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61   and, the journa
264d0 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70  l file is .** op
264e0 65 6e 65 64 20 69 66 20 69 74 20 68 61 73 20 6e  ened if it has n
264f0 6f 74 20 62 65 65 6e 20 61 6c 72 65 61 64 79 2e  ot been already.
26500 20 46 6f 72 20 61 20 74 65 6d 70 6f 72 61 72 79   For a temporary
26510 20 66 69 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69   file, the openi
26520 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  ng .** of the jo
26530 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
26540 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
26550 72 65 20 69 73 20 61 6e 20 61 63 74 75 61 6c 20  re is an actual 
26560 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74  need to .** writ
26570 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
26580 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64  . TODO: Why hand
26590 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  le temporary fil
265a0 65 73 20 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a  es differently?.
265b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
265c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
265d0 6e 65 64 20 28 6f 72 20 69 66 20 69 74 20 69 73  ned (or if it is
265e0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 2c 20   already open), 
265f0 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  then a.** journa
26600 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l-header is writ
26610 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74  ten to the start
26620 20 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73   of it..*/.int s
26630 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
26640 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26650 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 69  int exFlag){.  i
26660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26670 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  K;.  assert( pPa
26680 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
26690 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
266a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
266b0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
266c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
266d0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
266e0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
266f0 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61  ( !MEMDB && !pPa
26700 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
26710 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20  ..    /* Obtain 
26720 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
26730 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
26740 66 69 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46  file. If the exF
26750 6c 61 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20  lag parameter.  
26760 20 20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68    ** is true, th
26770 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75  en immediately u
26780 70 67 72 61 64 65 20 74 68 69 73 20 74 6f 20 61  pgrade this to a
26790 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
267a0 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73  . The.    ** bus
267b0 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
267c0 63 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ck can be used w
267d0 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f  hen upgrading to
267e0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20   the EXCLUSIVE. 
267f0 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20     ** lock, but 
26800 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69  not when obtaini
26810 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ng the RESERVED 
26820 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
26830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
26840 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
26850 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
26860 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
26880 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
26890 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
268a0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
268b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
268c0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
268d0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
268e0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
268f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
26900 2a 20 49 66 20 74 68 65 20 72 65 71 75 69 72 65  * If the require
26910 64 20 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63  d locks were suc
26920 63 65 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e  cessfully obtain
26930 65 64 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75  ed, open the jou
26940 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
26950 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 66   and write the f
26960 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
26970 64 65 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  der to it..    *
26980 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
26990 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
269a0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
269b0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
269c0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
269d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
269e0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72   .    ){.      r
269f0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
26a00 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
26a10 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
26a20 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
26a30 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
26a40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
26a50 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
26a60 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
26a70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
26a80 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
26a90 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a  e the last.    *
26aa0 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
26ab0 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
26ac0 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
26ad0 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
26ae0 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
26af0 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
26b00 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
26b10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26b20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
26b30 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74  ept open and eit
26b40 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65  her was truncate
26b50 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20  d to 0 bytes or 
26b60 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20  its header was. 
26b70 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65     ** overwritte
26b80 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
26b90 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
26ba0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30   pPager->nRec==0
26bb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26bc0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
26bd0 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
26be0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
26bf0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
26c00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
26c10 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
26c20 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
26c30 52 41 43 45 28 28 22 54 52 41 4e 53 41 43 54 49  RACE(("TRANSACTI
26c40 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
26c50 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
26c60 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
26c70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
26c80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
26c90 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
26ca0 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
26cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
26cc0 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
26cd0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
26ce0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
26cf0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
26d00 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
26d10 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
26d20 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
26d30 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
26d40 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
26d50 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
26d60 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
26d70 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
26d80 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
26d90 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
26da0 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
26db0 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
26dc0 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
26dd0 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
26de0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
26df0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
26e00 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
26e10 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
26e20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
26e30 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
26e40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
26e50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
26e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26e70 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
26e80 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
26e90 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
26ea0 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
26eb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26ec0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
26ed0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
26ee0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26ef0 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
26f00 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
26f10 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
26f20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
26f30 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
26f40 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
26f50 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
26f60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
26f70 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
26f80 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
26f90 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
26fa0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
26fb0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
26fc0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
26fd0 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
26fe0 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
26ff0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
27000 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
27010 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20  Modified = 1;.  
27020 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
27030 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
27040 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
27050 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
27060 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
27070 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
27080 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
27090 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
270a0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
270b0 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
270c0 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
270d0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
270e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
270f0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
27100 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
27110 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
27120 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
27130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27140 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
27150 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
27160 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
27170 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
27180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
271a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
271b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
271c0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
271d0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
271e0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
271f0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
27200 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20  ->useJournal.   
27210 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
27220 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
27230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27240 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63  _OFF ){.      rc
27250 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
27260 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27270 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
27280 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
27290 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
272a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
272b0 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
272c0 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
272d0 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
272e0 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
272f0 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
27300 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
27310 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
27320 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
27330 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
27340 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
27350 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
27360 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
27370 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
27380 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
27390 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75    if( !pageInJou
273a0 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f  rnal(pPg) && isO
273b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
273c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
273d0 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
273e0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
273f0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
27400 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
27410 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
27420 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65   /* We should ne
27430 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65  ver write to the
27440 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
27450 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20  e page that.    
27460 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
27470 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
27480 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ks.  The followi
27490 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66 69  ng assert verifi
274a0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
274b0 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
274c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
274d0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
274e0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
274f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61  ) );.        pDa
27500 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
27510 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
27520 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
27530 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
27540 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
27550 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
27560 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
27570 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
27580 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
27590 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f  alOff, pPg->pgno
275a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
275b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
275c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
275d0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
275e0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
275f0 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  2, pPager->pageS
27600 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ize,.           
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27620 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27630 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20  alOff + 4);.    
27640 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27650 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
27660 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a  er->pageSize+4;.
27670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
276a0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
276b0 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
276c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
276d0 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20  f, cksum);.     
276e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
276f0 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
27700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27710 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25  IOTRACE(("JOUT %
27720 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c  p %d %lld %d\n",
27730 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
27740 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
27750 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27760 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72  urnalOff, pPager
27770 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20  ->pageSize));.  
27780 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
27790 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  (sqlite3_pager_w
277a0 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20  ritej_count);.  
277b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
277c0 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  (("JOURNAL %d pa
277d0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
277e0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
277f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41  .             PA
27800 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
27810 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
27820 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
27830 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
27840 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65  SYNC)?1:0), page
27850 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
27860 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  );..        /* E
27870 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20  ven if an IO or 
27880 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f  diskfull error o
27890 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f  ccurred while jo
278a0 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20  urnalling the.  
278b0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
278c0 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65   the block above
278d0 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73  , set the need-s
278e0 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65  ync flag for the
278f0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
27900 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65  * Otherwise, whe
27910 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
27920 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
27930 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20  , the logic in. 
27940 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61         ** playba
27950 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69  ck_one_page() wi
27960 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68  ll think that th
27970 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
27980 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20  be restored.    
27990 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61      ** in the da
279a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64  tabase file. And
279b0 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   if an IO error 
279c0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69  occurs while doi
279d0 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a  ng so,.        *
279e0 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f  * then corruptio
279f0 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20  n may follow..  
27a00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27a10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27a20 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
27a30 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
27a40 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
27a50 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
27a60 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
27a70 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
27a80 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
27a90 68 61 73 20 6f 63 63 75 72 72 65 64 20 77 72 69  has occurred wri
27aa0 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
27ab0 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
27ac0 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
27ad0 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
27ae0 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
27af0 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
27b00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27b10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27b30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
27b40 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
27b50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
27b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
27b70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27b80 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
27b90 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
27ba0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
27bb0 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
27bc0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
27bd0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
27be0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
27bf0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
27c00 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
27c10 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
27c20 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
27c30 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
27c40 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
27c50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
27c60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27c70 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
27c80 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
27c90 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
27ca0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
27cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27cc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
27cd0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
27ce0 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
27cf0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
27d00 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
27d10 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
27d20 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
27d30 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
27d40 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
27d50 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
27d60 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
27d70 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
27d80 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
27d90 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
27da0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
27db0 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
27dc0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
27dd0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
27de0 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
27df0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
27e00 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
27e10 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
27e20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
27e30 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
27e40 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
27e50 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
27e60 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
27e70 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
27e80 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
27e90 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
27ea0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
27eb0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
27ec0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
27ed0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
27ee0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
27ef0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
27f00 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
27f10 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
27f20 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
27f30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
27f40 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
27f50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
27f60 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
27f70 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
27f80 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
27f90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
27fa0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
27fb0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
27fc0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
27fd0 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
27fe0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
27ff0 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65  ->pgno;.  }.  re
28000 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28010 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
28020 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
28030 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
28040 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
28050 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63  ore .** making c
28060 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
28070 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
28080 74 20 63 68 65 63 6b 20 74 68 65 20 72 65 74 75  t check the retu
28090 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  rn value .** of 
280a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
280b0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
280c0 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79 20 70   to change any p
280d0 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73 73 20  age data unless 
280e0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
280f0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
28100 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  OK..**.** The di
28110 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
28120 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
28130 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
28140 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
28150 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
28160 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
28170 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
28180 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
28190 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
281a0 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
281b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
281c0 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
281d0 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
281e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
281f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
28200 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
28210 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
28220 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 53 51  error occurs, SQ
28230 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
28240 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
28250 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73  s returned.** as
28260 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 4f 74   appropriate. Ot
28270 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
28280 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
28290 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
282a0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
282b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
282c0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
282d0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
282e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
282f0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
28300 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
28310 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
28320 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
28330 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
28340 66 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  f( nPagePerSecto
28350 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  r>1 ){.    Pgno 
28360 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20  nPageCount;     
28370 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
28380 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
28390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
283a0 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20  /.    Pgno pg1; 
283b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283c0 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66  /* First page of
283d0 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
283e0 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a  is located on. *
283f0 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b  /.    int nPage;
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
28420 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  es starting at p
28430 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  g1 to journal */
28440 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20  .    int ii;    
28450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28460 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28470 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  /.    int needSy
28480 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nc = 0;         
28490 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70  /* True if any p
284a0 61 67 65 20 68 61 73 20 50 47 48 44 52 5f 4e 45  age has PGHDR_NE
284b0 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20  ED_SYNC */..    
284c0 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
284d0 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
284e0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
284f0 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
28500 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
28510 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
28520 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
28530 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
28540 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
28550 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
28560 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
28570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
28580 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
28590 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
285a0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
285b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
285c0 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
285d0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
285e0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
285f0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
28600 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
28610 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
28620 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
28630 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
28640 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
28650 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
28660 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
28670 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
28680 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
28690 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
286a0 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
286b0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ;..    sqlite3Pa
286c0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
286d0 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
286e0 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66  geCount);.    if
286f0 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
28700 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
28710 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
28720 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
28730 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
28740 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
28750 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
28760 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
28770 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
28780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28790 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
287a0 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
287b0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
287c0 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
287d0 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
287e0 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
287f0 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
28800 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
28810 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
28820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
28830 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
28840 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
28850 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
28860 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
28870 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
28880 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
28890 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
288a0 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
288b0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
288c0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
288d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
288e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
288f0 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
28900 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
28920 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28930 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
28940 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
28950 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
28960 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28970 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
28980 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
28990 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
289a0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
289b0 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
289c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
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 20 20 7d 0a 20 20  ;.          }.  
28a00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
28a10 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
28a20 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
28a30 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
28a40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
28a50 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
28a60 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
28a70 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
28a80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
28a90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
28aa0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
28ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
28ac0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
28ad0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
28ae0 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
28af0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
28b00 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
28b10 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
28b20 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
28b30 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
28b40 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
28b50 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
28b60 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
28b70 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
28b80 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
28b90 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
28ba0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
28bb0 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
28bc0 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
28bd0 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
28be0 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
28bf0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
28c00 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
28c10 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
28c20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
28c30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28c40 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
28c50 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
28c60 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
28c70 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
28c80 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
28c90 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
28ca0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
28cb0 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
28cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
28cd0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
28ce0 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
28cf0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
28d00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
28d10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
28d20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
28d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
28d40 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
28d50 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
28d60 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28d70 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
28d80 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
28d90 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
28da0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
28db0 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
28dc0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
28dd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28de0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
28df0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
28e00 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
28e10 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
28e20 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
28e30 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
28e40 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
28e50 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
28e60 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
28e70 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
28e80 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
28e90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
28ea0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28eb0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
28ec0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
28ed0 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
28ee0 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
28ef0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
28f00 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
28f10 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
28f20 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
28f30 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
28f40 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
28f50 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
28f60 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
28f70 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
28f80 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
28f90 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
28fa0 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
28fb0 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
28fc0 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
28fd0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
28fe0 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
28ff0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
29000 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
29010 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
29020 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
29030 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
29040 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
29050 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
29060 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
29070 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
29080 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
29090 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b  . The pager mark
290a0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
290b0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
290c0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
290d0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
290e0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
290f0 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
29100 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64  ization can quad
29110 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
29120 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c  of large .** DEL
29130 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a  ETE operations..
29140 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
29150 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67  agerDontWrite(Pg
29160 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
29170 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29180 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
29190 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
291a0 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61 67  R_DIRTY) && pPag
291b0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
291c0 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  0 ){.    PAGERTR
291d0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
291e0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
291f0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
29200 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
29210 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43  .    IOTRACE(("C
29220 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  LEAN %p %d\n", p
29230 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
29240 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  )).    pPg->flag
29250 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
29260 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
29270 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
29280 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
29290 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
292a0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
292b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
292c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
292d0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
292e0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
292f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29300 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e   .** change-coun
29310 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ter, stored as a
29320 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
29330 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61 72 74  an integer start
29340 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20  ing at .** byte 
29350 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
29360 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a   pager file..**.
29370 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69 72 65  ** If the isDire
29380 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c  ct flag is zero,
29390 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f   then this is do
293a0 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a  ne by calling .*
293b0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
293c0 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c  ite() on page 1,
293d0 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20   then modifying 
293e0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
293f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  the.** page data
29400 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
29410 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  he file will be 
29420 75 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  updated when the
29430 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
29440 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
29450 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
29460 69 73 44 69 72 65 63 74 20 66 6c 61 67 20 6d 61  isDirect flag ma
29470 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65  y only be non-ze
29480 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72 61 72  ro if the librar
29490 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a  y was compiled.*
294a0 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  * with the 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 20 6d 61 63 72 6f 20 64 65 66 69  WRITE macro defi
294d0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
294e0 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63  e,.** if isDirec
294f0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  t is non-zero, t
29500 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
29510 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65 64   file is updated
29520 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20   directly.** by 
29530 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74  writing an updat
29540 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  ed version of pa
29550 67 65 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c  ge 1 using a cal
29560 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c  l to the .** sql
29570 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 66 75  ite3OsWrite() fu
29580 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
29590 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
295a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
295b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
295c0 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b  t isDirectMode){
295d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
295e0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63  TE_OK;..  /* Dec
295f0 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  lare and initial
29600 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  ize constant int
29610 65 67 65 72 20 27 69 73 44 69 72 65 63 74 27 2e  eger 'isDirect'.
29620 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f   If the.  ** ato
29630 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
29640 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  zation is enable
29650 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c  d in this build,
29660 20 74 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20   then isDirect. 
29670 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a   ** is initializ
29680 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ed to the value 
29690 70 61 73 73 65 64 20 61 73 20 74 68 65 20 69 73  passed as the is
296a0 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d  DirectMode param
296b0 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69  eter.  ** to thi
296c0 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65  s function. Othe
296d0 72 77 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77  rwise, it is alw
296e0 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e  ays set to zero.
296f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69  .  **.  ** The i
29700 64 65 61 20 69 73 20 74 68 61 74 20 69 66 20 74  dea is that if t
29710 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
29720 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
29730 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64  not.  ** enabled
29740 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
29750 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63  , the compiler c
29760 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74  an omit the test
29770 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72  s of.  ** 'isDir
29780 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77  ect' below, as w
29790 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b  ell as the block
297a0 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65   enclosed in the
297b0 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72  .  ** "if( isDir
297c0 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e  ect )" condition
297d0 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
297e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
297f0 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e 73  MIC_WRITE.  cons
29800 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d  t int isDirect =
29810 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73   0;.  assert( is
29820 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
29830 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29840 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
29850 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  );.#else.  const
29860 20 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20   int isDirect = 
29870 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23 65  isDirectMode;.#e
29880 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
29890 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
298a0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
298b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
298c0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
298d0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
298e0 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72  e>0 ){.    PgHdr
298f0 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20 20 20   *pPgHdr;       
29900 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
29910 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
29920 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67  */.    u32 chang
29930 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  e_counter;      
29940 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
29950 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d  value of change-
29960 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f  counter field */
29970 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  ..    assert( !p
29980 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
29990 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
299a0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  ->fd) );..    /*
299b0 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
299c0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
299d0 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
299e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
299f0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
29a00 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  gHdr);.    asser
29a10 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20  t( pPgHdr==0 || 
29a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
29a30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65  ..    /* If page
29a40 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68 65 64   one was fetched
29a50 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61   successfully, a
29a60 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29a70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f   is not.    ** o
29a80 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65  perating in dire
29a90 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61  ct-mode, make pa
29aa0 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e 0a 20  ge 1 writable.. 
29ab0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
29ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
29ad0 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
29ae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29af0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
29b00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
29b10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29b20 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65  {.      /* Incre
29b30 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
29b40 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
29b50 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
29b60 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20  te 24. */.      
29b70 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
29b80 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
29b90 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62  ((u8*)pPager->db
29ba0 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20  FileVers);.     
29bb0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
29bc0 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32 62 69  +;.      put32bi
29bd0 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64  ts(((char*)pPgHd
29be0 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68  r->pData)+24, ch
29bf0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a  ange_counter);..
29c00 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e        /* If runn
29c10 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f  ing in direct mo
29c20 64 65 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f  de, write the co
29c30 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31  ntents of page 1
29c40 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f   to the file. */
29c50 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 72  .      if( isDir
29c60 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ect ){.        c
29c70 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
29c80 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
29c90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
29ca0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
29cb0 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  ize>0 );.       
29cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
29cd0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
29ce0 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
29cf0 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20  ageSize, 0);.   
29d00 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
29d10 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
29d20 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63 68 61  ked, set the cha
29d30 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
29d40 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
29d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29d60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
29d70 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
29d80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
29d90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
29da0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
29db0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
29dc0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
29dd0 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20  (pPgHdr);.  }.  
29de0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29df0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
29e00 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
29e10 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
29e20 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66   for in-memory f
29e30 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73  iles.** or pages
29e40 20 77 69 74 68 20 74 68 65 20 50 61 67 65 72 2e   with the Pager.
29e50 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e  noSync flag set.
29e60 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
29e70 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20  sful, or called 
29e80 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72 20 77  on a pager for w
29e90 68 69 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d  hich it is a no-
29ea0 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  op, this.** func
29eb0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
29ec0 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73  ITE_OK. Otherwis
29ed0 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  e, an IO error c
29ee0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
29ef0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29f00 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
29f10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
29f20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
29f50 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c  /.  if( MEMDB ||
29f60 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
29f70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
29f80 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
29f90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29fa0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
29fb0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
29fc0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
29fd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29fe0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
29ff0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
2a000 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
2a010 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
2a020 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
2a030 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
2a040 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
2a050 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
2a060 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
2a070 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
2a080 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
2a090 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
2a0a0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
2a0b0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
2a0c0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
2a0d0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
2a0e0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
2a0f0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
2a100 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  that:.**.**   * 
2a110 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
2a120 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2a130 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
2a140 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20    * the journal 
2a150 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73  is synced (unles
2a160 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
2a170 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2a180 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a  is used),.**   *
2a190 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
2a1a0 20 61 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20   are written to 
2a1b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a1c0 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64  e, .**   * the d
2a1d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2a1e0 74 72 75 6e 63 61 74 65 64 20 28 69 66 20 72 65  truncated (if re
2a1f0 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20  quired), and.** 
2a200 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65    * the database
2a210 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a   file synced. .*
2a220 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68  *.** The only th
2a230 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73  ing that remains
2a240 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
2a250 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
2a260 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64   finalize .** (d
2a270 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20  elete, truncate 
2a280 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73  or zero the firs
2a290 74 20 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a  t part of) the j
2a2a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20  ournal file (or 
2a2b0 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d  .** delete the m
2a2c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
2a2d0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
2a2e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
2a2f0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
2a300 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
2a310 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
2a320 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
2a330 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
2a340 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
2a350 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
2a360 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e  **.** If the fin
2a370 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e  al parameter - n
2a380 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c  oSync - is true,
2a390 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2a3a0 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a  se file itself.*
2a3b0 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e  * is not synced.
2a3c0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
2a3d0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2a3e0 65 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c  erSync() directl
2a3f0 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65  y to.** sync the
2a400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
2a410 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f  efore calling Co
2a420 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74  mmitPhaseTwo() t
2a430 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  o delete the.** 
2a440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
2a450 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e  this case..*/.in
2a460 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2a470 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20  mmitPhaseOne(.  
2a480 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
2a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4a0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
2a4b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2a4c0 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20  *zMaster,       
2a4d0 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
2a4e0 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20  ULL, the master 
2a4f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
2a500 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20    int noSync    
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69    /* True to omi
2a530 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74  t the xSync on t
2a540 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b  he db file */.){
2a550 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a560 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2a570 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2a580 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  e */..  if( pPag
2a590 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
2a5a0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
2a5b0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
2a5c0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44    PAGERTRACE(("D
2a5d0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
2a5e0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
2a5f0 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20   nSize=%d\n", . 
2a600 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
2a610 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
2a620 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
2a630 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
2a640 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2a650 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
2a660 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2a670 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
2a680 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
2a690 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
2a6a0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
2a6b0 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
2a6c0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2a6d0 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20  >dbModified ){. 
2a6e0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
2a6f0 52 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e  Restart(pPager->
2a700 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73  pBackup);.  }els
2a710 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
2a720 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
2a730 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  D && pPager->dbM
2a740 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20  odified ){..    
2a750 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2a760 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74   block updates t
2a770 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2a780 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69  r. Exactly how i
2a790 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68  t.    ** does th
2a7a0 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  is depends on wh
2a7b0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
2a7c0 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f   atomic-update o
2a7d0 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2a7e0 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
2a7f0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2a800 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
2a810 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
2a820 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d  e .    ** runtim
2a830 65 20 63 72 69 74 65 72 69 61 20 74 6f 20 75 73  e criteria to us
2a840 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a  e the operation:
2a850 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2a860 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79     * The file-sy
2a870 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68  stem supports th
2a880 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
2a890 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20  roperty for.    
2a8a0 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f  **      blocks o
2a8b0 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65  f size page-size
2a8c0 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20  , and .    **   
2a8d0 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   * This commit i
2a8e0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
2a8f0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
2a900 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
2a910 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20  **    * Exactly 
2a920 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
2a930 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
2a940 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
2a950 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
2a960 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
2a970 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
2a980 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
2a990 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
2a9a0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  n the.    ** pag
2a9b0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2a9c0 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  unter() function
2a9d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70   is called to up
2a9e0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a  date the change.
2a9f0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69      ** counter i
2aa00 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65  n 'indirect-mode
2aa10 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69  '. If the optimi
2aa20 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c  zation is compil
2aa30 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a  ed in but.    **
2aa40 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62   is not applicab
2aa50 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73  le to this trans
2aa60 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c  action, call sql
2aa70 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2aa80 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  e().    ** to ma
2aa90 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72  ke sure the jour
2aaa0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74  nal file has act
2aab0 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74  ually been creat
2aac0 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20  ed, then call.  
2aad0 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    ** pager_incr_
2aae0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2aaf0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2ab00 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20  ange-counter in 
2ab10 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20  indirect.    ** 
2ab20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  mode. .    **.  
2ab30 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
2ab40 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
2ab50 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
2ab60 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
2ab70 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  le,.    ** then 
2ab80 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f  call pager_incr_
2ab90 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
2aba0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2abb0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20  ange-counter.   
2abc0 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20   ** in 'direct' 
2abd0 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  mode. In this ca
2abe0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
2abf0 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  ile will never b
2ac00 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64  e.    ** created
2ac10 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61   for this transa
2ac20 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69  ction..    */.#i
2ac30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2ac40 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
2ac50 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
2ac60 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
2ac70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2ac80 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
2ac90 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
2aca0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2acb0 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
2acc0 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
2acd0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26  er->jfd) .     &
2ace0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2acf0 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72  lOff==jrnlBuffer
2ad00 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20  Size(pPager) .  
2ad10 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62     && pPager->db
2ad20 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62  Size>=pPager->db
2ad30 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26  FileSize.     &&
2ad40 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69   (0==(pPg = sqli
2ad50 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
2ad60 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
2ad70 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e  he)) || 0==pPg->
2ad80 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20  pDirty).    ){. 
2ad90 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2ada0 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67  he db file chang
2adb0 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68  e counter via th
2adc0 65 20 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d  e direct-write m
2add0 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20  ethod. The .    
2ade0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63    ** following c
2adf0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20  all will modify 
2ae00 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
2ae10 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2ae20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2ae30 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
2ae40 75 70 64 61 74 65 64 20 63 68 61 6e 67 65 20 63  updated change c
2ae50 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
2ae60 77 72 69 74 65 20 70 61 67 65 20 31 20 0a 20 20  write page 1 .  
2ae70 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
2ae80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2ae90 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
2aea0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2aeb0 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70  e .      ** prop
2aec0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
2aed0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
2aee0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
2aef0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2af00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2af10 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2af20 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   1);.    }else{.
2af30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2af40 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2af50 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
2af60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2af70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2af80 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2af90 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2afa0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2afb0 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20   }.    }.#else. 
2afc0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2afd0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2afe0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e  (pPager, 0);.#en
2aff0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d  dif.    if( rc!=
2b000 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2b010 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2b020 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2b030 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
2b040 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
2b050 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
2b060 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
2b070 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64  s.    ** being d
2b080 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
2b090 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
2b0a0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
2b0b0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
2b0c0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20   file. This can 
2b0d0 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61  only happen in a
2b0e0 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e  uto-vacuum mode.
2b0f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42  .    **.    ** B
2b100 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68  efore reading th
2b110 65 20 70 61 67 65 73 20 77 69 74 68 20 70 61 67  e pages with pag
2b120 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72  e numbers larger
2b130 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a   than the .    *
2b140 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  * current value 
2b150 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
2b160 20 73 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b   set dbSize back
2b170 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20   to the value.  
2b180 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f    ** that it too
2b190 6b 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  k at the start o
2b1a0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
2b1b0 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  n. Otherwise, th
2b1c0 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74  e.    ** calls t
2b1d0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
2b1e0 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65  t() return zeroe
2b1f0 64 20 70 61 67 65 73 20 69 6e 73 74 65 61 64 20  d pages instead 
2b200 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  of .    ** readi
2b210 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ng data from the
2b220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2b230 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
2b240 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b250 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2b260 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61  ager->dbSize<pPa
2b270 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a  ger->dbOrigSize.
2b280 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2b290 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
2b2a0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2b2b0 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  FF .    ){.     
2b2c0 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20   Pgno i;        
2b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2b2f0 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
2b300 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50  */.      const P
2b310 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45  gno iSkip = PAGE
2b320 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
2b330 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f  ); /* Pending lo
2b340 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ck page */.     
2b350 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69   const Pgno dbSi
2b360 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
2b370 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  ize;       /* Da
2b380 74 61 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a  tabase image siz
2b390 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67  e */ .      pPag
2b3a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
2b3b0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2b3c0 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62  .      for( i=db
2b3d0 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65  Size+1; i<=pPage
2b3e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69  r->dbOrigSize; i
2b3f0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ++ ){.        if
2b400 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
2b410 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
2b420 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
2b430 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
2b440 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
2b450 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2b460 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61  * Page to journa
2b470 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  l */.          r
2b480 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b490 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
2b4a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2b4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b4c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2b4d0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2b4e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2b4f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b500 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  te(pPage);.     
2b510 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2b520 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
2b530 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2b540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2b550 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  o commit_phase_o
2b560 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  ne_exit;.       
2b570 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20   }.      } .    
2b580 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
2b590 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d   = dbSize;.    }
2b5a0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
2b5b0 57 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72  Write the master
2b5c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
2b5d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2b5e0 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72  ile. If a master
2b5f0 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c   .    ** journal
2b600 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
2b610 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
2b620 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
2b630 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a  al file, .    **
2b640 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69   or if zMaster i
2b650 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65  s NULL (no maste
2b660 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e  r journal), then
2b670 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
2b680 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  no-op..    */.  
2b690 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
2b6a0 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
2b6b0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
2b6c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b6d0 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2b6e0 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2b6f0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
2b700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2b710 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  f the atomic-upd
2b720 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2b730 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
2b740 20 75 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c   used, this call
2b750 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65   will not create
2b760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2b770 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79  e or perform any
2b780 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e  .    ** real IO.
2b790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2b7a0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
2b7b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
2b7c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2b7d0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2b7e0 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2b7f0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
2b800 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
2b810 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
2b820 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2b830 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73  write_pagelist(s
2b840 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
2b850 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
2b860 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28  Cache));.    if(
2b870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b880 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2b890 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
2b8a0 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
2b8b0 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68    goto commit_ph
2b8c0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2b8d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
2b8e0 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50  cacheCleanAll(pP
2b8f0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2b900 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
2b910 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e  ile on disk is n
2b920 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  ot the same size
2b930 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65   as the database
2b940 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74   image,.    ** t
2b950 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72  hen use pager_tr
2b960 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f  uncate to grow o
2b970 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c  r shrink the fil
2b980 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  e here..    */. 
2b990 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
2b9a0 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64  bSize!=pPager->d
2b9b0 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
2b9c0 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70     Pgno nNew = p
2b9d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20  Pager->dbSize - 
2b9e0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d  (pPager->dbSize=
2b9f0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
2ba00 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61  Pager));.      a
2ba10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2ba20 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
2ba30 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72  USIVE );.      r
2ba40 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
2ba50 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29  te(pPager, nNew)
2ba60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2ba70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2ba80 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2ba90 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  e_exit;.    }.. 
2baa0 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73     /* Finally, s
2bab0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
2bac0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
2bad0 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
2bae0 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
2baf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bb00 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2bb10 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2bb20 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
2bb30 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
2bb40 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
2bb50 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
2bb60 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
2bb70 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d  SYNCED;.  }..com
2bb80 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2bb90 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
2bba0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2bbb0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
2bbc0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2bbd0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
2bbe0 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
2bbf0 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 2a   exclusive.    *
2bc00 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
2bc10 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
2bc20 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
2bc30 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
2bc40 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e     ** there is n
2bc50 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
2bc60 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
2bc70 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  nt, it is.    **
2bc80 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
2bc90 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
2bca0 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d 20     **/.    rc = 
2bcb0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
2bcc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bcd0 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
2bce0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2bcf0 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61 62 61  lled, the databa
2bd00 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
2bd10 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75   completely.** u
2bd20 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63  pdated to reflec
2bd30 74 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61  t the changes ma
2bd40 64 65 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  de by the curren
2bd50 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  t transaction an
2bd60 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64  d.** synced to d
2bd70 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  isk. The journal
2bd80 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73   file still exis
2bd90 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ts in the file-s
2bda0 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68  ystem .** though
2bdb0 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75  , and if a failu
2bdc0 72 65 20 6f 63 63 75 72 73 20 61 74 20 74 68 69  re occurs at thi
2bdd0 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20  s point it will 
2bde0 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65  eventually.** be
2bdf0 20 75 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a   used as a hot-j
2be00 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63  ournal and the c
2be10 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2be20 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  on rolled back..
2be30 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2be40 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68  ion finalizes th
2be50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2be60 65 69 74 68 65 72 20 62 79 20 64 65 6c 65 74 69  either by deleti
2be70 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  ng, .** truncati
2be80 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20  ng or partially 
2be90 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74  zeroing it, so t
2bea0 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65  hat it cannot be
2beb0 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f   used .** for ho
2bec0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
2bed0 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73  ck. Once this is
2bee0 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61   done the transa
2bef0 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65  ction is.** irre
2bf00 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65  vocably committe
2bf10 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2bf20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2bf30 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2bf40 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
2bf50 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73  e pager.** moves
2bf60 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
2bf70 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  state. Otherwise
2bf80 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2bf90 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2bfa0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2bfb0 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
2bfc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2bfd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bff0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2c000 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   */..  /* Do not
2c010 20 70 72 6f 63 65 65 64 20 69 66 20 74 68 65 20   proceed if the 
2c020 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79  pager is already
2c030 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
2c040 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ate. */.  if( pP
2c050 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2c060 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2c070 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2c080 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
2c090 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tion should not 
2c0a0 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  be called if the
2c0b0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
2c0c0 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50   at least.  ** P
2c0d0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
2c0e0 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20  ate. And indeed 
2c0f0 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65  SQLite never doe
2c100 73 20 74 68 69 73 2e 20 42 75 74 20 69 74 20 69  s this. But it i
2c110 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68  s.  ** nice to h
2c120 61 76 65 20 74 68 69 73 20 64 65 66 65 6e 73 69  ave this defensi
2c130 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20 61 6e  ve block here an
2c140 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  yway..  */.  if(
2c150 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73   NEVER(pPager->s
2c160 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
2c170 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75  VED) ){.    retu
2c180 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2c190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70  .  }..  /* An op
2c1a0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74  timization. If t
2c1b0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2c1c0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
2c1d0 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a  ified during.  *
2c1e0 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2c1f0 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20 69 73  on, the pager is
2c200 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2c210 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69  usive-mode and i
2c220 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72  s.  ** using per
2c230 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  sistent journals
2c240 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
2c250 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
2c260 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
2c270 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
2c280 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74  nal file current
2c290 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ly contains a si
2c2a0 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  ngle journal .  
2c2b0 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68 20 74  ** header with t
2c2c0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65  he nRec field se
2c2d0 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20  t to 0. If such 
2c2e0 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65  a journal is use
2c2f0 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d  d as.  ** a hot-
2c300 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68  journal during h
2c310 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2c320 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77  ack, 0 changes w
2c330 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a  ill be made.  **
2c340 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2c350 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20   file. So there 
2c360 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65  is no need to ze
2c370 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  ro the journal .
2c380 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e    ** header. Sin
2c390 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ce the pager is 
2c3a0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
2c3b0 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  e, there is no n
2c3c0 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70  eed.  ** to drop
2c3d0 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65   any locks eithe
2c3e0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  r..  */.  if( pP
2c3f0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2c400 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
2c410 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
2c420 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2c430 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2c440 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
2c450 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  ST.  ){.    asse
2c460 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
2c470 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
2c480 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
2c490 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2c4a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
2c4b0 41 47 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d  AGERTRACE(("COMM
2c4c0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
2c4d0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61  D(pPager)));.  a
2c4e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2c4f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
2c500 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21  ED || MEMDB || !
2c510 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2c520 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ed );.  rc = pag
2c530 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
2c540 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
2c550 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
2c560 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
2c570 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2c580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
2c590 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
2c5a0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
2c5b0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
2c5c0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
2c5d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2c5e0 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  n performs two t
2c5f0 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  asks:.**.**   1)
2c600 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   It rolls back t
2c610 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
2c620 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64   restoring all d
2c630 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2c640 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d   .**      in-mem
2c650 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
2c660 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 68 65  to the state the
2c670 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74  y were in when t
2c680 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
2c690 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65  *      was opene
2c6a0 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49  d, and.**   2) I
2c6b0 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  t finalizes the 
2c6c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f  journal file, so
2c6d0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
2c6e0 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20  used for hot.** 
2c6f0 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74       rollback at
2c700 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68   any point in th
2c710 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  e future..**.** 
2c720 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66  subject to the f
2c730 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69  ollowing qualifi
2c740 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a  cations:.**.** *
2c750 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
2c760 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20  file is not yet 
2c770 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
2c780 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2c790 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c  d,.**   then onl
2c7a0 79 20 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d  y (2) is perform
2c7b0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
2c7c0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75   there is no jou
2c7d0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74  rnal file.**   t
2c7e0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a  o roll back..**.
2c7f0 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72  ** * If in an er
2c800 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65 72 20  ror state other 
2c810 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  than SQLITE_FULL
2c820 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20  , then task (1) 
2c830 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d  is .**   perform
2c840 65 64 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  ed. If successfu
2c850 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67  l, task (2). Reg
2c860 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f  ardless of the o
2c870 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65  utcome.**   of e
2c880 69 74 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72  ither, the error
2c890 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
2c8a0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
2c8b0 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20   the caller.**  
2c8c0 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51   (i.e. either SQ
2c8d0 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51  LITE_IOERR or SQ
2c8e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a  LITE_CORRUPT)..*
2c8f0 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61  *.** * If the pa
2c900 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
2c910 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
2c920 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29  then attempt (1)
2c930 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f  . Whether.**   o
2c940 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63  r not (1) is suc
2c950 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74  cussful, also at
2c960 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75  tempt (2). If su
2c970 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
2c980 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e  .**   SQLITE_OK.
2c990 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65   Otherwise, ente
2c9a0 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
2c9b0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
2c9c0 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72   first .**   err
2c9d0 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65  or code encounte
2c9e0 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  red. .**.**   In
2c9f0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2ca00 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2ca10 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
2ca20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20  was written to. 
2ca30 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65  .**   So is safe
2ca40 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65   to finalize the
2ca50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76   journal file ev
2ca60 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79 62 61  en if the playba
2ca70 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74  ck .**   (operat
2ca80 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48  ion 1) failed. H
2ca90 6f 77 65 76 65 72 20 74 68 65 20 70 61 67 65 72  owever the pager
2caa0 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68 65 20   must enter the 
2cab0 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20  error state.**  
2cac0 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   as the contents
2cad0 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   of the in-memor
2cae0 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20  y cache are now 
2caf0 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a  suspect..**.** *
2cb00 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20   Finally, if in 
2cb10 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2cb20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65  state, then atte
2cb30 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a  mpt (1). Only.**
2cb40 20 20 20 61 74 74 65 6d 70 74 20 28 32 29 20 69     attempt (2) i
2cb50 66 20 28 31 29 20 69 73 20 73 75 63 63 65 73 73  f (1) is success
2cb60 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ful. Return SQLI
2cb70 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
2cb80 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77  ful,.**   otherw
2cb90 69 73 65 20 65 6e 74 65 72 20 74 68 65 20 65 72  ise enter the er
2cba0 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 72 65  ror state and re
2cbb0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
2cbc0 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a  ode from the .**
2cbd0 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61     failing opera
2cbe0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e  tion..**.**   In
2cbf0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 64   this case the d
2cc00 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79  atabase file may
2cc10 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
2cc20 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65  en to. So if the
2cc30 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f  .**   playback o
2cc40 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74  peration did not
2cc50 20 73 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c   succeed it woul
2cc60 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f  d not be safe to
2cc70 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74   finalize.**   t
2cc80 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2cc90 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   It needs to be 
2cca0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
2ccb0 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a  -system so that.
2ccc0 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20  **   some other 
2ccd0 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20  process can use 
2cce0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  it to restore th
2ccf0 65 20 64 61 74 61 62 61 73 65 20 73 74 61 74 65  e database state
2cd00 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f   (by.**   hot-jo
2cd10 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
2cd20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2cd30 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
2cd40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2cd50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cd60 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2cd70 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2cd80 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41  de */.  PAGERTRA
2cd90 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64  CE(("ROLLBACK %d
2cda0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
2cdb0 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70  ger)));.  if( !p
2cdc0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2cdd0 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61  d || !isOpen(pPa
2cde0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
2cdf0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
2ce00 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
2ce10 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
2ce20 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20  aster);.  }else 
2ce30 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
2ce40 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
2ce50 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
2ce60 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
2ce70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2ce80 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
2ce90 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
2cea0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2ceb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2cec0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2ced0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
2cee0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
2cef0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
2cf00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2cf10 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  2;.      rc = pa
2cf20 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2cf30 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  ger, 0);.      r
2cf40 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
2cf50 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
2cf60 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  r, pPager->setMa
2cf70 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
2cf80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cf90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
2cfa0 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c2;.      }.    
2cfb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2cfc0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
2cfd0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2cfe0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   }..    if( !MEM
2cff0 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  DB ){.      pPag
2d000 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2d010 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
2d020 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2d030 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
2d040 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
2d050 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
2d060 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2d070 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
2d080 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
2d090 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
2d0a0 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
2d0b0 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e      ** persisten
2d0c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  t..    */.    rc
2d0d0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
2d0e0 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a  Pager, rc);.  }.
2d0f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d100 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2d110 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
2d120 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
2d130 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
2d140 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2d150 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2d160 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
2d170 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69  able..*/.u8 sqli
2d180 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
2d190 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
2d1a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2d1b0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
2d1c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2d1d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2d1e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
2d1f0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2d200 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
2d210 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d220 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2d230 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
2d240 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2d250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2d260 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
2d270 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2d280 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
2d290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2d2a0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2d2b0 74 28 44 62 50 61 67 65 20 2a 70 50 61 67 65 29  t(DbPage *pPage)
2d2c0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
2d2d0 65 33 50 63 61 63 68 65 50 61 67 65 52 65 66 63  e3PcachePageRefc
2d2e0 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  ount(pPage);.}..
2d2f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2d300 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
2d310 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
2d320 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
2d330 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
2d340 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
2d350 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
2d360 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
2d370 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
2d380 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
2d390 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2d3a0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2d3b0 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  1] = sqlite3Pcac
2d3c0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
2d3d0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2d3e0 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[2] = sqlite3Pc
2d3f0 61 63 68 65 47 65 74 43 61 63 68 65 73 69 7a 65  acheGetCachesize
2d400 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d410 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  );.  a[3] = pPag
2d420 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
2d430 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e  ? (int) pPager->
2d440 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61  dbSize : -1;.  a
2d450 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
2d460 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
2d470 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2d480 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
2d490 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
2d4a0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
2d4b0 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73  a[8] = 0;  /* Us
2d4c0 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d  ed to be pPager-
2d4d0 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d  >nOvfl */.  a[9]
2d4e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64   = pPager->nRead
2d4f0 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67  ;.  a[10] = pPag
2d500 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65  er->nWrite;.  re
2d510 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66  turn a;.}.#endif
2d520 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2d530 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
2d540 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  n in-memory page
2d550 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2d560 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
2d570 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2d580 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
2d590 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
2d5a0 74 20 74 68 65 72 65 20 61 72 65 20 61 74 20 6c  t there are at l
2d5b0 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20  east nSavepoint 
2d5c0 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e  savepoints open.
2d5d0 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   If there are.**
2d5e0 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20   currently less 
2d5f0 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73  than nSavepoints
2d600 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e   open, then open
2d610 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76   one or more sav
2d620 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61  epoints.** to ma
2d630 6b 65 20 75 70 20 74 68 65 20 64 69 66 66 65 72  ke up the differ
2d640 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d  ence. If the num
2d650 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2d660 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  s is already.** 
2d670 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f  equal to nSavepo
2d680 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  int, then this f
2d690 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2d6a0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  op..**.** If a m
2d6b0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2d6c0 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e   fails, SQLITE_N
2d6d0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
2d6e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a  . If an error .*
2d6f0 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f  * occurs while o
2d700 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a  pening the sub-j
2d710 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
2d720 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  n an IO error co
2d730 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  de is.** returne
2d740 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  d. Otherwise, SQ
2d750 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
2d760 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
2d770 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
2d780 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
2d790 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
2d7a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2d7d0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  code */.  int nC
2d7e0 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d  urrent = pPager-
2d7f0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  >nSavepoint;    
2d800 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e      /* Current n
2d810 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2d820 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53  nts */..  if( nS
2d830 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e  avepoint>nCurren
2d840 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  t && pPager->use
2d850 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69  Journal ){.    i
2d860 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
2d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d880 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2d890 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2d8a0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
2d8b0 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20  t *aNew;        
2d8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2d8d0 77 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  w Pager.aSavepoi
2d8e0 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20  nt array */..   
2d8f0 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 72 65   /* Either there
2d900 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f   is no active jo
2d910 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62  urnal or the sub
2d920 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  -journal is open
2d930 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20   or .    ** the 
2d940 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79  journal is alway
2d950 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f  s stored in memo
2d960 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ry */.    assert
2d970 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
2d980 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65  oint==0 || isOpe
2d990 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2d9a0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ||.            p
2d9b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2d9c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2d9d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a  LMODE_MEMORY );.
2d9e0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
2d9f0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
2da00 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
2da10 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
2da20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
2da30 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
2da40 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
2da50 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
2da60 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
2da70 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
2da80 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
2da90 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
2daa0 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
2dab0 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
2dac0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
2dad0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
2dae0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
2daf0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
2db00 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
2db10 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
2db20 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
2db30 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
2db40 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
2db50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2db60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
2db70 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
2db80 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28  [nCurrent], 0, (
2db90 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72  nSavepoint-nCurr
2dba0 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61  ent) * sizeof(Pa
2dbb0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a  gerSavepoint));.
2dbc0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76      pPager->aSav
2dbd0 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20  epoint = aNew;. 
2dbe0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
2dbf0 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
2dc00 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
2dc10 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
2dc20 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
2dc30 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
2dc40 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
2dc50 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53  =nCurrent; ii<nS
2dc60 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
2dc70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2dc80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
2dc90 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
2dca0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
2dcb0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
2dcc0 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50     if( isOpen(pP
2dcd0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50  ager->jfd) && pP
2dce0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2dcf0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
2dd00 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
2dd10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2dd20 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
2dd30 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2dd40 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
2dd50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
2dd60 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
2dd70 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
2dd80 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  Rec = pPager->nS
2dd90 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65  ubRec;.      aNe
2dda0 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  w[ii].pInSavepoi
2ddb0 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
2ddc0 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
2ddd0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
2dde0 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49  if( !aNew[ii].pI
2ddf0 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2de00 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2de10 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
2de20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2de30 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f   Open the sub-jo
2de40 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20  urnal, if it is 
2de50 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
2de60 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ed. */.    rc = 
2de70 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
2de80 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72  Pager);.  }..  r
2de90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2dea0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2deb0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f   is called to ro
2dec0 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73  llback or releas
2ded0 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76  e (commit) a sav
2dee0 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73  epoint..** The s
2def0 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65  avepoint to rele
2df00 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
2df10 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20  need not be the 
2df20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a  most recently .*
2df30 2a 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  * created savepo
2df40 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  int..**.** Param
2df50 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79  eter op is alway
2df60 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  s either SAVEPOI
2df70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53  NT_ROLLBACK or S
2df80 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2df90 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41  ..** If it is SA
2dfa0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
2dfb0 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e   then release an
2dfc0 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73 61  d destroy the sa
2dfd0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20  vepoint with.** 
2dfe0 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74  index iSavepoint
2dff0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
2e000 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
2e010 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c  hen rollback all
2e020 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74   changes.** that
2e030 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 73   have occurred s
2e040 69 6e 63 65 20 74 68 65 20 73 70 65 63 69 66 69  ince the specifi
2e050 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73  ed savepoint was
2e060 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
2e070 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2e080 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c   rollback or rel
2e090 65 61 73 65 20 69 73 20 69 64 65 6e 74 69 66 69  ease is identifi
2e0a0 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
2e0b0 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  .** iSavepoint. 
2e0c0 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61  A value of 0 mea
2e0d0 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  ns to operate on
2e0e0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73   the outermost s
2e0f0 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65  avepoint.** (the
2e100 20 66 69 72 73 74 20 63 72 65 61 74 65 64 29 2e   first created).
2e110 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67   A value of (Pag
2e120 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29  er.nSavepoint-1)
2e130 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a   means operate.*
2e140 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  * on the most re
2e150 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73  cently created s
2e160 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61  avepoint. If iSa
2e170 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
2e180 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65  er than.** (Page
2e190 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c  r.nSavepoint-1),
2e1a0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2e1b0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2e1c0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74  **.** If a negat
2e1d0 69 76 65 20 76 61 6c 75 65 20 69 73 20 70 61 73  ive value is pas
2e1e0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
2e1f0 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  tion, then the c
2e200 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2e210 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
2e220 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
2e230 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69  fferent to calli
2e240 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
2e250 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  gerRollback() be
2e260 63 61 75 73 65 20 74 68 69 73 20 66 75 6e 63 74  cause this funct
2e270 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72  ion does not ter
2e280 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72  minate.** the tr
2e290 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c  ansaction or unl
2e2a0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
2e2b0 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72  , it just restor
2e2c0 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  es the .** conte
2e2d0 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
2e2e0 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
2e2f0 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a  nal state. .**.*
2e300 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61  * In any case, a
2e310 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
2e320 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
2e330 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
2e340 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
2e350 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73 20 69  royed. If this i
2e360 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72  s a release oper
2e370 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50  ation (op==SAVEP
2e380 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a  OINT_RELEASE),.*
2e390 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74  * then savepoint
2e3a0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61   iSavepoint is a
2e3b0 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  lso destroyed..*
2e3c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2e3d0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2e3e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20  LITE_NOMEM if a 
2e3f0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
2e400 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61  n fails,.** or a
2e410 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2e420 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  if an IO error o
2e430 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c  ccurs while roll
2e440 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73  ing back a .** s
2e450 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20  avepoint. If no 
2e460 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51  errors occur, SQ
2e470 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2e480 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ned..*/ .int sql
2e490 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
2e4a0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e4b0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
2e4c0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
2e4d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e4e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
2e4f0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2e500 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
2e510 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
2e520 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
2e530 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41  int>=0 || op==SA
2e540 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2e550 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65   );..  if( iSave
2e560 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53  point<pPager->nS
2e570 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2e580 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
2e590 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2e5a0 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  ariable */.    i
2e5b0 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20  nt nNew;        
2e5c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2e5d0 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69  emaining savepoi
2e5e0 6e 74 73 20 61 66 74 65 72 20 74 68 69 73 20 6f  nts after this o
2e5f0 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p. */..    /* Fi
2e600 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
2e610 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c  y savepoints wil
2e620 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76  l still be activ
2e630 65 20 61 66 74 65 72 20 74 68 69 73 0a 20 20 20  e after this.   
2e640 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53   ** operation. S
2e650 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75 65 20  tore this value 
2e660 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72  in nNew. Then fr
2e670 65 65 20 72 65 73 6f 75 72 63 65 73 20 61 73 73  ee resources ass
2e680 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20  ociated .    ** 
2e690 77 69 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69  with any savepoi
2e6a0 6e 74 73 20 74 68 61 74 20 61 72 65 20 64 65 73  nts that are des
2e6b0 74 72 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f  troyed by this o
2e6c0 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  peration..    */
2e6d0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76  .    nNew = iSav
2e6e0 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41  epoint + (op==SA
2e6f0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2e700 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e  );.    for(ii=nN
2e710 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  ew; ii<pPager->n
2e720 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
2e730 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
2e740 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
2e750 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
2e760 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2e770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
2e780 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2e790 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20  = nNew;..    /* 
2e7a0 49 66 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c  If this is a rol
2e7b0 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c  lback operation,
2e7c0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70   playback the sp
2e7d0 65 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e  ecified savepoin
2e7e0 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  t..    ** If thi
2e7f0 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65  s is a temp-file
2e800 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2e810 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
2e820 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a  l file has.    *
2e830 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
2e840 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  pened. In this c
2e850 61 73 65 20 74 68 65 72 65 20 68 61 76 65 20 62  ase there have b
2e860 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
2e870 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  o.    ** the dat
2e880 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74  abase file, so t
2e890 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72  he playback oper
2e8a0 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69  ation can be ski
2e8b0 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  pped..    */.   
2e8c0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
2e8d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69  NT_ROLLBACK && i
2e8e0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2e8f0 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  d) ){.      Page
2e900 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
2e910 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d  epoint = (nNew==
2e920 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53  0)?0:&pPager->aS
2e930 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d  avepoint[nNew-1]
2e940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
2e950 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
2e960 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53 61 76  int(pPager, pSav
2e970 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61  epoint);.      a
2e980 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45  ssert(rc!=SQLITE
2e990 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20  _DONE);.    }.  
2e9a0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2e9b0 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20  is a release of 
2e9c0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61  the outermost sa
2e9d0 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74  vepoint, truncat
2e9e0 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  e .    ** the su
2e9f0 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72  b-journal to zer
2ea00 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  o bytes in size.
2ea10 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77   */.    if( nNew
2ea20 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  ==0 && op==SAVEP
2ea30 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20  OINT_RELEASE && 
2ea40 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2ea50 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73  jfd) ){.      as
2ea60 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2ea70 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
2ea80 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
2ea90 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
2eaa0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
2eab0 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b  er->nSubRec = 0;
2eac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ead0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2eae0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
2eaf0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
2eb00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2eb10 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2eb20 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
2eb30 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
2eb40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2eb50 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
2eb60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2eb70 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
2eb80 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
2eb90 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
2eba0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
2ebb0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
2ebc0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2ebd0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
2ebe0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2ebf0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
2ec00 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2ec10 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
2ec20 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
2ec30 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
2ec40 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
2ec50 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
2ec60 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2ec70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
2ec80 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
2ec90 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
2eca0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
2ecb0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
2ecc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
2ecd0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
2ece0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
2ecf0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2ed00 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
2ed10 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
2ed20 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2ed30 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
2ed40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2ed50 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
2ed60 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
2ed70 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
2ed80 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
2ed90 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
2eda0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
2edb0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
2edc0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
2edd0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2ede0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2edf0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
2ee00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2ee10 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
2ee20 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74   the codec for t
2ee30 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69  his pager.*/.voi
2ee40 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
2ee50 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  tCodec(.  Pager 
2ee60 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
2ee70 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2ee80 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2ee90 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
2eea0 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
2eeb0 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
2eec0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
2eed0 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
2eee0 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  g;.}.#endif..#if
2eef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ef00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
2ef10 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
2ef20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  pPg to location 
2ef30 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
2ef40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75  ..**.** There mu
2ef50 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
2ef60 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2ef70 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74  previously locat
2ef80 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77  ed at.** pgno (w
2ef90 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67  hich we call pPg
2efa0 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74  Old) though that
2efb0 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64   page is allowed
2efc0 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63   to be.** in cac
2efd0 68 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  he.  If the page
2efe0 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61   previously loca
2eff0 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
2f000 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
2f010 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
2f020 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
2f030 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
2f040 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
2f050 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
2f060 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
2f070 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
2f080 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
2f090 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
2f0a0 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
2f0b0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
2f0c0 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
2f0d0 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
2f0e0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
2f0f0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
2f100 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
2f110 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
2f120 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
2f130 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
2f140 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
2f150 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
2f160 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
2f170 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
2f180 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2f190 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
2f1a0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
2f1b0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
2f1c0 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
2f1d0 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
2f1e0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
2f1f0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
2f200 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
2f210 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ctive)..**.** If
2f220 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75   the fourth argu
2f230 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74 2c 20  ment, isCommit, 
2f240 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2f250 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 62  n this page is b
2f260 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20 61 73  eing.** moved as
2f270 20 70 61 72 74 20 6f 66 20 61 20 64 61 74 61 62   part of a datab
2f280 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61 74 69  ase reorganizati
2f290 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74  on just before t
2f2a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  he transaction .
2f2b0 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 6d  ** is being comm
2f2c0 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  itted. In this c
2f2d0 61 73 65 2c 20 69 74 20 69 73 20 67 75 61 72 61  ase, it is guara
2f2e0 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 64  nteed that the d
2f2f0 61 74 61 62 61 73 65 20 70 61 67 65 20 0a 2a 2a  atabase page .**
2f300 20 70 50 67 20 72 65 66 65 72 73 20 74 6f 20 77   pPg refers to w
2f310 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69 74 74  ill not be writt
2f320 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69 74 68  en to again with
2f330 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
2f340 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
2f350 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74  function may ret
2f360 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2f370 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
2f380 63 6f 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72  code if an error
2f390 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f 74 68 65  .** occurs. Othe
2f3a0 72 77 69 73 65 2c 20 69 74 20 72 65 74 75 72 6e  rwise, it return
2f3b0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  s SQLITE_OK..*/.
2f3c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2f3d0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
2f3e0 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
2f3f0 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pPg, Pgno pgno, 
2f400 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20  int isCommit){. 
2f410 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f430 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
2f440 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
2f450 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
2f460 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  gno = 0;       /
2f470 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f 66 20 70  * Old value of p
2f480 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20 73 79 6e  Pg->pgno, if syn
2f490 63 20 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f  c is required */
2f4a0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2f4d0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  /..  assert( pPg
2f4e0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f  ->nRef>0 );..  /
2f4f0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65  * If the page be
2f500 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72  ing moved is dir
2f510 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62  ty and has not b
2f520 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65  een saved by the
2f530 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76   latest.  ** sav
2f540 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76  epoint, then sav
2f550 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  e the current co
2f560 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
2f570 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a  ge into the .  *
2f580 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f  * sub-journal no
2f590 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  w. This is requi
2f5a0 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  red to handle th
2f5b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
2f5c0 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ario:.  **.  ** 
2f5d0 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
2f5e0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
2f5f0 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69  X, then modify i
2f600 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a  t in memory>.  *
2f610 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
2f620 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20  one;.  **       
2f630 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20  <Move page X to 
2f640 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a  location Y>.  **
2f650 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
2f660 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20   one;.  **.  ** 
2f670 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e  If page X were n
2f680 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ot written to th
2f690 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65  e sub-journal he
2f6a0 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  re, it would not
2f6b0 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c  .  ** be possibl
2f6c0 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73  e to restore its
2f6d0 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74   contents when t
2f6e0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
2f6f0 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d  one".  ** statem
2f700 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f 63  ent were is proc
2f710 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  essed..  **.  **
2f720 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
2f730 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61 6c  ) may need to al
2f740 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f 20  locate space to 
2f750 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20  store pPg->pgno 
2f760 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f 72  into.  ** one or
2f770 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74 20   more savepoint 
2f780 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69 73  bitvecs. This is
2f790 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69 73   the reason this
2f7a0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6d   function.  ** m
2f7b0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
2f7c0 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20 69  _NOMEM..  */.  i
2f7d0 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  f( pPg->flags&PG
2f7e0 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26 26  HDR_DIRTY .   &&
2f7f0 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
2f800 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51 4c  e(pPg).   && SQL
2f810 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75  ITE_OK!=(rc = su
2f820 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
2f830 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
2f840 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41  rn rc;.  }..  PA
2f850 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45 20  GERTRACE(("MOVE 
2f860 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
2f870 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
2f880 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
2f890 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
2f8a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67   pPg->pgno, (pPg
2f8b0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2f8c0 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67  ED_SYNC)?1:0, pg
2f8d0 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  no));.  IOTRACE(
2f8e0 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
2f8f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
2f900 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
2f910 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
2f920 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
2f930 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70  ync()ed before p
2f940 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61  age pPg->pgno ca
2f950 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  n.  ** be writte
2f960 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d  n to, store pPg-
2f970 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76  >pgno in local v
2f980 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63  ariable needSync
2f990 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Pgno..  **.  ** 
2f9a0 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20  If the isCommit 
2f9b0 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
2f9c0 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
2f9d0 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20   remember that. 
2f9e0 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
2f9f0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
2fa00 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
2fa10 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70  base page pPg->p
2fa20 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65  gno .  ** can be
2fa30 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
2fa40 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
2fa50 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
2fa60 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e   to write to it.
2fa70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67  .  */.  if( (pPg
2fa80 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
2fa90 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43  ED_SYNC) && !isC
2faa0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65  ommit ){.    nee
2fab0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
2fac0 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
2fad0 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
2fae0 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
2faf0 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
2fb00 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  gSize );.    ass
2fb10 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
2fb20 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
2fb30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2fb40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
2fb50 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2fb60 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
2fb70 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
2fb80 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
2fb90 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
2fba0 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
2fbb0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
2fbc0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
2fbd0 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
2fbe0 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
2fbf0 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
2fc00 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
2fc10 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
2fc20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
2fc30 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
2fc40 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
2fc50 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53  &= ~PGHDR_NEED_S
2fc60 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  YNC;.  pPgOld = 
2fc70 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
2fc80 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
2fc90 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c  sert( !pPgOld ||
2fca0 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31   pPgOld->nRef==1
2fcb0 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64   );.  if( pPgOld
2fcc0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61   ){.    pPg->fla
2fcd0 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66  gs |= (pPgOld->f
2fce0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
2fcf0 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  SYNC);.  }..  sq
2fd00 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
2fd10 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg, pgno);.  if
2fd20 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
2fd30 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
2fd40 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  p(pPgOld);.  }..
2fd50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2fd60 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
2fd70 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2fd80 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
2fd90 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
2fda0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
2fdb0 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
2fdc0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
2fdd0 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
2fde0 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
2fdf0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
2fe00 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
2fe10 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
2fe20 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
2fe30 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
2fe40 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
2fe50 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
2fe60 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
2fe70 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
2fe80 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
2fe90 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
2fea0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
2feb0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
2fec0 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
2fed0 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
2fee0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
2fef0 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
2ff00 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
2ff10 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
2ff20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
2ff30 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
2ff40 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
2ff50 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
2ff60 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
2ff70 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
2ff80 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
2ff90 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
2ffa0 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
2ffb0 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
2ffc0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2ffd0 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
2ffe0 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
2fff0 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
30000 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
30010 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
30020 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
30030 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
30040 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
30050 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
30060 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
30070 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
30080 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
30090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
300a0 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
300b0 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
300c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
300d0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
300e0 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
300f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
30100 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
30110 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
30120 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
30130 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
30140 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
30150 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
30160 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
30170 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
30180 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
30190 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
301a0 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
301b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
301c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
301d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
301e0 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53 79  ournal && needSy
301f0 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
30200 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
30210 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
30220 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
30230 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
30240 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20  dSyncPgno);.    
30250 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
30260 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
30270 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
30280 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
30290 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
302a0 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  =0 && !MEMDB );.
302b0 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
302c0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
302d0 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  SYNC;.    sqlite
302e0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
302f0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
30300 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30310 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
30320 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30330 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
30340 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
30350 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
30360 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
30370 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
30380 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
30390 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
303a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
303b0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
303c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
303d0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
303e0 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
303f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
30400 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
30410 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
30420 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
30430 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
30440 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
30450 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
30460 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
30470 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
30480 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
30490 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
304a0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
304b0 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a  ger?pPg->pExtra:
304c0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
304d0 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
304e0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
304f0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
30500 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
30510 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
30520 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
30530 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
30540 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
30550 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
30560 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
30570 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
30580 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
30590 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
305a0 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
305b0 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
305c0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
305d0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
305e0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
305f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
30600 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
30610 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
30620 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
30630 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
30640 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
30650 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
30660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
30670 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
30680 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
30690 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
306a0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
306b0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
306c0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
306d0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
306e0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
306f0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
30700 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
30710 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
30720 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
30730 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
30740 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
30750 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
30760 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
30770 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
30780 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
30790 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
307a0 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
307b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
307c0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
307d0 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
307e0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
307f0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
30800 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
30810 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
30820 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
30830 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
30840 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
30850 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
30860 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
30870 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
30880 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  RY.**    PAGER_J
30890 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
308a0 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
308b0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
308c0 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
308d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
308e0 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  ST.**    PAGER_J
308f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a  OURNALMODE_OFF.*
30900 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
30910 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a  ALMODE_MEMORY.**
30920 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d  .** If the param
30930 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
30940 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  RY, then the jou
30950 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74  rnal-mode is set
30960 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65   to the.** value
30970 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
30980 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 69  * The returned i
30990 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72 72  ndicate the curr
309a0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
309b0 64 61 74 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d  dated) journal-m
309c0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
309d0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
309e0 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
309f0 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
30a00 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
30a10 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65     assert( eMode
30a20 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30a30 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
30a40 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
30a50 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30a60 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
30a70 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
30a80 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
30a90 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
30ab0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
30ac0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
30ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
30ae0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
30af0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
30b10 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
30b20 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
30b30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 50  );.    assert( P
30b40 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
30b50 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20 20  _QUERY<0 );.    
30b60 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a  if( eMode>=0 ){.
30b70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
30b80 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
30b90 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eMode;.    }else
30ba0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
30bb0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
30bc0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29  RNALMODE_QUERY )
30bd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
30be0 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
30bf0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
30c00 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
30c10 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
30c20 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
30c30 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
30c40 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
30c50 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65  PagerJournalSize
30c60 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  Limit(Pager *pPa
30c70 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29  ger, i64 iLimit)
30c80 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d  {.  if( iLimit>=
30c90 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  -1 ){.    pPager
30ca0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
30cb0 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d  it = iLimit;.  }
30cc0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30cd0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
30ce0 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  it;.}../*.** Ret
30cf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
30d00 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 42 61   the pPager->pBa
30d10 63 6b 75 70 20 76 61 72 69 61 62 6c 65 2e 20 54  ckup variable. T
30d20 68 65 20 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65  he backup module
30d30 0a 2a 2a 20 69 6e 20 62 61 63 6b 75 70 2e 63 20  .** in backup.c 
30d40 6d 61 69 6e 74 61 69 6e 73 20 74 68 65 20 63 6f  maintains the co
30d50 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 76 61  ntent of this va
30d60 72 69 61 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64  riable. This mod
30d70 75 6c 65 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f  ule.** uses it o
30d80 70 61 71 75 65 6c 79 20 61 73 20 61 6e 20 61 72  paquely as an ar
30d90 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65  gument to sqlite
30da0 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 29  3BackupRestart()
30db0 20 61 6e 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42   and.** sqlite3B
30dc0 61 63 6b 75 70 55 70 64 61 74 65 28 29 20 6f 6e  ackupUpdate() on
30dd0 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62  ly..*/.sqlite3_b
30de0 61 63 6b 75 70 20 2a 2a 73 71 6c 69 74 65 33 50  ackup **sqlite3P
30df0 61 67 65 72 42 61 63 6b 75 70 50 74 72 28 50 61  agerBackupPtr(Pa
30e00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
30e10 72 65 74 75 72 6e 20 26 70 50 61 67 65 72 2d 3e  return &pPager->
30e20 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64  pBackup;.}..#end
30e30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
30e40 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.