/ Hex Artifact Content
Login

Artifact a799290e5cf9495f9991413ce84847011767b4d9:


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 33  : pager.c,v 1.53
0350: 38 20 32 30 30 39 2f 30 31 2f 30 37 20 31 35 3a  8 2009/01/07 15:
0360: 31 38 3a 32 31 20 64 61 6e 69 65 6c 6b 31 39 37  18:21 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1320: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
1330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1340: 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74  cture is allocat
1350: 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69  ed for each acti
1360: 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  ve.** savepoint 
1370: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72  and statement tr
1380: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65  ansaction in the
1390: 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63   system. All suc
13a0: 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20  h structures.** 
13b0: 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
13c0: 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  e Pager.aSavepoi
13d0: 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63  nt[] array, whic
13e0: 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  h is allocated a
13f0: 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73  nd.** resized us
1400: 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  ing sqlite3Reall
1410: 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  oc()..**.** When
1420: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20   a savepoint is 
1430: 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67  created, the Pag
1440: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
1450: 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a  Offset field is.
1460: 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ** set to 0. If 
1470: 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
1480: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1490: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
14a0: 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73  l while.** the s
14b0: 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
14c0: 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66  ve, then iHdrOff
14d0: 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
14e0: 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a  e byte offset .*
14f0: 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  * immediately fo
1500: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74  llowing the last
1510: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
1520: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1530: 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c   main.** journal
1540: 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72   before the jour
1550: 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73  nal-header. This
1560: 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72   is required dur
1570: 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  ing savepoint.**
1580: 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70   rollback (see p
1590: 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
15a0: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70  point())..*/.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65  edef struct Page
15c0: 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72  rSavepoint Pager
15d0: 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63  Savepoint;.struc
15e0: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
15f0: 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74   {.  i64 iOffset
1600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1610: 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66    /* Starting of
1620: 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75  fset in main jou
1630: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48  rnal */.  i64 iH
1640: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
1650: 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62         /* See ab
1660: 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ove */.  Bitvec 
1670: 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  *pInSavepoint;  
1680: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
1690: 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61  pages in this sa
16a0: 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e  vepoint */.  Pgn
16b0: 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20  o nOrig;        
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
16d0: 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ginal number of 
16e0: 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f  pages in file */
16f0: 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b  .  Pgno iSubRec;
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1710: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
1720: 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d  t record in sub-
1730: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  journal */.};../
1740: 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65  *.** A open page
1750: 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73   cache is an ins
1760: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1770: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1780: 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72  ..**.** Pager.er
1790: 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74  rCode may be set
17a0: 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   to SQLITE_IOERR
17b0: 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
17c0: 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  , or.** or SQLIT
17d0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
17e0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
17f0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
1800: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
1810: 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65  * and is returne
1820: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
1830: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
1840: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
1850: 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  The.** SQLITE_FU
1860: 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  LL return code i
1870: 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  s slightly diffe
1880: 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74  rent. It persist
1890: 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65  s only until the
18a0: 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73  .** next success
18b0: 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  ful rollback is 
18c0: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
18d0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c   pager cache. Al
18e0: 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  so,.** SQLITE_FU
18f0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
1900: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
1910: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1920: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1930: 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20  ).** APIs, they 
1940: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  may still be use
1950: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a  d successfully..
1960: 2a 2a 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20 74  **.** Managing t
1970: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
1980: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1990: 70 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c  pages is a littl
19a0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a  e complicated..*
19b0: 2a 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50  * The variable P
19c0: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
19d0: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
19e0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
19f0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6d  e database.** im
1a00: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  age currently co
1a10: 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64  ntains. As the d
1a20: 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67 72  atabase image gr
1a30: 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74  ows or shrinks t
1a40: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  his.** variable 
1a50: 69 73 20 75 70 64 61 74 65 64 2e 20 54 68 65 20  is updated. The 
1a60: 76 61 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64  variable Pager.d
1a70: 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69  bFileSize contai
1a80: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  ns the number.**
1a90: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1aa0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1ab0: 54 68 69 73 20 6d 61 79 20 62 65 20 64 69 66 66  This may be diff
1ac0: 65 72 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72  erent from Pager
1ad0: 2e 64 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73 6f  .dbSize.** if so
1ae0: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1af0: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1b00: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1b10: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1b20: 69 74 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72 6f  itten.** out fro
1b30: 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 74  m the cache to t
1b40: 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f  he actual file o
1b50: 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68  n disk. Or if th
1b60: 65 20 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e  e image has been
1b70: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 62 79  .** truncated by
1b80: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1b90: 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1ba0: 2e 20 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72  . The Pager.dbOr
1bb0: 69 67 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a  igSize variable.
1bc0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
1bd0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1be0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bf0: 69 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63  image when the c
1c00: 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
1c10: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1c20: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1c30: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1c40: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1c50: 73 0a 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61 6e  s.** only guaran
1c60: 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65  teed to be corre
1c70: 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61  ct if the boolea
1c80: 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61  n Pager.dbSizeVa
1c90: 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  lid is true..*/.
1ca0: 73 74 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20  struct Pager {. 
1cb0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1cc0: 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs;          /* 
1cd0: 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20  OS functions to 
1ce0: 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20  use for IO */.  
1cf0: 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20  u8 journalOpen; 
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1d10: 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66  rue if journal f
1d20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
1d30: 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38  is valid */.  u8
1d40: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b   journalStarted;
1d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1d60: 65 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a  e if header of j
1d70: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1d80: 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72   */.  u8 useJour
1d90: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
1da0: 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62    /* Use a rollb
1db0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  ack journal on t
1dc0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  his file */.  u8
1dd0: 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20   noReadlock;    
1de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1df0: 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62  not bother to ob
1e00: 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a  tain readlocks *
1e10: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
1e40: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
1e50: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
1e60: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
1e70: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
1e80: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
1e90: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
1ea0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63  ess */.  u8 sync
1eb0: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  _flags;         
1ec0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53       /* One of S
1ed0: 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59  YNC_NORMAL or SY
1ee0: 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20  NC_FULL */.  u8 
1ef0: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
1f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
1f10: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
1f20: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
1f30: 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  c. */.  u8 tempF
1f40: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
1f50: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
1f60: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
1f70: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
1f80: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
1f90: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1fa0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
1fb0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
1fc0: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
1fd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fe0: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
1ff0: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2000: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2010: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2020: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2030: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2040: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2050: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2060: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2070: 20 44 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c   Disable DontRol
2080: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
2090: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
20a0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
20b0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
20c0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
20d0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
20e0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
20f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2100: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2110: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2120: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2130: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
2140: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2150: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
2160: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
2170: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65   cache */.  u8 e
2180: 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20  xclusiveMode;   
2190: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
21a0: 61 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b  an. True if lock
21b0: 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53  ing_mode==EXCLUS
21c0: 49 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  IVE */.  u8 jour
21d0: 6e 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  nalMode;        
21e0: 20 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68       /* On of th
21f0: 65 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  e PAGER_JOURNALM
2200: 4f 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ODE_* values */.
2210: 20 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b    u8 dbModified;
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2230: 20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61   True if there a
2240: 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  re any changes t
2250: 6f 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38  o the Db */.  u8
2260: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2270: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2280: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2290: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
22a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 64  ounter */.  u8 d
22b0: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
22c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
22d0: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
22e0: 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  rrect */.  Pgno 
22f0: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
2300: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2310: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
2320: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
2330: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2350: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2360: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
2370: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
2380: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
2390: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23a0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
23b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
23c0: 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20    u32 vfsFlags; 
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e0: 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   Flags for sqlit
23f0: 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
2400: 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b  /.  int errCode;
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2430: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2440: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b  s */.  int nRec;
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2470: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
2480: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
2490: 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b    u32 cksumInit;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b0: 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61   Quasi-random va
24c0: 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65 76 65  lue added to eve
24d0: 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ry checksum */. 
24e0: 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20   int stmtNRec;  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2500: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
2510: 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75  s in stmt subjou
2520: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  rnal */.  int nE
2530: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20  xtra;           
2540: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69        /* Add thi
2550: 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20  s many bytes to 
2560: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
2570: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  age */.  int pag
2580: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
2590: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25a0: 66 20 62 79 74 65 73 20 69 6e 20 61 20 70 61 67  f bytes in a pag
25b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
25c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25d0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
25e0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
25f0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  pages */.  int m
2600: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2610: 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
2620: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  m number of page
2630: 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63  s to hold in cac
2640: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50  he */.  Pgno mxP
2650: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
2660: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61      /* Maximum a
2670: 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74  llowed size of t
2680: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2690: 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72   Bitvec *pInJour
26a0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nal;         /* 
26b0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
26c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
26d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26e0: 42 69 74 76 65 63 20 2a 70 41 6c 77 61 79 73 52  Bitvec *pAlwaysR
26f0: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f 2a 20 4f  ollback;    /* O
2700: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
2710: 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61  page marked alwa
2720: 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ys-rollback */. 
2730: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2750: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2760: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63  base file */.  c
2770: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20  har *zJournal;  
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2790: 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
27a0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  l file */.  char
27b0: 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20   *zDirectory;   
27c0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63          /* Direc
27d0: 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61  tory hold databa
27e0: 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  se and journal f
27f0: 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  iles */.  sqlite
2800: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  3_file *fd, *jfd
2810: 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65  ;     /* File de
2820: 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61  scriptors for da
2830: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
2840: 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  al */.  sqlite3_
2850: 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20  file *sjfd;     
2860: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2870: 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73  riptor for the s
2880: 75 62 2d 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69  ub-journal*/.  i
2890: 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
28a0: 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75  r)(void*); /* Fu
28b0: 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77  nction to call w
28c0: 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f  hen busy */.  vo
28d0: 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
28e0: 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  Arg;      /* Con
28f0: 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f  text argument fo
2900: 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r xBusyHandler *
2910: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
2920: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2930: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
2940: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
2950: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
2960: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2980: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
2990: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
29a0: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  eader */.  u32 s
29b0: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
29c0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
29d0: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
29e0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
29f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2a00: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
2a10: 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20  nMiss;          
2a20: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20    /* Cache hits 
2a30: 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20  and missing */. 
2a40: 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69   int nRead, nWri
2a50: 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  te;          /* 
2a60: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2a70: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
2a80: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
2a90: 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65  Reiniter)(DbPage
2aa0: 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  *); /* Call this
2ab0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
2ac0: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
2ad0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2ae0: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
2af0: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
2b00: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2b10: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
2b20: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
2b30: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
2b40: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
2b50: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
2b60: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
2b70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
2b80: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
2b90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ba0: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
2bb0: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
2bc0: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
2bd0: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
2be0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
2bf0: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
2c00: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
2c10: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2c20: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
2c30: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
2c40: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
2c50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
2c60: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
2c70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2c80: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
2c90: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
2ca0: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
2cb0: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
2cc0: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
2cd0: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
2ce0: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
2cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2d00: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
2d10: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
2d20: 74 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  t[] */.};../*.**
2d30: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2d40: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
2d50: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
2d60: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2d70: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
2d80: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
2d90: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
2da0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
2db0: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
2dc0: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
2dd0: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
2de0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2df0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2e00: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
2e10: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
2e20: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
2e30: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
2e40: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2e50: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2e60: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
2e70: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
2e80: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
2e90: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2ea0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2eb0: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
2ec0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2ed0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
2ee0: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
2ef0: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
2f00: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2f10: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
2f20: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
2f30: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
2f40: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
2f50: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
2f60: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
2f70: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2f80: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
2f90: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
2fa0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
2fb0: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
2fc0: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
2fd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
2fe0: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
2ff0: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3000: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3010: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
3020: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
3030: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
3040: 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  ing.** written, 
3050: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
3060: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3070: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3080: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3090: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
30a0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
30b0: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
30c0: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
30d0: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
30e0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
30f0: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3100: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
3110: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
3120: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
3130: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
3140: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
3150: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3160: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3170: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3180: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3190: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
31a0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
31b0: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
31c0: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
31d0: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
31e0: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
31f0: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3200: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
3210: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
3220: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
3230: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
3240: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3250: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3260: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3270: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3280: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3290: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
32a0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
32b0: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
32c0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
32d0: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
32e0: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
32f0: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3300: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
3310: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
3320: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
3330: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
3340: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
3350: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
3360: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3370: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3380: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3390: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
33a0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
33b0: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
33c0: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
33d0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
33e0: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
33f0: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3400: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
3410: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
3420: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
3430: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
3440: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3450: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
3460: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3470: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3480: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3490: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
34a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
34b0: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
34c0: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
34d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
34e0: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
34f0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3500: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3510: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3520: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3530: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3540: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3550: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3560: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3570: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3580: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3590: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
35a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
35b0: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
35c0: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
35d0: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
35e0: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
35f0: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3600: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3610: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3630: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3640: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3650: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3660: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3670: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3680: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3690: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
36a0: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
36b0: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
36c0: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
36d0: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
36e0: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
36f0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3700: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3710: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3720: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3730: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3740: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3750: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3760: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3770: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3780: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3790: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
37a0: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
37b0: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
37c0: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
37d0: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
37e0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
37f0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
3800: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
3810: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
3820: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
3830: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
3840: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
3850: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
3860: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
3870: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3880: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
3890: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
38a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
38b0: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
38c0: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
38d0: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
38e0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
38f0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
3900: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
3910: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
3920: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
3930: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
3940: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3950: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
3960: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3970: 4e 4f 28 78 29 20 28 28 50 67 6e 6f 29 28 28 50  NO(x) ((Pgno)((P
3980: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
3990: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 29  ->pageSize))+1))
39a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
39b0: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
39c0: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
39d0: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
39e0: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
39f0: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
3a00: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3a10: 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
3a20: 74 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70  to write page *p
3a30: 50 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d  Pg into the sub-
3a40: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61  journal..** A pa
3a50: 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77  ge needs to be w
3a60: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
3a70: 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74  sub-journal if t
3a80: 68 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a  here exists one.
3a90: 2a 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20  ** or more open 
3aa0: 73 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77  savepoints for w
3ab0: 68 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  hich:.**.**   * 
3ac0: 54 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  The page-number 
3ad0: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  is less than or 
3ae0: 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61  equal to PagerSa
3af0: 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61  vepoint.nOrig, a
3b00: 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69  nd.**   * The bi
3b10: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
3b20: 74 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  to the page-numb
3b30: 65 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e  er is not set in
3b40: 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
3b50: 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f  epoint.pInSavepo
3b60: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
3b70: 6e 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  nt subjRequiresP
3b80: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
3b90: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
3ba0: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  Pg->pgno;.  Page
3bb0: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
3bc0: 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69  >pPager;.  int i
3bd0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3be0: 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
3bf0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  t; i++){.    Pag
3c00: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
3c10: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
3c20: 6f 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28  oint[i];.    if(
3c30: 20 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20   p->nOrig>=pgno 
3c40: 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74  && 0==sqlite3Bit
3c50: 76 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61  vecTest(p->pInSa
3c60: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29  vepoint, pgno) )
3c70: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
3c80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
3c90: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3ca0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3cb0: 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
3cc0: 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ady in the journ
3cd0: 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  al file..*/.stat
3ce0: 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75  ic int pageInJou
3cf0: 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29  rnal(PgHdr *pPg)
3d00: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3d10: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67  e3BitvecTest(pPg
3d20: 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ->pPager->pInJou
3d30: 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
3d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
3d50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3d60: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
3d70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3d80: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
3d90: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
3da0: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
3db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
3dc0: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
3dd0: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
3de0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
3df0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
3e00: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
3e10: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
3e20: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
3e30: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
3e40: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73  int read32bits(s
3e50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
3e60: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
3e70: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
3e80: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
3e90: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
3ea0: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
3eb0: 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66   sizeof(ac), off
3ec0: 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
3ed0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
3ee0: 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33   *pRes = sqlite3
3ef0: 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20  Get4byte(ac);.  
3f00: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
3f10: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
3f20: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
3f30: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
3f40: 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  fer in big-endia
3f50: 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f  n byte order..*/
3f60: 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69  .#define put32bi
3f70: 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33  ts(A,B)  sqlite3
3f80: 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c  Put4byte((u8*)A,
3f90: 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  B)../*.** Write 
3fa0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3fb0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
3fc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
3fd0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
3fe0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
3ff0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4000: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4010: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4020: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4030: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4040: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4050: 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63  t, u32 val){.  c
4060: 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74  har ac[4];.  put
4070: 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b  32bits(ac, val);
4080: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4090: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
40a0: 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a   4, offset);.}..
40b0: 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46  /*.** If file pF
40c0: 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20  d is open, call 
40d0: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
40e0: 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  ) on it..*/.stat
40f0: 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28  ic int osUnlock(
4100: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
4110: 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20  d, int eLock){. 
4120: 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68   if( !pFd->pMeth
4130: 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
4140: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
4150: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4160: 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65  3OsUnlock(pFd, e
4170: 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Lock);.}../*.** 
4180: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
4190: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
41a0: 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d   or not the atom
41b0: 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
41c0: 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20  ation.** can be 
41d0: 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20 70  used with this p
41e0: 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69  ager. The optimi
41f0: 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73  zation can be us
4200: 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61  ed if:.**.**  (a
4210: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
4220: 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63 65  rned by OsDevice
4230: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
4240: 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  ) indicates that
4250: 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61 62  .**      a datab
4260: 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65 20  ase page may be 
4270: 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
4280: 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20  ly, and.**  (b) 
4290: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
42a0: 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69  ed by OsSectorSi
42b0: 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68 61  ze() is less tha
42c0: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20  n or equal.**   
42d0: 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20 73     to the page s
42e0: 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
42f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
4300: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30  annot be used, 0
4310: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
4320: 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c   it can be used,
4330: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c  .** then the val
4340: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
4350: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
4360: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
4370: 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20   it.** contains 
4380: 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f  rollback data fo
4390: 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  r exactly one pa
43a0: 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ge..*/.#ifdef SQ
43b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
43c0: 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20  IC_WRITE.static 
43d0: 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  int jrnlBufferSi
43e0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
43f0: 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20  ){.  int dc;    
4400: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
4410: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
4420: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f   */.  int nSecto
4430: 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f  r;      /* Secto
4440: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20  r size */.  int 
4450: 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f  szPage;        /
4460: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  * Page size */. 
4470: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
4480: 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
4490: 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  .  if( fd->pMeth
44a0: 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20  ods ){.    dc = 
44b0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
44c0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66  haracteristics(f
44d0: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
44e0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
44f0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 73  rSize(fd);.    s
4500: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
4510: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
4520: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
4530: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
4540: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
4550: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
4560: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
4570: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
4580: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
4590: 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28   .       (dc & (
45a0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
45b0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
45c0: 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50   && nSector<=szP
45d0: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
45e0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
45f0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
4600: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4610: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4620: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
4630: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4640: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4650: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4660: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4670: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4680: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4690: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
46a0: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
46b0: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
46c0: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
46d0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
46e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
46f0: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
4700: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4710: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4720: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4730: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4740: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4760: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4770: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4780: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
4790: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
47a0: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
47b0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
47c0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
47d0: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
47e0: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
47f0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
4800: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
4810: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4820: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
4830: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
4840: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
4850: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
4860: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
4870: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4880: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
4890: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
48a0: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
48b0: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
48c0: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
48d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
48e0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
48f0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
4900: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
4910: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
4920: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
4930: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
4940: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
4950: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
4960: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
4970: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
4980: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4990: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
49a0: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
49b0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
49c0: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
49d0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
49e0: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
49f0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4a00: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4a10: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4a20: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
4a30: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
4a40: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
4a50: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
4a60: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
4a70: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4a80: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4a90: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4aa0: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4ab0: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
4ac0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4ad0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
4ae0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
4af0: 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73  NLOCK .     && s
4b00: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
4b10: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
4b20: 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b  ache)==0 .    ){
4b30: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4b40: 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
4b50: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c  y unlocked, call
4b60: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
4b70: 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  now to.      ** 
4b80: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
4b90: 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65  state and ensure
4ba0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d   that the pager-
4bb0: 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20  cache is .      
4bc0: 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  ** completely em
4bd0: 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  pty..      */.  
4be0: 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
4bf0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
4c00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
4c20: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
4c30: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
4c40: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
4c50: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
4c60: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
4c70: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
4c80: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4c90: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
4ca0: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4cb0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
4cc0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4cd0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
4ce0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
4cf0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
4d00: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
4d10: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
4d20: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
4d30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4d40: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
4d50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4d60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
4d70: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4d80: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
4d90: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
4da0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
4db0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4dc0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
4dd0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
4de0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
4df0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
4e00: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
4e10: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
4e20: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
4e30: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
4e40: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
4e50: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
4e60: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
4e70: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
4e80: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
4e90: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
4ea0: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
4eb0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
4ec0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
4ed0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
4ee0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
4ef0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
4f00: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
4f10: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
4f20: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
4f30: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
4f40: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
4f50: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
4f60: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
4f70: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
4f80: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
4f90: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
4fa0: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
4fb0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
4fc0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
4fd0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
4fe0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
4ff0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
5000: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
5010: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
5020: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
5030: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
5040: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
5050: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
5060: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
5070: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5080: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5090: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
50a0: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
50b0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
50c0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
50d0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
50e0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
50f0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
5100: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
5110: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
5120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5130: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
5140: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5150: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5160: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
5170: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
5180: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
5190: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
51a0: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
51b0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
51c0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
51d0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
51e0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
51f0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
5200: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
5210: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
5220: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
5230: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
5240: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
5250: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
5260: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
5270: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
5280: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
5290: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
52a0: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
52b0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
52c0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
52d0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
52e0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
52f0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
5300: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
5310: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
5320: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5330: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
5340: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5350: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5360: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5370: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5380: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5390: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
53a0: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
53b0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
53c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
53d0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
53e0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
53f0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5410: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5420: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5430: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5440: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5450: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5460: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5470: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5480: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5490: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
54a0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
54b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
54c0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
54d0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
54e0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
54f0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
5500: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5510: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5520: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5530: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5540: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5550: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5560: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5570: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5590: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
55a0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
55b0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
55c0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
55d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
55e0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
55f0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
5600: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5610: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5620: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5630: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5640: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5650: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5670: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
5680: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
5690: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
56a0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
56b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
56c0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
56d0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
56e0: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
56f0: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
5700: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5710: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5720: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5730: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5740: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5750: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5760: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5770: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5780: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5790: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
57a0: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
57b0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
57c0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
57d0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
57e0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
57f0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
5800: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5810: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5820: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5830: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5840: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5850: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5860: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5870: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5880: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5890: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
58a0: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
58b0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
58c0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
58d0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
58e0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
58f0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5900: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5910: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5920: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5930: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5940: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5970: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5980: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5990: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
59a0: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
59b0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
59c0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
59d0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
59f0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  .** .*/.static v
5a00: 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  oid seekJournalH
5a10: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5a20: 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20  ){.  i64 offset 
5a30: 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70  = 0;.  i64 c = p
5a40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5a50: 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20  f;.  if( c ){.  
5a60: 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31    offset = ((c-1
5a70: 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )/JOURNAL_HDR_SZ
5a80: 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20  (pPager) + 1) * 
5a90: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5aa0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73  Pager);.  }.  as
5ab0: 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55  sert( offset%JOU
5ac0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5ad0: 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  er)==0 );.  asse
5ae0: 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b  rt( offset>=c );
5af0: 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73  .  assert( (offs
5b00: 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44  et-c)<JOURNAL_HD
5b10: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
5b20: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
5b30: 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d  lOff = offset;.}
5b40: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65  ../*.** Write ze
5b50: 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61  ros over the hea
5b60: 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
5b70: 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68  al file.  This h
5b80: 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74  as the.** effect
5b90: 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67   of invalidating
5ba0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5bb0: 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67  e and committing
5bc0: 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
5bd0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5be0: 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64  nt zeroJournalHd
5bf0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
5c00: 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29   int doTruncate)
5c10: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5c20: 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63  ITE_OK;.  static
5c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
5c40: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 0a  Hdr[28] = {0};..
5c50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
5c60: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
5c70: 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50 61  i64 iLimit = pPa
5c80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
5c90: 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52  Limit;..    IOTR
5ca0: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
5cb0: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
5cc0: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
5cd0: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
5ce0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5cf0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
5d00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
5d10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
5d30: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
5d40: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
5d50: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
5d60: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
5d70: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
5d80: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
5d90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5da0: 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
5db0: 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53  r->jfd, SQLITE_S
5dc0: 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61  YNC_DATAONLY|pPa
5dd0: 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
5de0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5df0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
5e00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5e10: 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20 74   committed but t
5e20: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20  he write lock . 
5e30: 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68     ** is still h
5e40: 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  eld on the file.
5e50: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 73   If there is a s
5e60: 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67  ize limit config
5e70: 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ured for .    **
5e80: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
5e90: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
5ea0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72  journal file cur
5eb0: 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20  rently consumes 
5ec0: 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61 63  more.    ** spac
5ed0: 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d 69  e than that limi
5ee0: 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72  t allows for, tr
5ef0: 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  uncate it now. T
5f00: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
5f10: 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74      ** to sync t
5f20: 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e  he file followin
5f30: 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  g this operation
5f40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5f50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5f60: 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20  & iLimit>0 ){.  
5f70: 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20 20      i64 sz;.    
5f80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5f90: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
5fa0: 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20  >jfd, &sz);.    
5fb0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5fc0: 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74  _OK && sz>iLimit
5fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
5fe0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
5ff0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
6000: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d  iLimit);.      }
6010: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6030: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6040: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6050: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6060: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
6070: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
6080: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6090: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
60a0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
60b0: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
60c0: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
60d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
60e0: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
60f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
6100: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
6110: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
6120: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
6130: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
6140: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
6150: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
6160: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
6170: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
6180: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
6190: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
61a0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
61b0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
61c0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
61d0: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
61e0: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
61f0: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
6200: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
6210: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
6220: 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  l..** - 4 bytes:
6230: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20 73   Database page s
6240: 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  ize..** .** Foll
6250: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
6260: 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79  _HDR_SZ - 28) by
6270: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
6280: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
6290: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
62a0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
62b0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
62c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20  LITE_OK;.  char 
62d0: 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65  *zHeader = pPage
62e0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
62f0: 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70 50  u32 nHeader = pP
6300: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
6310: 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 20 20    u32 nWrite;.  
6320: 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20 6e  int ii;..  if( n
6330: 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48  Header>JOURNAL_H
6340: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
6350: 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a  .    nHeader = J
6360: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6370: 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
6380: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 63   If there are ac
6390: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
63a0: 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20  and any of them 
63b0: 77 65 72 65 20 63 72 65 61 74 65 64 20 73 69 6e  were created sin
63c0: 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 73 74  ce the.  ** most
63d0: 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20   recent journal 
63e0: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
63f0: 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 50  en, update the P
6400: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
6410: 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65 6c 64  drOff.  ** field
6420: 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s now..  */.  fo
6430: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
6440: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
6450: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 50  i++){.    if( pP
6460: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
6470: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 3d  [ii].iHdrOffset=
6480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
6490: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
64a0: 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d 20  i].iHdrOffset = 
64b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
64c0: 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ff;.    }.  }.. 
64d0: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
64e0: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
64f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
6500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6510: 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a 48  ff;..  memcpy(zH
6520: 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d  eader, aJournalM
6530: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
6540: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
6550: 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65 20   /* .  ** Write 
6560: 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20 2d  the nRec Field -
6570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6580: 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  age records that
6590: 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20 2a   follow this.  *
65a0: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
65b0: 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72 6f  . Normally, zero
65c0: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
65d0: 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68 69  his value at thi
65e0: 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66 74  s time..  ** Aft
65f0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  er the records a
6600: 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
6610: 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68 65  journal (and the
6620: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64 2c   journal synced,
6630: 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75 6c   .  ** if in ful
6640: 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74 68  l-sync mode), th
6650: 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77 72  e zero is overwr
6660: 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20 74  itten with the t
6670: 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  rue number.  ** 
6680: 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65 20  of records (see 
6690: 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e 0a  syncJournal())..
66a0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73 74    **.  ** A fast
66b0: 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 69  er alternative i
66c0: 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46 46  s to write 0xFFF
66d0: 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52 65  FFFFF to the nRe
66e0: 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20 20  c field. When.  
66f0: 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 6a  ** reading the j
6700: 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c 75  ournal this valu
6710: 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20 74  e tells SQLite t
6720: 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  o assume that th
6730: 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20 74  e.  ** rest of t
6740: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6750: 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20 70  contains valid p
6760: 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68 69  age records. Thi
6770: 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20 2a  s assumption.  *
6780: 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c 20  * is dangerous, 
6790: 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  as if a failure 
67a0: 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77  occured whilst w
67b0: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
67c0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20  urnal.  ** file 
67d0: 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 73  it may contain s
67e0: 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74 61  ome garbage data
67f0: 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 20  . There are two 
6800: 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20 77  scenarios.  ** w
6810: 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20 63  here this risk c
6820: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a 20  an be ignored:. 
6830: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
6840: 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  n the pager is i
6850: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
6860: 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20 66  Corruption can f
6870: 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20 20  ollow a.  **    
6880: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 69   power failure i
6890: 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79 77  n this case anyw
68a0: 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ay..  **.  **   
68b0: 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49 54  * When the SQLIT
68c0: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
68d0: 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2e  END flag is set.
68e0: 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
68f0: 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20 67  .  **     that g
6900: 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20 6e  arbage data is n
6910: 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74 6f  ever appended to
6920: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6930: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
6940: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
6950: 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 6e  thods||pPager->n
6960: 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28 70  oSync);.  if( (p
6970: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c  Pager->noSync) |
6980: 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
6990: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
69a0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
69b0: 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33  ).   || (sqlite3
69c0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
69d0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
69e0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
69f0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
6a00: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
6a10: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6a20: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6a30: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
6a40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
6a50: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6a60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6a70: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
6a80: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
6a90: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
6aa0: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
6ab0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
6ac0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
6ad0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
6ae0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6af0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6b00: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6b10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
6b20: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6b30: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
6b40: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
6b50: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
6b60: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6b70: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6b80: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f  +8], pPager->dbO
6b90: 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54  rigSize);.  /* T
6ba0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
6bb0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
6bc0: 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74  process */.  put
6bd0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6be0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6bf0: 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65  agic)+12], pPage
6c00: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
6c10: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
6c20: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
6c30: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
6c40: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
6c50: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
6c60: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
6c70: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
6c80: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
6c90: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
6ca0: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
6cb0: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
6cc0: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
6cd0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
6ce0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
6cf0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
6d00: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
6d10: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
6d20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6d30: 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20 20  gic)+16], 0,.   
6d40: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
6d50: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6d60: 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69 66  gic)+16));..  if
6d70: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
6d80: 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lHdr==0 ){.    /
6d90: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
6da0: 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  */.    put32bits
6db0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6dc0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6dd0: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
6de0: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  eSize);.  }..  f
6df0: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
6e00: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
6e10: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
6e20: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
6e30: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
6e40: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
6e50: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
6e60: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
6e70: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
6e80: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
6e90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
6ea0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
6eb0: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
6ec0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
6ed0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
6ee0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
6ef0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
6f00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6f10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6f20: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
6f30: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
6f40: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
6f50: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
6f60: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
6f70: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
6f80: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6f90: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
6fa0: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20  al.** file. The 
6fb0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6fc0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
6fd0: 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62 79  file is given by
6fe0: 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  .** pPager->jour
6ff0: 6e 61 6c 4f 66 66 2e 20 20 53 65 65 20 63 6f 6d  nalOff.  See com
7000: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
7010: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
7020: 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61 20  lHdr() for.** a 
7030: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
7040: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
7050: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
7060: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
7070: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
7080: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
7090: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
70a0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
70b0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
70c0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
70d0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
70e0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
70f0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
7100: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
7110: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
7120: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
7130: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
7140: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
7150: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
7160: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
7170: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
7180: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
7190: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
71a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
71b0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
71c0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
71d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
71e0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
71f0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
7200: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
7210: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
7220: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
7230: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
7240: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7250: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
7260: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
7270: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
7280: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
7290: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
72a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
72b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
72c0: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
72d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
72e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
72f0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
7300: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
7310: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ic header */.  i
7320: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e  64 jrnlOff;.  in
7330: 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  t iPageSize;..  
7340: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
7350: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7360: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7370: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
7380: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
7390: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
73a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
73b0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
73c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
73d0: 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  Off;..  rc = sql
73e0: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
73f0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
7400: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
7410: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20  jrnlOff);.  if( 
7420: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7430: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a    jrnlOff += siz
7440: 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20  eof(aMagic);..  
7450: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
7460: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
7470: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
7480: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
7490: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
74a0: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
74b0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
74c0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52  fd, jrnlOff, pNR
74d0: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
74e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
74f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7500: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7510: 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63  ff+4, &pPager->c
7520: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
7530: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7540: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7550: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7560: 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53   jrnlOff+8, pDbS
7570: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
7580: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
7590: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
75a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
75b0: 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26  Off+16, (u32 *)&
75c0: 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  iPageSize);.  if
75d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
75e0: 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65  .   && iPageSize
75f0: 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50 61  >=512 .   && iPa
7600: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
7610: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
7620: 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d   && ((iPageSize-
7630: 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30  1)&iPageSize)==0
7640: 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70   .  ){.    u16 p
7650: 61 67 65 73 69 7a 65 20 3d 20 28 75 31 36 29 69  agesize = (u16)i
7660: 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63  PageSize;.    rc
7670: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
7680: 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65  etPagesize(pPage
7690: 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a 20  r, &pagesize);. 
76a0: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72 65   }.  if( rc ) re
76b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
76c0: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
76d0: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
76e0: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
76f0: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
7700: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
7710: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
7720: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
7730: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
7740: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
7750: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
7760: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
7770: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
7780: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
7790: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
77a0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
77b0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
77c0: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
77d0: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
77e0: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
77f0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
7800: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
7810: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7820: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 26  d, jrnlOff+12, &
7830: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
7840: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
7850: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
7860: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
7870: 53 69 7a 65 20 26 20 28 70 50 61 67 65 72 2d 3e  Size & (pPager->
7880: 73 65 63 74 6f 72 53 69 7a 65 2d 31 29 29 21 3d  sectorSize-1))!=
7890: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50  0.         || pP
78a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
78b0: 3e 30 78 31 30 30 30 30 30 30 20 29 7b 0a 20 20  >0x1000000 ){.  
78c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
78d0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 70 50 61  DONE;.  }..  pPa
78e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
78f0: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
7900: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  Z(pPager);.  ret
7910: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7920: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
7930: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
7940: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7950: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
7960: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
7970: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
7980: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
7990: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
79a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
79b0: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
79c0: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
79d0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
79e0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
79f0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
7a00: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
7a10: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
7a20: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
7a30: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
7a40: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
7a50: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
7a60: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
7a70: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20  mat is:.**.** + 
7a80: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
7a90: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62  J_PGNO..** + N b
7aa0: 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20  ytes: length of 
7ab0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7ac0: 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  ame..** + 4 byte
7ad0: 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  s: N.** + 4 byte
7ae0: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
7af0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
7b00: 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61  .** + 8 bytes: a
7b10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
7b20: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
7b30: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
7b40: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
7b50: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
7b60: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
7b70: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7b80: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
7b90: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
7ba0: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
7bb0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
7bc0: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
7bd0: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
7be0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
7bf0: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
7c00: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
7c10: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
7c20: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
7c30: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e  nt rc;.  int len
7c40: 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69  ; .  int i; .  i
7c50: 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36  64 jrnlOff;.  i6
7c60: 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33  4 jrnlSize;.  u3
7c70: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63  2 cksum = 0;.  c
7c80: 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28  har zBuf[sizeof(
7c90: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
7ca0: 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  *4];..  if( !zMa
7cb0: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
7cc0: 73 65 74 4d 61 73 74 65 72 20 29 20 72 65 74 75  setMaster ) retu
7cd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7ce0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
7cf0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
7d00: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
7d10: 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  Y ) return SQLIT
7d20: 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  E_OK;.  pPager->
7d30: 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a  setMaster = 1;..
7d40: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
7d50: 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
7d60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
7d70: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
7d80: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
7d90: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
7da0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
7db0: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
7dc0: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
7dd0: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
7de0: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
7df0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
7e00: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
7e10: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
7e20: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
7e30: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
7e40: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
7e50: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
7e60: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
7e70: 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f  nc ){.    seekJo
7e80: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
7e90: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
7ea0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
7eb0: 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
7ec0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
7ed0: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
7ee0: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
7ef0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
7f00: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
7f10: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
7f20: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7f30: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e  return rc;.  jrn
7f40: 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63  lOff += 4;..  rc
7f50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
7f60: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
7f70: 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e  Master, len, jrn
7f80: 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21  lOff);.  if( rc!
7f90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7fa0: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
7fb0: 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74  f += len;..  put
7fc0: 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e  32bits(zBuf, len
7fd0: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
7fe0: 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b  zBuf[4], cksum);
7ff0: 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b  .  memcpy(&zBuf[
8000: 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  8], aJournalMagi
8010: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
8020: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20  alMagic));.  rc 
8030: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
8040: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42  (pPager->jfd, zB
8050: 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f  uf, 8+sizeof(aJo
8060: 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e  urnalMagic), jrn
8070: 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66  lOff);.  jrnlOff
8080: 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f   += 8+sizeof(aJo
8090: 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70  urnalMagic);.  p
80a0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
80b0: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
80c0: 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  c;..  /* If the 
80d0: 70 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69  pager is in peri
80e0: 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f  stent-journal mo
80f0: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79  de, then the phy
8100: 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72  sical .  ** jour
8110: 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74  nal-file may ext
8120: 65 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  end past the end
8130: 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
8140: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a  ournal name.  **
8150: 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20   and 8 bytes of 
8160: 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20  magic data just 
8170: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66  written to the f
8180: 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20  ile. This is .  
8190: 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63  ** dangerous bec
81a0: 61 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f  ause the code to
81b0: 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d   rollback a hot-
81c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
81d0: 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62  * will not be ab
81e0: 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d  le to find the m
81f0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
8200: 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  me to determine 
8210: 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  .  ** whether or
8220: 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c   not the journal
8230: 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20   is hot. .  **. 
8240: 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e   ** Easiest thin
8250: 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20  g to do in this 
8260: 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74  scenario is to t
8270: 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72  runcate the jour
8280: 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74  nal .  ** file t
8290: 6f 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73  o the required s
82a0: 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  ize..  */ .  if(
82b0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
82c0: 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c  .   && (rc = sql
82d0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
82e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e  Pager->jfd, &jrn
82f0: 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f  lSize))==SQLITE_
8300: 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a  OK.   && jrnlSiz
8310: 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20  e>jrnlOff.  ){. 
8320: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8330: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8340: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b  ->jfd, jrnlOff);
8350: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8360: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
8370: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
8380: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
8390: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
83a0: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
83b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
83c0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
83d0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
83e0: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
83f0: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
8400: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
8410: 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71    PgHdr *p;.  sq
8420: 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
8430: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
8440: 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a  , pgno, 0, &p);.
8450: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
8460: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69  *.** Clear the i
8470: 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
8480: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
8490: 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
84a0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63  of the pager bac
84b0: 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73  k to what it was
84c0: 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72   when it was fir
84d0: 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41  st.** opened.  A
84e0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ny outstanding p
84f0: 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
8500: 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75  ated and subsequ
8510: 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20  ent attempts.** 
8520: 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20  to access those 
8530: 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  pages will likel
8540: 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  y result in a co
8550: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69  redump..*/.stati
8560: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73  c void pager_res
8570: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
8580: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
8590: 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72  >errCode ) retur
85a0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  n;.  sqlite3Pcac
85b0: 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
85c0: 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pPCache);.}../*.
85d0: 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75  ** Free all stru
85e0: 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61  ctures in the Pa
85f0: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d  ger.aSavepoint[]
8600: 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62   array and set b
8610: 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61  oth.** Pager.aSa
8620: 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65  vepoint and Page
8630: 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20  r.nSavepoint to 
8640: 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20  zero. Close the 
8650: 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  sub-journal.** i
8660: 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64  f it is open and
8670: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
8680: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
8690: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ode..*/.static v
86a0: 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  oid releaseAllSa
86b0: 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
86c0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69  Pager){.  int ii
86d0: 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
86e0: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
86f0: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
8700: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
8710: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
8720: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
8730: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
8740: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
8750: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8760: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8770: 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b  e(pPager->sjfd);
8780: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
8790: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76  ree(pPager->aSav
87a0: 65 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65  epoint);.  pPage
87b0: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->aSavepoint = 
87c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  0;.  pPager->nSa
87d0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70  vepoint = 0;.  p
87e0: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
87f0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
8800: 74 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72  t the bit number
8810: 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67   pgno in the Pag
8820: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
8830: 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
8840: 20 6f 66 0a 2a 2a 20 61 6c 6c 20 6f 70 65 6e 20   of.** all open 
8850: 73 61 76 65 70 6f 69 6e 74 73 2e 0a 2a 2f 0a 73  savepoints..*/.s
8860: 74 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53  tatic int addToS
8870: 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
8880: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
8890: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
88a0: 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
88b0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
88c0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
88d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
88e0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
88f0: 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  code */..  for(i
8900: 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  i=0; ii<pPager->
8910: 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
8920: 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65  ){.    PagerSave
8930: 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67  point *p = &pPag
8940: 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69  er->aSavepoint[i
8950: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f  i];.    if( pgno
8960: 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20  <=p->nOrig ){.  
8970: 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65      rc |= sqlite
8980: 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49  3BitvecSet(p->pI
8990: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f  nSavepoint, pgno
89a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
89b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
89c0: 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
89d0: 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  EM );.    }.  }.
89e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
89f0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
8a00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8a10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
8a20: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
8a30: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
8a40: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
8a50: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
8a60: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
8a70: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
8a80: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
8a90: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
8aa0: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
8ab0: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
8ac0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
8ad0: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
8ae0: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
8af0: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
8b00: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
8b10: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
8b20: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
8b30: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
8b40: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
8b50: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
8b60: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
8b70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8b80: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
8b90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
8ba0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55      int rc = osU
8bb0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
8bc0: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
8bd0: 69 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d  if( rc ) pPager-
8be0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
8bf0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
8c00: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  eValid = 0;.    
8c10: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
8c20: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
8c30: 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  ..    /* Always 
8c40: 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  close the journa
8c50: 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70  l file when drop
8c60: 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ping the databas
8c70: 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f  e lock..    ** O
8c80: 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65  therwise, anothe
8c90: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  r connection wit
8ca0: 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64  h journal_mode=d
8cb0: 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20  elete might.    
8cc0: 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69  ** delete the fi
8cd0: 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  le out from unde
8ce0: 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  r us..    */.   
8cf0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8d00: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
8d10: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8d20: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
8d30: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8d40: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  rnalOpen = 0;.  
8d50: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
8d60: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
8d70: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
8d80: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
8d90: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8da0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
8db0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
8dc0: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b  AlwaysRollback);
8dd0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
8de0: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  AlwaysRollback =
8df0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
8e00: 2a 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f  * If Pager.errCo
8e10: 64 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63  de is set, the c
8e20: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
8e30: 61 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f  ager cache canno
8e40: 74 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73  t be.    ** trus
8e50: 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68  ted. Now that th
8e60: 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
8e70: 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f  unlocked, the co
8e80: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20  ntents of the.  
8e90: 20 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62    ** cache can b
8ea0: 65 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20  e discarded and 
8eb0: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73  the error code s
8ec0: 61 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20  afely cleared.. 
8ed0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
8ee0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
8ef0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
8f00: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65  QLITE_OK ) pPage
8f10: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
8f20: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61  ITE_OK;.      pa
8f30: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
8f40: 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
8f50: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61  AllSavepoint(pPa
8f60: 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
8f70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8f80: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8f90: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8fa0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
8fb0: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
8fc0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0;.    }..    p
8fd0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8fe0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
8ff0: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
9000: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
9010: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
9020: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
9030: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9040: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
9050: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
9060: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
9070: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
9080: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
9090: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a  error state, .**
90a0: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
90b0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  the rollback..*/
90c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
90d0: 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
90e0: 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ack(Pager *p){. 
90f0: 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d   if( p->errCode=
9100: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d  =SQLITE_OK && p-
9110: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
9120: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
9130: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
9140: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
9150: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
9160: 63 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ck(p);.    sqlit
9170: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
9180: 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  c();.  }.  pager
9190: 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f  _unlock(p);.}../
91a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
91b0: 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63  e ends a transac
91c0: 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63  tion.  A transac
91d0: 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79  tion is ended by
91e0: 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d   either.** a COM
91f0: 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43  MIT or a ROLLBAC
9200: 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  K..**.** When th
9210: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9220: 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
9230: 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  has the journal 
9240: 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a  file open and.**
9250: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
9260: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
9270: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
9280: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9290: 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65  l release.** the
92a0: 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61   database lock a
92b0: 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48  nd acquires a SH
92c0: 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73  ARED lock in its
92d0: 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69   place if that i
92e0: 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  s.** the appropr
92f0: 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f  iate thing to do
9300: 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73  .  Release locks
9310: 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72   usually is appr
9320: 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65  opriate,.** unle
9330: 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63  ss we are in exc
9340: 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f  lusive access mo
9350: 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69  de or unless thi
9360: 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49  s is a .** COMMI
9370: 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52  T AND BEGIN or R
9380: 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49  OLLBACK AND BEGI
9390: 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  N operation..**.
93a0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
93b0: 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65  ile is either de
93c0: 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74  leted or truncat
93d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
93e0: 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67  Consider keeping
93f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9400: 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f  e open for tempo
9410: 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a  rary databases..
9420: 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69  ** This might gi
9430: 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
9440: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20   improvement on 
9450: 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70  windows where op
9460: 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20  ening.** a file 
9470: 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20  is an expensive 
9480: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  operation..*/.st
9490: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
94a0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50  nd_transaction(P
94b0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
94c0: 74 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20  t hasMaster){.  
94d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
94e0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
94f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
9500: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
9510: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
9520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9530: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c  TE_OK;.  }.  rel
9540: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
9550: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
9560: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9570: 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70  pen ){.    if( p
9580: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9590: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
95a0: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
95b0: 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f        int isMemo
95c0: 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  ryJournal = sqli
95d0: 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28  te3IsMemJournal(
95e0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
95f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9600: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
9610: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9620: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
9630: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
9640: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
9650: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9660: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
9670: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
9680: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
9690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
96a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
96b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
96c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
96d0: 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 26 26  CATE.         &&
96e0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
96f0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
9700: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
9710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
9720: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9730: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
9740: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
9750: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
9760: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
9770: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
9780: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
9790: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
97a0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
97b0: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
97c0: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
97d0: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
97e0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
97f0: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
9800: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
9810: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9820: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
9830: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
9840: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
9850: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
9860: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9870: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
9880: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
9890: 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  | rc );.      sq
98a0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
98b0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
98c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
98d0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
98e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
98f0: 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  K && !pPager->te
9900: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
9910: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9920: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
9930: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
9940: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
9950: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9960: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
9970: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
9980: 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
9990: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
99a0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69  0;.    sqlite3Bi
99b0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
99c0: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
99d0: 61 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ack);.    pPager
99e0: 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
99f0: 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  k = 0;.#ifdef SQ
9a00: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
9a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
9a20: 68 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70  heIterateDirty(p
9a30: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
9a40: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
9a50: 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  sh);.#endif.    
9a60: 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
9a70: 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50  anAll(pPager->pP
9a80: 43 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67  Cache);.    pPag
9a90: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
9aa0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
9ab0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
9ac0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
9ad0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
9ae0: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  l==0 );.  }..  i
9af0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
9b00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
9b10: 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28   rc2 = osUnlock(
9b20: 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
9b30: 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50  ED_LOCK);.    pP
9b40: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
9b50: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65  GER_SHARED;.  }e
9b60: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
9b70: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
9b80: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
9b90: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9ba0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
9bb0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
9bc0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
9bd0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9be0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
9bf0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20  dSync = 0;.  /* 
9c00: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
9c10: 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a  ynced(pPager); *
9c20: 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
9c30: 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
9c40: 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
9c50: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
9c60: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
9c70: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
9c80: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
9c90: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
9ca0: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
9cb0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9cc0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
9cd0: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
9ce0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
9cf0: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
9d00: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
9d10: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
9d20: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
9d30: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
9d40: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
9d50: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
9d60: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
9d70: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
9d80: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
9d90: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
9da0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
9db0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
9dc0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
9dd0: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
9de0: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
9df0: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
9e00: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
9e10: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
9e20: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
9e30: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
9e40: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
9e50: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
9e60: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
9e70: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
9e80: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
9e90: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
9ea0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
9eb0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
9ec0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
9ed0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
9ee0: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
9ef0: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
9f00: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
9f10: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
9f20: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
9f30: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
9f40: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
9f50: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
9f60: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
9f70: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
9f80: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
9f90: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
9fa0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
9fb0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
9fc0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
9fd0: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
9fe0: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
9ff0: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
a000: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
a010: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
a020: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
a030: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
a040: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
a050: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
a060: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
a070: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
a080: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
a090: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
a0a0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
a0b0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
a0c0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
a0d0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
a0e0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
a0f0: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
a100: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
a110: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
a120: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
a130: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
a140: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a150: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
a160: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
a170: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
a180: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
a190: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
a1a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
a1b0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
a1c0: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
a1d0: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
a1e0: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
a1f0: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
a200: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
a210: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
a220: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
a230: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
a240: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
a250: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
a260: 20 66 69 6c 65 2e 20 20 54 68 65 20 20 2a 70 4f   file.  The  *pO
a270: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
a280: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
a290: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a2a0: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
a2b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
a2c0: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
a2d0: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
a2e0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
a2f0: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
a300: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
a310: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
a320: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
a330: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
a340: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
a350: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
a360: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
a370: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
a380: 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
a390: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
a3a0: 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
a3b0: 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
a3c0: 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
a3d0: 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
a3e0: 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
a3f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a400: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
a410: 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
a420: 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
a430: 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
a440: 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
a450: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
a460: 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
a470: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a480: 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
a490: 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
a4a0: 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  o returning..*/.
a4b0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a4c0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
a4d0: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
a4e0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
a4f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
a500: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
a510: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
a520: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
a530: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
a540: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
a550: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
a560: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a580: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
a590: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
a5a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
a5b0: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
a5c0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
a5d0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
a5e0: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
a5f0: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
a600: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
a610: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
a620: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
a630: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a640: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a660: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
a670: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
a680: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
a6b0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
a6c0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
a6d0: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6f0: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
a700: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
a710: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
a720: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
a730: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
a740: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
a750: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
a760: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
a770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a780: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
a790: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
a7a0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
a7b0: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
a7c0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
a7d0: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
a7e0: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
a7f0: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
a800: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
a810: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
a820: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
a830: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
a840: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
a850: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
a860: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
a870: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
a880: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
a890: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
a8a0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
a8b0: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
a8c0: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
a8d0: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
a8e0: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
a8f0: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
a900: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
a910: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
a920: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
a930: 65 64 20 2a 2f 0a 0a 20 20 6a 66 64 20 3d 20 69  ed */..  jfd = i
a940: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
a950: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
a960: 2d 3e 73 6a 66 64 3b 0a 0a 20 20 72 63 20 3d 20  ->sjfd;..  rc = 
a970: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
a980: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
a990: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a9a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
a9b0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
a9c0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
a9d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
a9e0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
a9f0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
aa00: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
aa10: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
aa20: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
aa30: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
aa40: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
aa50: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
aa60: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
aa70: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
aa80: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
aa90: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
aaa0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
aab0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
aac0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
aad0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
aae0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
aaf0: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
ab00: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
ab10: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
ab20: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
ab30: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
ab40: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
ab50: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
ab60: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
ab70: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
ab80: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
ab90: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
aba0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
abb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
abc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
abd0: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
abe0: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
abf0: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
ac00: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
ac10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ac20: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
ac30: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
ac40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
ac50: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
ac60: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
ac70: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
ac80: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
ac90: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
aca0: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
acb0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
acc0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
acd0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
ace0: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
acf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
ad00: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
ad10: 6f 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  o)) ){.    retur
ad20: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
ad30: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
ad40: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
ad50: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
ad60: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ad70: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
ad80: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
ad90: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
ada0: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
adb0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
adc0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
add0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
ade0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
adf0: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
ae00: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
ae10: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
ae20: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
ae30: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
ae40: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
ae50: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
ae60: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
ae70: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
ae80: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ae90: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
aea0: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
aeb0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
aec0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
aed0: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
aee0: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
aef0: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
af00: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
af10: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
af20: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
af30: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
af40: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
af50: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
af60: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
af70: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
af80: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
af90: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
afa0: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
afb0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
afc0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
afd0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
afe0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
aff0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
b000: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
b010: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
b020: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
b030: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
b040: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
b050: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
b060: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
b070: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b080: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
b090: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
b0a0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
b0b0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b0c0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
b0d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
b0e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b0f0: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
b100: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
b110: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
b120: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
b130: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
b140: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
b150: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
b160: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
b170: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
b180: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
b190: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
b1a0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
b1b0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
b1c0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
b1d0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
b1e0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
b1f0: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
b200: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
b210: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
b220: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
b230: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
b240: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
b250: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
b260: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
b270: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
b280: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
b290: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
b2a0: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
b2b0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
b2c0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
b2d0: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
b2e0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
b2f0: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
b300: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
b310: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
b320: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
b330: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
b340: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
b350: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
b360: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
b370: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
b380: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
b390: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
b3a0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
b3b0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
b3c0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
b3d0: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
b3e0: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
b3f0: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
b400: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
b410: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
b420: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
b430: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
b440: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b450: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
b460: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
b470: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
b480: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
b490: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
b4a0: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
b4b0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
b4c0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
b4d0: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
b4e0: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
b4f0: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
b500: 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
b510: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
b520: 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
b530: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
b540: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
b550: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
b560: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b570: 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  , aData),.      
b580: 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
b590: 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
b5a0: 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
b5b0: 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 28  ").  ));.  if( (
b5c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b5d0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
b5e0: 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c     && (pPg==0 ||
b5f0: 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26   0==(pPg->flags&
b600: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
b610: 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
b620: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
b630: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
b640: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
b650: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
b660: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
b670: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b680: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
b690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b6a0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
b6b0: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
b6c0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
b6d0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
b6e0: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
b6f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
b700: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
b710: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
b720: 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
b730: 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
b740: 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
b750: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
b760: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
b770: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
b780: 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
b790: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
b7a0: 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
b7b0: 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
b7c0: 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
b7d0: 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
b7e0: 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
b7f0: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
b800: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
b810: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
b820: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
b830: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
b840: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
b850: 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
b860: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
b870: 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
b880: 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
b890: 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
b8a0: 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
b8b0: 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
b8c0: 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
b8d0: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
b8e0: 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
b8f0: 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
b900: 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
b910: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
b920: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
b930: 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
b940: 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
b950: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
b960: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
b970: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
b980: 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
b990: 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
b9a0: 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
b9b0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
b9c0: 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
b9d0: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
b9e0: 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
b9f0: 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
ba00: 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
ba10: 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
ba20: 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
ba30: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
ba40: 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
ba50: 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
ba60: 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
ba70: 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
ba80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
ba90: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
baa0: 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
bab0: 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
bac0: 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
bad0: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  1)) ){.      ret
bae0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
baf0: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
bb00: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
bb10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
bb20: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
bb30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
bb40: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
bb50: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
bb60: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
bb70: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
bb80: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
bb90: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
bba0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
bbb0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
bbc0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
bbd0: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
bbe0: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
bbf0: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
bc00: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
bc10: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
bc20: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
bc30: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
bc40: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
bc50: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
bc60: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
bc70: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
bc80: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
bc90: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
bca0: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
bcb0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
bcc0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
bcd0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
bce0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
bcf0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
bd00: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
bd10: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
bd20: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
bd30: 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
bd40: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
bd50: 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lOff<=pPager->jo
bd60: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
bd70: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
bd80: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
bd90: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
bda0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
bdb0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
bdc0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
bdd0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
bde0: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
bdf0: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
be00: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
be10: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
be20: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
be30: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
be40: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
be50: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
be60: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
be70: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
be80: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
be90: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
bea0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
beb0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
bec0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
bed0: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
bee0: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
bef0: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
bf00: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
bf10: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
bf20: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
bf30: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
bf40: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
bf50: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
bf60: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
bf70: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
bf80: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
bf90: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
bfa0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
bfb0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
bfc0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
bfd0: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
bfe0: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
bff0: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
c000: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
c010: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c020: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
c030: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
c040: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
c050: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
c060: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
c070: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
c080: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
c090: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
c0a0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
c0b0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
c0c0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
c0d0: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
c0e0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
c0f0: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
c100: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
c110: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
c120: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
c130: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
c140: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
c150: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
c160: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
c170: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
c180: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
c190: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
c1a0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
c1b0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c1c0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
c1d0: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
c1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
c1f0: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
c200: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
c210: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c220: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
c230: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c240: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
c250: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
c260: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
c270: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
c280: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
c290: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
c2a0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
c2b0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
c2c0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
c2d0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c2e0: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
c2f0: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
c300: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
c310: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
c320: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
c330: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
c340: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
c350: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
c360: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
c370: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
c380: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
c390: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
c3a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c3b0: 3b 0a 7d 0a 0a 23 69 66 20 2f 2a 20 21 64 65 66  ;.}..#if /* !def
c3c0: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
c3d0: 2a 2f 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  */ defined(SQLIT
c3e0: 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
c3f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c400: 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65 61 64 20  ine looks ahead 
c410: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f  into the main jo
c420: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 64  urnal file and d
c430: 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20 77 68 65  etermines.** whe
c440: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
c450: 6e 65 78 74 20 72 65 63 6f 72 64 20 28 74 68 65  next record (the
c460: 20 72 65 63 6f 72 64 20 74 68 61 74 20 62 65 67   record that beg
c470: 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a 2a 20 6f  ins at file.** o
c480: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 6a 6f  ffset pPager->jo
c490: 75 72 6e 61 6c 4f 66 66 29 20 69 73 20 61 20 77  urnalOff) is a w
c4a0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61 67 65 20  ell-formed page 
c4b0: 72 65 63 6f 72 64 20 63 6f 6e 73 69 73 74 69 6e  record consistin
c4c0: 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c 69 64 20  g.** of a valid 
c4d0: 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 70 50 61  page number, pPa
c4e0: 67 65 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  ge->pageSize byt
c4f0: 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 2c 20 66  es of content, f
c500: 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79 20 61 20  ollowed.** by a 
c510: 76 61 6c 69 64 20 63 68 65 63 6b 73 75 6d 2e 0a  valid checksum..
c520: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20  **.** The pager 
c530: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 6b  never needs to k
c540: 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f 72 64 65  now this in orde
c550: 72 20 74 6f 20 64 6f 20 69 74 73 20 6a 6f 62 2e  r to do its job.
c560: 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69     This.** routi
c570: 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ne is only used 
c580: 66 72 6f 6d 20 77 69 74 68 20 61 73 73 65 72 74  from with assert
c590: 28 29 20 61 6e 64 20 74 65 73 74 63 61 73 65 28  () and testcase(
c5a0: 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61  ) macros..*/.sta
c5b0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 4e 65 78  tic int pagerNex
c5c0: 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
c5d0: 6c 69 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  lid(Pager *pPage
c5e0: 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
c5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c600: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
c610: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
c620: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
c630: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
c640: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
c650: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
c660: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
c670: 65 20 66 72 6f 6d 20 72 65 61 64 20 6f 70 65 72  e from read oper
c680: 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 71 6c 69  ations */.  sqli
c690: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20 20  te3_file *fd;   
c6a0: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
c6b0: 63 72 69 70 74 6f 72 20 66 72 6f 6d 20 77 68 69  criptor from whi
c6c0: 63 68 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ch we are readin
c6d0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
c6e0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
c6f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
c700: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ge */..  /* Read
c710: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
c720: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 66 64 20   header */.  fd 
c730: 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64 3b 0a 20  = pPager->jfd;. 
c740: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
c750: 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
c760: 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e 6f 29 3b  rnalOff, &pgno);
c770: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c780: 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30  E_OK ){ return 0
c790: 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7b0: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
c7c0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
c7d0: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
c7e0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
c7f0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
c800: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
c810: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
c820: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
c830: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f       /*NO_TEST*/
c860: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
c870: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 72 63  checksum */.  rc
c880: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64   = read32bits(fd
c890: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
c8a0: 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e 70 61 67  lOff+pPager->pag
c8b0: 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
c8c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
c8d0: 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20  TE_OK ){ return 
c8e0: 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  0; }            
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c900: 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a        /*NO_TEST*
c910: 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
c920: 20 64 61 74 61 20 61 6e 64 20 76 65 72 69 66 79   data and verify
c930: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f   the checksum */
c940: 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38 2a 29  .  aData = (u8*)
c950: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
c960: 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
c970: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 44 61 74  3OsRead(fd, aDat
c980: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
c990: 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ize, pPager->jou
c9a0: 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20 20 69 66  rnalOff+4);.  if
c9b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9c0: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66  /*NO_TEST*/.  if
ca00: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
ca10: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
ca20: 73 75 6d 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  sum ){ return 0;
ca30: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
ca40: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
ca50: 2a 20 52 65 61 63 68 20 74 68 69 73 20 70 6f 69  * Reach this poi
ca60: 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 70  nt only if the p
ca70: 61 67 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  age is valid */.
ca80: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
ca90: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
caa0: 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
cab0: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
cac0: 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a  AGE_TEST) */../*
cad0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
cae0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
caf0: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
cb00: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
cb10: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
cb20: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
cb30: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
cb40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
cb50: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
cb60: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
cb70: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
cb80: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
cb90: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
cba0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
cbb0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
cbc0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
cbd0: 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61  .** Argument zMa
cbe0: 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74  ster may point t
cbf0: 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  o Pager.pTmpSpac
cc00: 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65  e. So that buffe
cc10: 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61  r is not .** ava
cc20: 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77  ilable for use w
cc30: 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
cc40: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  ion..**.**.** Th
cc50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cc60: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
cc70: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
cc80: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
cc90: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
cca0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
ccb0: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
ccc0: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
ccd0: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
cce0: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
ccf0: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
cd00: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
cd10: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
cd20: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
cd30: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
cd40: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cd50: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
cd60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
cd70: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61  ger_delmaster(Pa
cd80: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
cd90: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
cda0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
cdb0: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
cdc0: 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  >pVfs;.  int rc;
cdd0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
cde0: 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  en = 0;.  sqlite
cdf0: 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b  3_file *pMaster;
ce00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
ce10: 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61  *pJournal;.  cha
ce20: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
ce30: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
ce40: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
ce50: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
ce60: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
ce70: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
ce80: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
ce90: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
cea0: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
ceb0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
cec0: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
ced0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
cee0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
cef0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
cf00: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
cf10: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
cf20: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
cf30: 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20   */.  pMaster = 
cf40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
cf50: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70 56  sqlite3Malloc(pV
cf60: 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32  fs->szOsFile * 2
cf70: 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20  );.  pJournal = 
cf80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
cf90: 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29  (((u8 *)pMaster)
cfa0: 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c   + pVfs->szOsFil
cfb0: 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74  e);.  if( !pMast
cfc0: 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  er ){.    rc = S
cfd0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
cfe0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c  else{.    int fl
cff0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
d000: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
d010: 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
d020: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
d030: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
d040: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
d050: 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
d060: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
d070: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d080: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
d090: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
d0a0: 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   1;..  rc = sqli
d0b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
d0c0: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
d0d0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
d0e0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d0f0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
d100: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
d110: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
d120: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
d130: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
d140: 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
d150: 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
d160: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
d170: 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
d180: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
d190: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
d1a0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
d1b0: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
d1c0: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
d1d0: 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
d1e0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
d1f0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
d200: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
d210: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
d220: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28  )sqlite3Malloc((
d230: 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
d240: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
d250: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
d260: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
d270: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d280: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
d290: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
d2a0: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
d2b0: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
d2c0: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
d2d0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
d2e0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
d2f0: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
d300: 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
d310: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
d320: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d330: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
d340: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
d350: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
d360: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
d370: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
d380: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
d390: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
d3a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
d3b0: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
d3c0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
d3d0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
d3e0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
d3f0: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
d400: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
d410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d420: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
d430: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
d440: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
d450: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
d460: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
d470: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
d480: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d490: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
d4a0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
d4b0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
d4c0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
d4d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
d4e0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
d4f0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
d500: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
d510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
d520: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
d530: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
d540: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
d550: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
d560: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
d570: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
d580: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
d590: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
d5a0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
d5b0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
d5c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
d5d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d5e0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
d5f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
d600: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
d610: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
d620: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
d630: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
d640: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
d650: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
d660: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
d670: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d680: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
d690: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
d6a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
d6b0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
d6c0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
d6d0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
d6e0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
d6f0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
d700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
d710: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
d720: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
d730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d740: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
d750: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
d760: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
d770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
d780: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
d790: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
d7a0: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
d7b0: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
d7c0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
d7d0: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
d7e0: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
d7f0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
d800: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
d810: 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
d820: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
d830: 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65    if( master_ope
d840: 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
d850: 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29  OsClose(pMaster)
d860: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d870: 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  free(pMaster);. 
d880: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
d890: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69  /*.** If the mai
d8a0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
d8b0: 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 6e 20 65  is open and an e
d8c0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
d8d0: 20 68 65 6c 64 2c 20 0a 2a 2a 20 74 72 75 6e 63   held, .** trunc
d8e0: 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  ate the main fil
d8f0: 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70  e of the given p
d900: 61 67 65 72 20 74 6f 20 74 68 65 20 73 70 65 63  ager to the spec
d910: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 0a 2a 2a  ified number .**
d920: 20 6f 66 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a   of pages..**.**
d930: 20 49 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   It might might 
d940: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
d950: 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
d960: 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
d970: 6e 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73  n nPage..** This
d980: 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
d990: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20   example, if we 
d9a0: 61 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  are in the middl
d9b0: 65 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  e of a transacti
d9c0: 6f 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20  on.** which has 
d9d0: 65 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c  extended the fil
d9e0: 65 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e  e size and the n
d9f0: 65 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69  ew pages are sti
da00: 6c 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69  ll all held.** i
da10: 6e 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e  n cache, then an
da20: 20 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54   INSERT or UPDAT
da30: 45 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65  E does a stateme
da40: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f  nt rollback.  So
da50: 6d 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  me.** operating 
da60: 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
da70: 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
da80: 6f 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74  onfused if you t
da90: 72 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74  ry to.** truncat
daa0: 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
dab0: 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
dac0: 72 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72  rger than it cur
dad0: 72 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f  rently is,.** so
dae0: 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
daf0: 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
db00: 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
db10: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
db20: 20 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73   new.** file ins
db30: 74 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tead..*/.static 
db40: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
db50: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
db60: 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
db70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
db80: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
db90: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
dba0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61  EXCLUSIVE && pPa
dbb0: 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
dbc0: 73 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  s ){.    i64 cur
dbd0: 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
dbe0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
dbf0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
dc00: 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
dc10: 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
dc20: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
dc30: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
dc40: 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
dc50: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
dc60: 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
dc70: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
dc80: 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
dc90: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
dca0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
dcb0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
dcc0: 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
dcd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dce0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
dcf0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
dd00: 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
dd10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
dd20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dd30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
dd40: 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
dd50: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
dd60: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
dd70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dd80: 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f 72  * Set the sector
dd90: 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69 76  Size for the giv
dda0: 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20  en pager..**.** 
ddb0: 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
ddc0: 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20 62  is at least as b
ddd0: 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f 72  ig as the sector
dde0: 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a   size reported.*
ddf0: 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  * by sqlite3OsSe
de00: 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68 65  ctorSize().  The
de10: 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20   minimum sector 
de20: 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a  size is 512..*/.
de30: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53  static void setS
de40: 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20  ectorSize(Pager 
de50: 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65  *pPager){.  asse
de60: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
de70: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
de80: 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
de90: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
dea0: 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  ile ){.    /* Se
deb0: 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27  ctor size doesn'
dec0: 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d  t matter for tem
ded0: 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c  porary files. Al
dee0: 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20  so, the file.   
def0: 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   ** may not have
df00: 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74   been opened yet
df10: 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20  , in whcih case 
df20: 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65  the OsSectorSize
df30: 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77  ().    ** call w
df40: 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20  ill segfault..  
df50: 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
df60: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
df70: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
df80: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
df90: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
dfa0: 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32 20  >sectorSize<512 
dfb0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
dfc0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b  ectorSize = 512;
dfd0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c  .  }.}../*.** Pl
dfe0: 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e  ayback the journ
dff0: 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74  al and thus rest
e000: 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
e010: 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20   file to.** the 
e020: 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20  state it was in 
e030: 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65  before we starte
e040: 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  d making changes
e050: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .  .**.** The jo
e060: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
e070: 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  t is as follows:
e080: 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20   .**.**  (1)  8 
e090: 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20  byte prefix.  A 
e0a0: 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c  copy of aJournal
e0b0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29  Magic[]..**  (2)
e0c0: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
e0d0: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
e0e0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
e0f0: 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  of valid page re
e100: 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69  cords.**       i
e110: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
e120: 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73  If this value is
e130: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
e140: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
e150: 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66         number of
e160: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72   page records fr
e170: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  om the journal s
e180: 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20  ize..**  (3)  4 
e190: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
e1a0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e1b0: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
e1c0: 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20  ue for the .**  
e1d0: 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63       sanity chec
e1e0: 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34  ksum..**  (4)  4
e1f0: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
e200: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
e210: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72  r of pages to tr
e220: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20  uncate the.**   
e230: 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20      database to 
e240: 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  during a rollbac
e250: 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79  k..**  (5)  4 by
e260: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
e270: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e280: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  he sector size. 
e290: 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20   The header.**  
e2a0: 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e       is this man
e2b0: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
e2c0: 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65  .**  (6)  4 byte
e2d0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
e2e0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
e2f0: 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20   page case..**  
e300: 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (7)  4 byte inte
e310: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
e320: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
e330: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
e340: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
e350: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
e360: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
e370: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
e380: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
e390: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
e3a0: 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74  ).**  (8)  N byt
e3b0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
e3c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
e3d0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
e3e0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
e3f0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
e400: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
e410: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
e420: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
e430: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
e440: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
e450: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
e460: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
e470: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
e480: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
e490: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
e4a0: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
e4b0: 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f  8..**  (9)  Zero
e4c0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
e4d0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
e4e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
e4f0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
e500: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
e510: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
e520: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
e530: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
e540: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
e550: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
e560: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
e570: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
e580: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
e590: 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65  st 8 items above
e5a0: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
e5b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
e5c0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
e5d0: 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a   the 9th item..*
e5e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
e5f0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
e600: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
e610: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
e620: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
e630: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
e640: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
e650: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
e660: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
e670: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
e680: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
e690: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
e6a0: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
e6b0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
e6c0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
e6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
e6e0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
e6f0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
e700: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
e710: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
e720: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
e730: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
e740: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
e750: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
e760: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
e770: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
e780: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
e790: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
e7a0: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
e7b0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
e7c0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
e7d0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
e7e0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
e7f0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
e800: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
e810: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
e820: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
e830: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
e840: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
e850: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
e860: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
e870: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
e880: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
e890: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
e8a0: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
e8b0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
e8c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
e8d0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
e8e0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
e8f0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
e900: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
e910: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
e920: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
e930: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
e940: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
e950: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
e960: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
e970: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
e980: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
e990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e9a0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
e9b0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
e9c0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
e9d0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
e9e0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
e9f0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
ea00: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
ea10: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
ea20: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
ea30: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
ea40: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
ea50: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
ea60: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
ea70: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
ea80: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
ea90: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
eaa0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
eab0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
eac0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
ead0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
eae0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
eaf0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
eb00: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
eb10: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
eb20: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
eb30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
eb40: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
eb50: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
eb60: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
eb70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
eb80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
eb90: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
eba0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
ebb0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ebd0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
ebe0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
ebf0: 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
ec20: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
ec30: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
ec40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ec50: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
ec60: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
ec70: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
ec80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
ec90: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
eca0: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
ecb0: 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
ecc0: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
ecd0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
ece0: 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
ecf0: 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
ed00: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
ed10: 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
ed20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
ed30: 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75  ny */..  /* Figu
ed40: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
ed50: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
ed60: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f  he journal.  Abo
ed70: 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a  rt early if.  **
ed80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
ed90: 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73  empty..  */.  as
eda0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
edb0: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
edc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
edd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
ede0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
edf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
ee00: 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67   szJ==0 ){.    g
ee10: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ee20: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64  ;.  }..  /* Read
ee30: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ee40: 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68  nal name from th
ee50: 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74  e journal, if it
ee60: 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a   is present..  *
ee70: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
ee80: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
ee90: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75  is specified, bu
eea0: 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  t the file is no
eeb0: 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f  t.  ** present o
eec0: 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65  n disk, then the
eed0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
eee0: 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  hot and does not
eef0: 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a   need to be.  **
ef00: 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20   played back..  
ef10: 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  */.  zMaster = p
ef20: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
ef30: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  ;.  rc = readMas
ef40: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
ef50: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
ef60: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
ef70: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
ef80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ef90: 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20  K && zMaster[0] 
efa0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
efb0: 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
efc0: 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
efd0: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
efe0: 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d   &res);.  }.  zM
eff0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66 28  aster = 0;.  if(
f000: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f010: 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67 6f  | !res ){.    go
f020: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
f030: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
f040: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
f050: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
f060: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
f070: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
f080: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
f090: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
f0a0: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
f0b0: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
f0c0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
f0d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
f0e0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
f0f0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
f100: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
f110: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
f120: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
f130: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
f140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
f150: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
f160: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
f170: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
f180: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
f190: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
f1a0: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
f1b0: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
f1c0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
f1d0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
f1e0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
f1f0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
f200: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
f210: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
f220: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
f230: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
f240: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
f250: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
f260: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f270: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
f280: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
f290: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
f2a0: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
f2b0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
f2c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
f2d0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
f2e0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
f2f0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
f300: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
f310: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
f320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
f330: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
f340: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
f350: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
f360: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
f370: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
f380: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
f390: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
f3a0: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
f3b0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
f3c0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
f3d0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f3e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
f3f0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
f400: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
f410: 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a  Rec = (int)((szJ
f420: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
f430: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
f440: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
f450: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f460: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
f470: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
f480: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
f490: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
f4a0: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
f4b0: 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69  ss and if this i
f4c0: 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64  s the final head
f4d0: 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  er in the journa
f4e0: 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73  l, then it means
f4f0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69  .    ** that thi
f500: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f  s part of the jo
f510: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
f520: 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e  filled but has n
f530: 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20  ot yet been.    
f540: 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
f550: 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20  k.  Compute the 
f560: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
f570: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d  based on the rem
f580: 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69  aining.    ** si
f590: 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a  ze of the file..
f5a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
f5b0: 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20  e third term of 
f5c0: 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64  the test was add
f5d0: 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74  ed to fix ticket
f5e0: 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a 20 57   #2565..    ** W
f5f0: 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  hen rolling back
f600: 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2c 20   a hot journal, 
f610: 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73 20 6d  nRec==0 always m
f620: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6e 65  eans that the ne
f630: 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e 6b 20  xt.    ** chunk 
f640: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 63  of the journal c
f650: 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70 61 67  ontains zero pag
f660: 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  es to be rolled 
f670: 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20 20 2a  back.  But.    *
f680: 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 52  * when doing a R
f690: 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68 65 20  OLLBACK and the 
f6a0: 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20 69 73  nRec==0 chunk is
f6b0: 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e 6b 20   the last chunk 
f6c0: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  in.    ** the jo
f6d0: 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e 73 20  urnal, it means 
f6e0: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
f6f0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 61   might contain a
f700: 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20 2a 2a  dditional.    **
f710: 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
f720: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
f730: 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
f740: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
f750: 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 62  .    ** should b
f760: 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73 65 64  e computed based
f770: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
f780: 66 69 6c 65 20 73 69 7a 65 2e 20 20 0a 20 20 20  file size.  .   
f790: 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
f7a0: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
f7b0: 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  Hot.         && 
f7c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f7d0: 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
f7e0: 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65  Z(pPager)!=pPage
f7f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
f800: 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20         && ((szJ 
f810: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
f820: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
f830: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30  PG_SZ(pPager))>0
f840: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67  .         && pag
f850: 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67  erNextJournalPag
f860: 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29  eIsValid(pPager)
f870: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
f880: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
f890: 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
f8a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
f8b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
f8c0: 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
f8d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
f8e0: 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
f8f0: 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
f900: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
f910: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
f920: 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
f930: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
f940: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
f950: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
f960: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
f970: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
f980: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
f990: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
f9a0: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
f9b0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
f9c0: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
f9d0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
f9e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
f9f0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
fa00: 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
fa10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fa20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
fa30: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
fa40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
fa50: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
fa60: 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
fa70: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
fa80: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
fa90: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
faa0: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
fab0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
fac0: 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
fad0: 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
fae0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
faf0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
fb00: 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
fb10: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
fb20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
fb30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fb40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
fb50: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
fb60: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
fb70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
fb80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
fb90: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
fba0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fbb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
fbd0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
fbe0: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
fbf0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70  he database is p
fc00: 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20  robably.        
fc10: 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e    ** going to en
fc20: 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75  d up being corru
fc30: 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75  pt.  It is corru
fc40: 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77  pt to us, anyhow
fc50: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50  ..          ** P
fc60: 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20  erhaps the next 
fc70: 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
fc80: 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74  along can fix it
fc90: 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  .....          *
fca0: 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
fcb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fcc0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
fcd0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
fce0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fcf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
fd00: 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
fd10: 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
fd20: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
fd30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fd40: 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
fd50: 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
fd60: 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
fd70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
fd80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
fd90: 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
fda0: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
fdb0: 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
fdc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fdd0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
fde0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
fdf0: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
fe00: 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69  !='\0');.  }.  i
fe10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
fe20: 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
fe30: 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
fe40: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
fe50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
fe60: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
fe70: 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
fe80: 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
fe90: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
fea0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
feb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
fec0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
fed0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
fee0: 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
fef0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
ff00: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
ff10: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
ff20: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
ff30: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
ff40: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
ff50: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
ff60: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
ff70: 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
ff80: 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
ff90: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
ffa0: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
ffb0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
ffc0: 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
ffd0: 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
ffe0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fff0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
10000 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
10010 2e 20 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  .  Or, if pSavep
10020 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
10030 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
10040 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
10050 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
10060 2a 2a 20 54 68 65 20 63 61 73 65 20 70 53 61 76  ** The case pSav
10070 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
10080 75 72 73 20 77 68 65 6e 20 61 20 52 4f 4c 4c 42  urs when a ROLLB
10090 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
100a0 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 6f 6e 20  s invoked.** on 
100b0 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
100c0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
100d0 6e 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  n savepoint..*/.
100e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
100f0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
10100 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
10110 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
10120 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
10130 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
10140 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
10150 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
10160 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
10170 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10190 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
101a0 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
101b0 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
101c0 20 20 50 67 6e 6f 20 69 69 3b 20 20 20 20 20 20    Pgno ii;      
101d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
101e0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
101f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10200 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
10210 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
10220 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
10230 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
10240 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
10250 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
10260 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   once */..  /* A
10270 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
10280 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
10290 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
102a0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
102b0 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
102c0 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
102d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
102e0 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
102f0 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
10300 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
10310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10320 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
10330 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
10340 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
10350 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69 74 20   to the size it 
10360 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 0a  was before the .
10370 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 62    ** savepoint b
10380 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
10390 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
103a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
103b0 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
103c0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
103d0 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
103e0 67 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  gSize;.  assert(
103f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
10400 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
10410 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
10420 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
10430 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
10440 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
10450 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
10460 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
10470 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
10480 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
10490 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
104a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
104b0 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
104c0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
104d0 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
104e0 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
104f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
10500 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
10510 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
10520 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10530 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  f;..  /* Begin b
10540 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
10550 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
10560 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
10570 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
10580 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
10590 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
105a0 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
105b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
105c0 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
105d0 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
105e0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
105f0 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
10600 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
10610 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
10620 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
10630 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
10640 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
10650 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
10660 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
10670 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
10680 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
10690 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
106a0 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
106b0 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
106c0 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
106d0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
106e0 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
106f0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
10700 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
10710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10720 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
10730 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
10740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10750 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
10760 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
10770 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
10780 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
10790 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  age(pPager, 1, &
107a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
107b0 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
107c0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
107d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
107e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
107f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
10800 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
10810 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
10820 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
10830 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
10840 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
10850 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
10860 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
10870 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
10880 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
10890 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
108a0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
108b0 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
108c0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
108d0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
108e0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
108f0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
10900 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
10910 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
10920 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
10930 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
10940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
10950 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
10960 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
10970 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
10980 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
10990 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
109a0 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
109b0 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
109c0 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
109d0 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
109e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
109f0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
10a00 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
10a10 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10a20 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
10a30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
10a40 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
10a50 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
10a60 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
10a70 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
10a80 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
10a90 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
10aa0 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
10ab0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
10ac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73 74  .    */.    test
10ad0 63 61 73 65 28 20 6e 4a 52 65 63 3d 3d 30 0a 20  case( nJRec==0. 
10ae0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
10af0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
10b00 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10b10 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)!=pPager->jo
10b20 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20  urnalOff.       
10b30 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61    && ((szJ - pPa
10b40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10b50 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
10b60 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20  (pPager))>0.    
10b70 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78       && pagerNex
10b80 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
10b90 6c 69 64 28 70 50 61 67 65 72 29 0a 20 20 20 20  lid(pPager).    
10ba0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63  );.    if( nJRec
10bb0 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50 61  ==0 .     && pPa
10bc0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
10bd0 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
10be0 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
10bf0 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29  journalOff.    )
10c00 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20  {.      nJRec = 
10c10 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
10c20 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e  ournalOff)/JOURN
10c30 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
10c40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
10c50 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
10c60 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
10c70 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
10c80 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
10c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
10ca0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
10cb0 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
10cc0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
10cd0 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  Off, 1, pDone);.
10ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
10cf0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
10d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
10d10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
10d20 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
10d30 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b  urnalOff==szJ );
10d40 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
10d50 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
10d60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
10d70 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
10d80 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
10d90 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
10da0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
10db0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
10dc0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
10dd0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
10de0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
10df0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
10e00 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
10e10 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
10e20 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 36 34 20  oint ){.    i64 
10e30 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f  offset = pSavepo
10e40 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
10e50 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10e60 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53  );.    for(ii=pS
10e70 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
10e80 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
10e90 26 26 69 69 3c 28 75 33 32 29 70 50 61 67 65 72  &&ii<(u32)pPager
10ea0 2d 3e 73 74 6d 74 4e 52 65 63 3b 20 69 69 2b 2b  ->stmtNRec; ii++
10eb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10ec0 20 6f 66 66 73 65 74 20 3d 3d 20 69 69 2a 28 34   offset == ii*(4
10ed0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
10ee0 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
10ef0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
10f00 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
10f10 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20   0, &offset, 1, 
10f20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
10f30 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
10f40 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
10f50 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74   }..  sqlite3Bit
10f60 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65  vecDestroy(pDone
10f70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
10f80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
10f90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
10fa0 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65   = szJ;.  }.  re
10fb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10fc0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
10fd0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
10fe0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
10ff0 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
11000 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
11010 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
11020 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
11030 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
11040 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74  sqlite3PcacheSet
11050 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
11060 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67  ->pPCache, mxPag
11070 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a  e);.}../*.** Adj
11080 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
11090 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
110a0 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
110b0 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
110c0 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
110d0 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
110e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
110f0 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
11100 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
11110 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
11120 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
11130 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
11140 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
11150 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
11160 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
11170 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
11180 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
11190 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
111a0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
111b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
111c0 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
111d0 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
111e0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
111f0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
11200 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
11210 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
11220 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
11230 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
11240 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11250 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
11260 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
11270 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
11280 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
11290 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
112a0 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
112b0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
112c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
112d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
112e0 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
112f0 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
11300 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11310 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
11320 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
11330 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
11340 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
11350 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
11360 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
11370 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
11380 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11390 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
113a0 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
113b0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
113c0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
113d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
113e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
113f0 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
11400 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
11410 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
11420 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
11430 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
11440 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
11460 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
11470 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
11480 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
11490 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
114a0 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
114b0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
114c0 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
114d0 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
114e0 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
114f0 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
11500 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
11510 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
11520 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
11530 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
11540 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
11550 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
11560 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
11570 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
11580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11590 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
115a0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
115b0 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
115c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
115d0 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46  nt level, int bF
115e0 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61  ullFsync){.  pPa
115f0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28  ger->noSync =  (
11600 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67  level==1 || pPag
11610 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
11620 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
11630 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d  llSync = (level=
11640 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
11650 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
11660 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
11670 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e  ags = (bFullFsyn
11680 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  c?SQLITE_SYNC_FU
11690 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  LL:SQLITE_SYNC_N
116a0 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50  ORMAL);.  if( pP
116b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
116c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
116d0 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
116e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
116f0 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
11700 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
11710 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
11720 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
11730 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
11740 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
11750 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
11760 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
11770 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
11780 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
11790 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
117a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
117b0 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
117c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
117d0 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
117e0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
117f0 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
11800 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
11810 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
11820 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
11830 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
11840 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
11850 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
11860 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
11870 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
11880 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65  rary.** file whe
11890 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
118a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
118b0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
118c0 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  mp(.  Pager *pPa
118d0 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ger,        /* T
118e0 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20  he pager object 
118f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
11900 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72  e *pFile,  /* Wr
11910 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
11920 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a  criptor here */.
11930 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
11940 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
11950 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
11960 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b  to the VFS */.){
11970 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
11980 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
11990 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
119a0 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55  p_count++;  /* U
119b0 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
119c0 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
119d0 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76  y */.#endif..  v
119e0 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49  fsFlags |=  SQLI
119f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11a00 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
11a10 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20  CREATE |.       
11a20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11a30 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51 4c  _EXCLUSIVE | SQL
11a40 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
11a50 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73  NCLOSE;.  rc = s
11a60 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50 61  qlite3OsOpen(pPa
11a70 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46  ger->pVfs, 0, pF
11a80 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20 30  ile, vfsFlags, 0
11a90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
11aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46  =SQLITE_OK || pF
11ab0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  ile->pMethods );
11ac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11ad0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
11ae0 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c 50  rStress(void *,P
11af0 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  gHdr *);../*.** 
11b00 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
11b10 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20  e cache and put 
11b20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
11b30 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a   page cache in *
11b40 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  ppPager..** The 
11b50 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
11b60 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74  d need not exist
11b70 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  .  The file is n
11b80 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a  ot locked until.
11b90 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  ** the first cal
11ba0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
11bb0 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e  rGet() and is on
11bc0 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74  ly held open unt
11bd0 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  il the.** last p
11be0 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20  age is released 
11bf0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
11c00 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a  erUnref()..**.**
11c10 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
11c20 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e   NULL then a ran
11c30 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70  domly-named temp
11c40 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72  orary file is cr
11c50 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65  eated.** and use
11c60 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f  d as the file to
11c70 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65   be cached.  The
11c80 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
11c90 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
11ca0 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69  ically when it i
11cb0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
11cc0 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
11cd0 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20  ":memory:" then 
11ce0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
11cf0 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65  is held in cache
11d00 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72  ..** It is never
11d10 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
11d20 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
11d30 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
11d40 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79   an.** in-memory
11d50 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
11d60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
11d70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
11d80 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
11d90 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
11da0 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
11db0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
11dc0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
11dd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
11de0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
11df0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
11e00 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
11e10 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
11e20 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
11e30 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
11e40 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
11e50 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
11e60 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
11e70 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
11e80 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11ea0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
11eb0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
11ec0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
11ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
11ee0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
11ef0 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
11f00 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
11f10 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
11f20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
11f30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11f40 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
11f50 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
11f60 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
11f70 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
11f80 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75  nly = 0;.  int u
11f90 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
11fa0 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
11fb0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69  JOURNAL)==0;.  i
11fc0 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20  nt noReadlock = 
11fd0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e  (flags & PAGER_N
11fe0 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a  O_READLOCK)!=0;.
11ff0 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
12000 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63 61  eSize;.  int pca
12010 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
12020 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a 20  3PcacheSize();. 
12030 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74 20   int szPageDflt 
12040 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
12050 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
12060 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
12070 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  0;.  int nPathna
12080 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 73  me = 0;..  if( s
12090 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a  qlite3JournalSiz
120a0 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d  e(pVfs)>sqlite3M
120b0 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20  emJournalSize() 
120c0 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  ){.    journalFi
120d0 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  leSize = sqlite3
120e0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
120f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
12100 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
12110 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  = sqlite3MemJour
12120 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a  nalSize();.  }..
12130 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
12140 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55 4c   return is a NUL
12150 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a  L pointer */.  *
12160 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
12170 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73  /* Compute and s
12180 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61  tore the full pa
12190 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c  thname in an all
121a0 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f  ocated buffer po
121b0 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79  inted.  ** to by
121c0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67   zPathname, leng
121d0 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72  th nPathname. Or
121e0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74  , if this is a t
121f0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20  emporary file,. 
12200 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e   ** leave both n
12210 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61  Pathname and zPa
12220 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e  thname set to 0.
12230 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
12240 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
12250 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61  me[0] ){.    nPa
12260 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d  thname = pVfs->m
12270 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20  xPathname+1;.   
12280 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   zPathname = sql
12290 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68  ite3Malloc(nPath
122a0 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28  name*2);.    if(
122b0 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b   zPathname==0 ){
122c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
122d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
122e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
122f0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
12300 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46     if( strcmp(zF
12310 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79  ilename,":memory
12320 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  :")==0 ){.      
12330 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20  memDb = 1;.     
12340 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20   zPathname[0] = 
12350 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  0;.    }else.#en
12360 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
12370 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
12380 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
12390 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
123a0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
123b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
123d0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
123e0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
123f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 74  ;.    }.    nPat
12410 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
12420 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
12430 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  e);.  }..  /* Al
12440 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
12450 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  r the pager stru
12460 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67 65  cture */.  pPage
12470 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  r = sqlite3Mallo
12480 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65 6f  cZero(.    sizeo
12490 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20 20  f(*pPager) +    
124a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
124b0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
124c0 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20 20   pcacheSize     
124d0 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
124e0 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f  PCache object */
124f0 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
12500 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20  Size +          
12510 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
12520 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a  file structure *
12530 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f  / .    pVfs->szO
12540 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20 20 20  sFile  +        
12550 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64     /* The main d
12560 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a 6f  b file */.    jo
12570 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a 20  urnalFileSize * 
12580 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  2 +       /* The
12590 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   two journal fil
125a0 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50 61  es */ .    3*nPa
125b0 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20 20  thname + 40     
125c0 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
125d0 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79 2c  ame, zDirectory,
125e0 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29   zJournal */.  )
125f0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  ;.  if( !pPager 
12600 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
12610 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
12620 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12630 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
12640 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20 3d  Pager->pPCache =
12650 20 28 50 43 61 63 68 65 20 2a 29 26 70 50 61 67   (PCache *)&pPag
12660 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20 3d 20  er[1];.  pPtr = 
12670 28 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b 31  ((u8 *)&pPager[1
12680 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a 65 3b  ]) + pcacheSize;
12690 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  .  pPager->vfsFl
126a0 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a  ags = vfsFlags;.
126b0 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 28    pPager->fd = (
126c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
126d0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
126e0 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d  le*0];.  pPager-
126f0 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
12700 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
12710 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a 20 20  s->szOsFile];.  
12720 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73  pPager->jfd = (s
12730 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50  qlite3_file*)&pP
12740 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  tr[pVfs->szOsFil
12750 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  e+journalFileSiz
12760 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e];.  pPager->zF
12770 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
12780 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
12790 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e 61 6c 46  sFile+2*journalF
127a0 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  ileSize];.  pPag
127b0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
127c0 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
127d0 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ame[nPathname+1]
127e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
127f0 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
12800 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68  zDirectory[nPath
12810 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65  name+1];.  pPage
12820 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  r->pVfs = pVfs;.
12830 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20    if( zPathname 
12840 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  ){.    memcpy(pP
12850 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
12860 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
12870 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73 71  hname+1);.    sq
12880 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
12890 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
128a0 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
128b0 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
128c0 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
128d0 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d  ilename[0] && !m
128e0 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20  emDb ){.    if( 
128f0 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d  nPathname>(pVfs-
12900 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 28 69  >mxPathname - (i
12910 6e 74 29 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72  nt)sizeof("-jour
12920 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20 20  nal")) ){.      
12930 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
12940 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OPEN;.    }else{
12950 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20  .      int fout 
12960 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
12970 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
12980 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fs, pPager->zFil
12990 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e 66  ename, pPager->f
129a0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
129b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
129c0 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26 66  er->vfsFlags, &f
129d0 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61 64  out);.      read
129e0 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
129f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
12a00 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  Y);..      /* If
12a10 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73 75   the file was su
12a20 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
12a30 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65  d for read/write
12a40 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20 2a   access,.      *
12a50 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61 75  * choose a defau
12a60 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e 20  lt page size in 
12a70 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f 20  case we have to 
12a80 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20 20  create the.     
12a90 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
12aa0 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
12ab0 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
12ac0 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
12ad0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
12ae0 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   + SQLITE_DEFAUL
12af0 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20  T_PAGE_SIZE,.   
12b00 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 76     **    + The v
12b10 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12b20 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
12b30 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  Size().      ** 
12b40 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
12b50 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
12b60 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
12b70 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20  tomically..     
12b80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
12b90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
12ba0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
12bb0 20 20 20 20 69 6e 74 20 69 53 65 63 74 6f 72 53      int iSectorS
12bc0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
12bd0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
12be0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69  ->fd);.        i
12bf0 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c 69 53  f( szPageDflt<iS
12c00 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
12c10 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
12c20 74 20 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  t = iSectorSize;
12c30 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65  .        }.#ifde
12c40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12c50 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
12c60 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
12c70 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
12c80 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
12c90 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
12ca0 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ->fd);.         
12cb0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
12cc0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
12cd0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
12ce0 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
12cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
12d00 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
12d10 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
12d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
12d30 65 72 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ert(SQLITE_MAX_D
12d40 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
12d50 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20  <=65536);.      
12d60 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50 61 67      for(ii=szPag
12d70 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c 49 54  eDflt; ii<=SQLIT
12d80 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
12d90 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
12da0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
12db0 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
12dc0 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
12dd0 3e 38 29 29 20 29 20 73 7a 50 61 67 65 44 66 6c  >8)) ) szPageDfl
12de0 74 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  t = ii;.        
12df0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
12e00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
12e10 20 73 7a 50 61 67 65 44 66 6c 74 3e 53 51 4c 49   szPageDflt>SQLI
12e20 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
12e30 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
12e40 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
12e50 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
12e60 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
12e70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12e80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
12e90 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65  {.    /* If a te
12ea0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
12eb0 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
12ec0 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65   not opened imme
12ed0 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
12ee0 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
12ef0 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75  accept the defau
12f00 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64  lt page size and
12f10 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a   delay actually.
12f20 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74      ** opening t
12f30 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68  he file until th
12f40 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
12f50 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a  OsWrite()..    *
12f60 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72  *.    ** This br
12f70 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e  anch is also run
12f80 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
12f90 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69  y database. An i
12fa0 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20  n-memory.    ** 
12fb0 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20  database is the 
12fc0 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66  same as a temp-f
12fd0 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65  ile that is neve
12fe0 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  r written out to
12ff0 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64  .    ** disk and
13000 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f   uses an in-memo
13010 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ry rollback jour
13020 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20  nal..    */ .   
13030 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
13040 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13050 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
13060 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  VE;.  }..  if( p
13070 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c  Pager && rc==SQL
13080 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
13090 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
130a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
130b0 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c 74 29 3b  loc(szPageDflt);
130c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
130d0 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69   error occured i
130e0 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  n either of the 
130f0 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20  blocks above..  
13100 2a 2a 20 46 72 65 65 20 74 68 65 20 50 61 67 65  ** Free the Page
13110 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
13120 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  close the file..
13130 20 20 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70    ** Since the p
13140 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
13150 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
13160 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
13170 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
13180 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
13190 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
131a0 67 65 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ger || !pPager->
131b0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
131c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
131d0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
131e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
131f0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
13200 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  n ((rc==SQLITE_O
13210 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  K)?SQLITE_NOMEM:
13220 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45 78 74 72  rc);.  }.  nExtr
13230 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
13240 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 73  ENT(nExtra);.  s
13250 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70 65 6e  qlite3PcacheOpen
13260 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e 45 78  (szPageDflt, nEx
13270 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20 20 20  tra, !memDb,.   
13280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13290 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53 74 72   !memDb?pagerStr
132a0 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a 29 70  ess:0, (void *)p
132b0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  Pager, pPager->p
132c0 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41 47 45  PCache);..  PAGE
132d0 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  RTRACE(("OPEN %d
132e0 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
132f0 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29  LEID(pPager->fd)
13300 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13310 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ame));.  IOTRACE
13320 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
13330 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
13340 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20  ->zFilename)).. 
13350 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65   /* Fill in Page
13360 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a  r.zDirectory[] *
13370 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  /.  memcpy(pPage
13380 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 70  r->zDirectory, p
13390 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
133a0 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  , nPathname+1);.
133b0 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 33 53    for(i=sqlite3S
133c0 74 72 6c 65 6e 33 30 28 70 50 61 67 65 72 2d 3e  trlen30(pPager->
133d0 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 0a 20 20  zDirectory); .  
133e0 20 20 20 20 69 3e 30 20 26 26 20 70 50 61 67 65      i>0 && pPage
133f0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
13400 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
13410 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
13420 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
13430 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  -1] = 0;..  /* F
13440 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f  ill in Pager.zJo
13450 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28  urnal[] */.  if(
13460 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20   zPathname ){.  
13470 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
13480 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
13490 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
134a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
134b0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
134c0 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
134d0 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39  ], "-journal", 9
134e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
134f0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
13500 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
13510 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13520 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  pen = 0; */.  pP
13530 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
13540 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61   = (u8)useJourna
13550 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  l;.  pPager->noR
13560 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61  eadlock = (noRea
13570 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
13580 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50  y) ?1:0;.  /* pP
13590 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
135a0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
135b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
135c0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
135d0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
135e0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
135f0 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44  Valid = (u8)memD
13600 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  b;.  pPager->pag
13610 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66  eSize = szPageDf
13620 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  lt;.  /* pPager-
13630 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
13640 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
13650 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
13660 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
13670 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
13680 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
13690 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
136a0 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
136b0 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
136c0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
136d0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
136e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
136f0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
13700 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
13710 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
13720 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
13730 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
13740 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
13750 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
13760 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20  (u8)tempFile;.  
13770 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
13780 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
13790 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
137a0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
137b0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
137c0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
137d0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
137e0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
137f0 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
13800 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
13810 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70  eMode = (u8)temp
13820 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
13830 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d  >memDb = (u8)mem
13840 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65  Db;.  pPager->re
13850 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61  adOnly = (u8)rea
13860 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
13870 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
13880 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
13890 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  oSync = (pPager-
138a0 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73  >tempFile || !us
138b0 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a  eJournal) ?1:0;.
138c0 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
138d0 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53  nc = pPager->noS
138e0 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67  ync ?0:1;.  pPag
138f0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
13900 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
13910 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
13920 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
13930 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
13940 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
13950 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
13960 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
13970 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
13980 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65   nExtra;.  pPage
13990 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  r->journalSizeLi
139a0 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
139b0 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a  AULT_JOURNAL_SIZ
139c0 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72  E_LIMIT;.  asser
139d0 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
139e0 65 74 68 6f 64 73 7c 7c 74 65 6d 70 46 69 6c 65  ethods||tempFile
139f0 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  );.  setSectorSi
13a00 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ze(pPager);.  if
13a10 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70  ( memDb ){.    p
13a20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
13a30 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e  de = PAGER_JOURN
13a40 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20  ALMODE_MEMORY;. 
13a50 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
13a60 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  xBusyHandler = 0
13a70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
13a80 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72  ->pBusyHandlerAr
13a90 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  g = 0; */.  /* m
13aa0 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
13ab0 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
13ac0 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
13ad0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
13ae0 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
13af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13b00 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
13b10 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
13b20 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
13b30 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
13b40 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20  andler(.  Pager 
13b50 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 6e 74 20  *pPager, .  int 
13b60 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28  (*xBusyHandler)(
13b70 76 6f 69 64 20 2a 29 2c 0a 20 20 76 6f 69 64 20  void *),.  void 
13b80 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
13b90 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
13ba0 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
13bb0 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
13bc0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13bd0 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
13be0 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
13bf0 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
13c00 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
13c10 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
13c20 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
13c30 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
13c40 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
13c50 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
13c60 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
13c70 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
13c80 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
13c90 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
13ca0 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
13cb0 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
13cc0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
13cd0 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
13ce0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
13cf0 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
13d00 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
13d10 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
13d20 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
13d30 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
13d40 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
13d50 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
13d60 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29  einit)(DbPage*))
13d70 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
13d80 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
13d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
13da0 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a  e page size to *
13db0 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68  pPageSize. If th
13dc0 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61  e suggest new pa
13dd0 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e  ge size is.** in
13de0 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65  appropriate, the
13df0 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  n an alternative
13e00 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
13e10 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c  t to that.** val
13e20 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ue before return
13e30 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
13e40 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13e50 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
13e60 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a  r, u16 *pPageSiz
13e70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  e){.  int rc = p
13e80 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
13e90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13ea0 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70  _OK ){.    u16 p
13eb0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
13ec0 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
13ed0 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
13ee0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
13ef0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
13f00 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
13f10 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61  E) );.    if( pa
13f20 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
13f30 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
13f40 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70  Size .     && (p
13f50 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
13f60 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
13f70 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71  e==0).     && sq
13f80 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
13f90 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
13fa0 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  che)==0 .    ){.
13fb0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
13fc0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
13fd0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
13fe0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
13ff0 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
14000 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14010 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
14020 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  e{.        pager
14030 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
14040 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14050 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14060 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
14070 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
14080 29 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  ) setSectorSize(
14090 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
140a0 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
140b0 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
140c0 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ce);.        pPa
140d0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
140e0 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73   pNew;.        s
140f0 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
14100 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
14110 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
14120 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
14130 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65  }.    *pPageSize
14140 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
14150 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  pageSize;.  }.  
14160 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14170 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
14180 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
14190 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
141a0 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
141b0 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
141c0 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
141d0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
141e0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
141f0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
14200 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
14210 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
14220 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
14230 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
14240 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
14250 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
14260 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
14270 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
14280 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
14290 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
142a0 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
142b0 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
142c0 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
142d0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
142e0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
142f0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
14300 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
14310 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
14320 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
14330 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
14340 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
14350 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
14360 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
14370 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
14380 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
14390 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
143a0 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
143b0 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
143c0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
143d0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
143e0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
143f0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
14400 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
14410 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
14420 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
14430 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
14440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
14450 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
14460 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
14470 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
14480 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
14490 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
144a0 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
144b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
144c0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
144d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
144e0 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
144f0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
14500 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
14510 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
14520 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
14530 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
14540 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
14550 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
14560 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
14570 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
14580 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
14590 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
145a0 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
145b0 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
145c0 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
145d0 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
145e0 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
145f0 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
14600 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
14610 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14620 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
14630 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
14640 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
14650 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
14660 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
14670 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
14680 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
14690 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
146a0 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
146b0 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
146c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
146d0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
146e0 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
146f0 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
14700 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
14710 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
14720 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14730 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
14740 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
14750 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
14760 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
14770 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
14780 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
14790 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
147a0 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
147b0 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
147c0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
147d0 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
147e0 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
147f0 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
14800 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
14810 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
14820 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
14830 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
14840 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
14850 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
14860 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
14870 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
14880 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
14890 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
148a0 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
148b0 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
148c0 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
148d0 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
148e0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
148f0 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
14900 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
14910 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
14920 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
14930 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
14940 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
14950 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
14960 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
14970 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  this)..*/.int sq
14980 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
14990 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
149a0 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
149b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
149c0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
149d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
149e0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
149f0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  );.  assert(pPag
14a00 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14a10 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
14a20 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  le);.  if( pPage
14a30 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  r->fd->pMethods 
14a40 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
14a50 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
14a60 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
14a70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14a80 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
14a90 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
14aa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14ab0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
14ac0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
14ad0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
14ae0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14af0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
14b00 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
14b10 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
14b20 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
14b30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
14b40 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
14b50 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
14b60 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
14b70 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
14b80 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
14b90 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
14ba0 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
14bb0 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
14bc0 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
14bd0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
14be0 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
14bf0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
14c00 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
14c10 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
14c20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
14c30 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
14c40 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
14c50 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
14c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
14c70 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
14c80 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
14c90 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b  e){.  i64 n = 0;
14ca0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
14cb0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
14cc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
14cd0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
14ce0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
14cf0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
14d00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
14d10 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
14d20 64 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61  d ){.    n = pPa
14d30 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d  ger->dbSize;.  }
14d40 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65   else {.    asse
14d50 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
14d60 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
14d70 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
14d80 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d  if( (pPager->fd-
14d90 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20  >pMethods).     
14da0 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
14db0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
14dc0 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c  r->fd, &n))!=SQL
14dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14de0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
14df0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72  er, rc);.      r
14e00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
14e10 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
14e20 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
14e30 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
14e40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14e50 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
14e60 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
14e70 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14e80 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
14e90 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
14ea0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 28 50  ger->dbSize = (P
14eb0 67 6e 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61  gno)n;.      pPa
14ec0 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
14ed0 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20 20 20 20 20  = (Pgno)n;.     
14ee0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
14ef0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  alid = 1;.    }.
14f00 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45    }.  if( n==(PE
14f10 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65  NDING_BYTE/pPage
14f20 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
14f30 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
14f40 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50  f( n>pPager->mxP
14f50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
14f60 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
14f70 6f 29 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  o)n;.  }.  if( p
14f80 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e  nPage ){.    *pn
14f90 50 61 67 65 20 3d 20 28 69 6e 74 29 6e 3b 0a 20  Page = (int)n;. 
14fa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14fb0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14fc0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
14fd0 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
14fe0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
14ff0 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  ger*);../*.** Tr
15000 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
15010 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
15020 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
15030 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
15040 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
15050 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
15060 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
15070 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
15080 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
15090 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
150a0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
150b0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
150c0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
150d0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
150e0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
150f0 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
15100 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
15110 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
15120 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
15130 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
15140 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  e){.  int rc;.. 
15150 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20   /* The OS lock 
15160 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74  values must be t
15170 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 50  he same as the P
15180 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73  ager lock values
15190 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41   */.  assert( PA
151a0 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52  GER_SHARED==SHAR
151b0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
151c0 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45 52  ert( PAGER_RESER
151d0 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  VED==RESERVED_LO
151e0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
151f0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d  PAGER_EXCLUSIVE=
15200 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
15210 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15220 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
15230 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20  y unlocked then 
15240 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  the size must be
15250 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73   unknown */.  as
15260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
15270 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
15280 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  D || pPager->dbS
15290 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a  izeValid==0 );..
152a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
152b0 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
152c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
152d0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
152e0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
152f0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
15300 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
15310 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
15320 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
15330 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78 42  SY && pPager->xB
15340 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65  usyHandler(pPage
15350 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
15360 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  rg) );.    if( r
15370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15380 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15390 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ate = (u8)lockty
153a0 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  pe;.      IOTRAC
153b0 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e  E(("LOCK %p %d\n
153c0 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74  ", pPager, lockt
153d0 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a  ype)).    }.  }.
153e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
153f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15400 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
15410 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
15420 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
15430 62 61 73 65 20 66 69 6c 65 20 69 6d 61 67 65 20  base file image 
15440 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  to nPage pages. 
15450 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
15460 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63 74 75 61  n does not actua
15470 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68 65 20 64  lly modify the d
15480 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 6e 20  atabase file on 
15490 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73  disk. It .** jus
154a0 74 20 73 65 74 73 20 74 68 65 20 69 6e 74 65 72  t sets the inter
154b0 6e 61 6c 20 73 74 61 74 65 20 6f 66 20 74 68 65  nal state of the
154c0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 73 6f   pager object so
154d0 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 74 72   that the .** tr
154e0 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65  uncation will be
154f0 20 64 6f 6e 65 20 77 68 65 6e 20 74 68 65 20 63   done when the c
15500 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
15510 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
15520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15530 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
15540 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
15550 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
15560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15570 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
15580 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15590 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20  ->dbSize>=nPage 
155a0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
155b0 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a  ize = nPage;.}..
155c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
155d0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
155e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
155f0 6c 65 20 69 6d 61 67 65 20 69 6e 20 70 61 67 65  le image in page
15600 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  s. This.** funct
15610 69 6f 6e 20 64 69 66 66 65 72 73 20 66 72 6f 6d  ion differs from
15620 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
15630 65 63 6f 75 6e 74 28 29 20 69 6e 20 74 77 6f 20  ecount() in two 
15640 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20 61 29 20  ways:.**.**  a) 
15650 49 74 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  It may only be c
15660 61 6c 6c 65 64 20 77 68 65 6e 20 61 74 20 6c 65  alled when at le
15670 61 73 74 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  ast one referenc
15680 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 0a  e to a database.
15690 2a 2a 20 20 20 20 20 70 61 67 65 20 69 73 20 68  **     page is h
156a0 65 6c 64 2e 20 54 68 69 73 20 67 75 61 72 61 6e  eld. This guaran
156b0 74 65 65 73 20 74 68 61 74 20 74 68 65 20 64 61  tees that the da
156c0 74 61 62 61 73 65 20 73 69 7a 65 20 69 73 20 61  tabase size is a
156d0 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20 20 6b 6e  lready.**     kn
156e0 6f 77 6e 20 61 6e 64 20 61 20 63 61 6c 6c 20 74  own and a call t
156f0 6f 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  o sqlite3OsFileS
15700 69 7a 65 28 29 20 69 73 20 6e 6f 74 20 72 65 71  ize() is not req
15710 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 62 29  uired..**.**  b)
15720 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15730 65 20 69 73 20 6e 6f 74 20 61 64 6a 75 73 74 65  e is not adjuste
15740 64 20 66 6f 72 20 74 68 65 20 6c 6f 63 6b 69 6e  d for the lockin
15750 67 20 70 61 67 65 2e 0a 2a 2f 0a 50 67 6e 6f 20  g page..*/.Pgno 
15760 73 71 6c 69 74 65 33 50 61 67 65 72 49 6d 61 67  sqlite3PagerImag
15770 65 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  eSize(Pager *pPa
15780 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ger){.  assert( 
15790 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
157a0 6c 69 64 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  lid );.  return 
157b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
157c0 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 69 66 6e  }.#endif  /* ifn
157d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
157e0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f  AUTOVACUUM */../
157f0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
15800 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
15810 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
15820 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
15830 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
15840 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
15850 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
15860 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15870 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
15880 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
15890 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
158a0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
158b0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
158c0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
158d0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
158e0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
158f0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
15900 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
15910 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
15920 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
15930 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
15940 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
15950 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
15960 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
15970 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
15980 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
15990 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
159a0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
159b0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
159c0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
159d0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
159e0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
159f0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
15a00 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
15a10 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
15a20 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
15a30 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
15a40 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
15a50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
15a60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15a70 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  {..  disable_sim
15a80 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
15a90 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  ();.  sqlite3Beg
15aa0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
15ab0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ;.  pPager->errC
15ac0 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ode = 0;.  pPage
15ad0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
15ae0 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65   = 0;.  pager_re
15af0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
15b00 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
15b10 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f   /* Set Pager.jo
15b20 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66  urnalHdr to -1 f
15b30 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f  or the benefit o
15b40 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  f the pager_play
15b50 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63  back() .    ** c
15b60 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65  all which may be
15b70 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69   made from withi
15b80 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  n pagerUnlockAnd
15b90 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69  Rollback(). If i
15ba0 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
15bb0 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73  -1, then the uns
15bc0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
15bd0 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
15be0 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a   file may.    **
15bf0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
15c00 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
15c10 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
15c20 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
15c30 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
15c40 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
15c50 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
15c60 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
15c70 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
15c80 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31  >journalHdr = -1
15c90 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
15ca0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
15cb0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 65 6e 61 62  ger);.  }.  enab
15cc0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
15cd0 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
15ce0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15cf0 6f 63 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  oc();.  PAGERTRA
15d00 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
15d10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
15d20 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
15d30 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
15d40 61 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61  ager)).  if( pPa
15d50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15d60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
15d70 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
15d80 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
15d90 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15da0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
15db0 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  al);.  sqlite3Bi
15dc0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
15dd0 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
15de0 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 41  ack);.  releaseA
15df0 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
15e00 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  er);.  sqlite3Os
15e10 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
15e20 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
15e30 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
15e40 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
15e50 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
15e60 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
15e70 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
15e80 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
15e90 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
15ea0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
15eb0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
15ec0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
15ed0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
15ee0 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
15ef0 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
15f00 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
15f10 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15f20 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
15f30 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
15f40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
15f50 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
15f60 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
15f70 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
15f80 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
15f90 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
15fa0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
15fb0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
15fc0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
15fd0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
15fe0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
15ff0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
16000 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
16010 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
16020 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
16030 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
16040 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
16050 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
16060 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16070 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
16080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16090 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
160a0 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
160b0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
160c0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
160d0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
160e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
160f0 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
16100 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
16110 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
16120 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
16130 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
16140 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
16150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
16160 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
16170 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
16180 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
16190 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
161a0 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
161b0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
161c0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
161d0 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
161e0 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
161f0 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
16200 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
16210 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
16220 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
16230 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
16240 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
16250 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
16260 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
16270 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
16280 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
16290 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
162a0 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
162b0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
162c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
162d0 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
162e0 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
162f0 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
16300 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
16310 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
16320 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
16330 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
16340 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
16350 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
16360 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
16370 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
16380 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
16390 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
163a0 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
163b0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
163c0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
163d0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
163e0 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
163f0 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
16400 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
16410 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20  ure, so no sync 
16420 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
16430 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
16440 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65  NTIAL flag is se
16450 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73  t for the persis
16460 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68  tent media on wh
16470 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ich.** the datab
16480 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74  ase is stored, t
16490 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20  hen OsSync() is 
164a0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  never called on 
164b0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
164c0 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ile. In this cas
164d0 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  e all that is re
164e0 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70 64  quired is to upd
164f0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
16500 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75  ld in.** the jou
16510 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a  rnal header..**.
16520 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16530 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
16540 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
16550 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
16560 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
16570 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
16580 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
16590 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
165a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
165b0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
165c0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
165d0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
165e0 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
165f0 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
16600 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
16610 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
16620 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
16630 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
16640 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
16650 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
16660 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
16670 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
16680 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
16690 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
166a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
166b0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
166c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
166d0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
166e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
166f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
16700 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  n );..      if( 
16710 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
16720 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
16730 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
16740 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
16750 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
16760 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
16770 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
16780 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
16790 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
167a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
167b0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
167c0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
167d0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
167e0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
167f0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
16800 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
16810 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
16820 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
16830 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
16840 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16850 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
16860 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
16870 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
16880 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
16890 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
168a0 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
168b0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
168c0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
168d0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
168e0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
168f0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
16900 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
16910 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
16920 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
16930 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
16940 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
16950 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
16960 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
16970 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
16980 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
16990 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
169a0 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b      i64 jrnlOff;
169b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
169c0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
169d0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
169e0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
169f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
16a00 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43  AGERTRACE(("SYNC
16a10 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
16a20 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
16a30 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r)));.          
16a40 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
16a50 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
16a60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16a70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
16a80 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
16a90 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
16aa0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
16ab0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
16ac0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
16ad0 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61     jrnlOff = pPa
16ae0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
16af0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
16b00 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20  lMagic);.       
16b10 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
16b20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
16b30 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20  Pager, jrnlOff, 
16b40 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  4));.        rc 
16b50 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
16b60 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
16b70 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ff, pPager->nRec
16b80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16b90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16bb0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
16bc0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
16bd0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
16be0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
16bf0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
16c00 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16c10 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
16c20 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
16c30 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
16c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16c50 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
16c60 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
16c70 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
16c80 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
16c90 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
16ca0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
16cb0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
16cc0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
16cd0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
16ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
16cf0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
16d00 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
16d10 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
16d20 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
16d30 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
16d40 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
16d50 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
16d60 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
16d70 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
16d80 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61  earSyncFlags(pPa
16d90 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
16da0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
16db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
16dc0 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
16dd0 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
16de0 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
16df0 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
16e00 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
16e10 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
16e20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16e30 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72 65  le. No calls are
16e40 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
16e50 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d 61  page-cache to ma
16e60 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73 20  rk the pages as 
16e70 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68 65  clean. It is the
16e80 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a   responsibility.
16e90 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ** of the caller
16ea0 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43 6c   to use PcacheCl
16eb0 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61 63  eanAll() or Pcac
16ec0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74 6f  heMakeClean() to
16ed0 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61 67   mark.** the pag
16ee0 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a  es as clean..*/.
16ef0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16f00 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
16f10 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20  PgHdr *pList){. 
16f20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
16f30 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
16f40 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16f60 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e  pPager = pList->
16f70 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74  pPager;..  /* At
16f80 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
16f90 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20  e may be either 
16fa0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
16fb0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
16fc0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
16fd0 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
16fe0 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45   is already an E
16ff0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74  XCLUSIVE lock, t
17000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a  he following.  *
17010 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
17020 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e  e3OsLock() are n
17030 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  o-ops..  **.  **
17040 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
17050 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
17060 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
17070 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
17080 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
17090 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
170a0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
170b0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
170c0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
170d0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
170e0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
170f0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
17100 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
17110 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
17120 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
17130 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
17140 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
17150 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
17160 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
17170 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
17180 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
17190 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
171a0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
171b0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
171c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
171d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
171e0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
171f0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
17200 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
17210 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
17220 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
17230 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
17240 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
17250 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
17260 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
17270 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
17280 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
17290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
172a0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
172b0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
172c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
172d0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
172e0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63  yback..  */.  rc
172f0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
17300 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
17310 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
17320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17330 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17340 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c   rc;.  }..  whil
17350 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20  e( pList ){..   
17360 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
17370 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
17380 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
17390 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28   now. */.    if(
173a0 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
173b0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
173c0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74  assert(pPager->t
173d0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
173e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
173f0 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
17400 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  , pPager->fd, pP
17410 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b  ager->vfsFlags);
17420 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
17430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17440 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
17450 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
17460 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
17470 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
17480 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
17490 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
174a0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
174b0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
174c0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
174d0 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
174e0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
174f0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
17500 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
17510 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
17520 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
17530 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
17540 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
17550 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
17560 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
17570 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
17580 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
17590 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
175a0 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
175b0 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
175c0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
175d0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
175e0 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
175f0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
17600 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73 74  st->pData, pList
17610 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20  ->pgno, 6);..   
17620 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
17630 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
17640 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
17650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17660 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
17670 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  r), pList->pgno,
17680 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17690 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20  pList)));.      
176a0 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
176b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
176c0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b  , pList->pgno));
176d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
176e0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
176f0 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
17700 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
17710 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50  offset);.      P
17720 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
17730 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
17740 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41  count);.      PA
17750 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
17760 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  >nWrite);.      
17770 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d  if( pList->pgno=
17780 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
17790 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
177a0 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
177b0 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
177c0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
177d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
177e0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
177f0 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  >pPager->dbFileS
17800 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ize ){.        p
17810 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
17820 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  e = pList->pgno;
17830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
17840 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
17850 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41    else{.      PA
17860 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54 4f  GERTRACE(("NOSTO
17870 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
17880 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17890 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  ), pList->pgno))
178a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
178b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
178c0 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51  rn rc;.#ifdef SQ
178d0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
178e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
178f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
17900 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
17910 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
17920 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
17930 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
17940 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17950 2a 20 41 64 64 20 74 68 65 20 70 61 67 65 20 74  * Add the page t
17960 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
17970 6c 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  l. It is the cal
17980 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
17990 69 74 79 20 74 6f 0a 2a 2a 20 75 73 65 20 73 75  ity to.** use su
179a0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29  bjRequiresPage()
179b0 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 69   to check that i
179c0 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75  t is really requ
179d0 69 72 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20  ired before .** 
179e0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
179f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
17a00 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
17a10 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
17a20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f 69  .  int rc;.  voi
17a30 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e  d *pData = pPg->
17a40 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a  pData;.  Pager *
17a50 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
17a60 61 67 65 72 3b 0a 20 20 69 36 34 20 6f 66 66 73  ager;.  i64 offs
17a70 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  et = pPager->stm
17a80 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  tNRec*(4+pPager-
17a90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 63 68  >pageSize);.  ch
17aa0 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44  ar *pData2 = COD
17ab0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
17ac0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
17ad0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  ;..  PAGERTRACE(
17ae0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
17af0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
17b00 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17b10 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 61  Pg->pgno));..  a
17b20 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
17b30 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
17b40 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
17b50 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 72  bOrigSize );.  r
17b60 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
17b70 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66  pPager->sjfd, of
17b80 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  fset, pPg->pgno)
17b90 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17bb0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17bc0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70  (pPager->sjfd, p
17bd0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
17be0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
17bf0 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  4);.  }.  if( rc
17c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c10 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
17c20 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  Rec++;.    asser
17c30 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  t( pPager->nSave
17c40 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20 72  point>0 );.    r
17c50 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69  c = addToSavepoi
17c60 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
17c70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
17c80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17c90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
17ca0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17cb0 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c   by the pcache l
17cc0 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61 73  ayer when it has
17cd0 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a   reached some.**
17ce0 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d   soft memory lim
17cf0 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  it. The argument
17d00 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
17d10 20 61 20 70 75 72 67 65 61 62 6c 65 20 50 61 67   a purgeable Pag
17d20 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 54  er .** object. T
17d30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
17d40 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 61 20  empts to make a 
17d50 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70 61 67  single dirty pag
17d60 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a 2a  e that has no.**
17d70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
17d80 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e 65 20  erences (if one 
17d90 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20 73 6f  exists) clean so
17da0 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
17db0 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79 20  recycled .** by 
17dc0 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  the pcache layer
17dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17de0 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
17df0 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
17e00 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
17e10 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
17e20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17e30 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
17e40 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 29  ger->doNotSync )
17e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17e60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
17e70 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67  ssert( pPg->flag
17e80 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b  s&PGHDR_DIRTY );
17e90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
17ea0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
17eb0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  K ){.    if( pPg
17ec0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
17ed0 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
17ee0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
17ef0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
17f00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17f10 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75  OK && pPager->fu
17f20 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20  llSync && .     
17f30 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75     !(pPager->jou
17f40 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
17f50 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
17f60 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20 21  RY) &&.        !
17f70 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
17f80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
17f90 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
17fa0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
17fb0 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20  PEND).      ){. 
17fc0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
17fd0 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
17fe0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
17ff0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
18000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18010 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
18030 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
18040 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
18050 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  >pPager->dbSize 
18060 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  && subjRequiresP
18070 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
18080 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72      rc = subjour
18090 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20  nalPage(pPg);.  
180a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
180b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
180c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
180d0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
180e0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  st(pPg);.      }
180f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18100 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18110 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
18120 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
18130 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
18140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18150 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
18160 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
18170 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18180 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
18190 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
181a0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
181b0 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (pPg);.  }.  ret
181c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
181d0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
181e0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
181f0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
18200 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
18210 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
18220 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
18230 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
18240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
18250 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
18260 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
18270 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
18280 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
18290 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
182a0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
182b0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
182c0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
182d0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
182e0 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
182f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
18300 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ..**.** Return n
18310 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62 6c  egative if unabl
18320 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
18330 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65  he status of the
18340 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
18350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
18360 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a  s not open the j
18370 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
18380 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f  xamine its.** co
18390 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74  ntent.  Hence, t
183a0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
183b0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d   contain the nam
183c0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a  e of a master.**
183d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
183e0 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65  at has been dele
183f0 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e  ted, and hence n
18400 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a  ot be hot.  Or.*
18410 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  * the header of 
18420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
18430 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e  t be zeroed out.
18440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
18450 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f  * does not disco
18460 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20  ver these cases 
18470 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75  of a non-hot jou
18480 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a  rnal - if the.**
18490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
184a0 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20  ists and is not 
184b0 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69  empty this routi
184c0 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a  ne assumes it.**
184d0 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61   is hot.  The pa
184e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
184f0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63  outine will disc
18500 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a  over that the.**
18510 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18520 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20   not really hot 
18530 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a  and will no-op..
18540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
18550 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
18560 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a  r *pPager, int *
18570 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69  pExists){.  sqli
18580 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
18590 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
185a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
185b0 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73  OK;.  int exists
185c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b   = 0;.  int lock
185d0 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ed = 0;.  assert
185e0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
185f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18600 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
18610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18620 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  >fd->pMethods );
18630 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
18640 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
18650 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
18660 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
18670 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
18680 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
18690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
186a0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
186b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
186c0 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
186d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
186e0 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20   &locked);.  }. 
186f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18700 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26 20  OK && exists && 
18710 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69  !locked ){.    i
18720 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63  nt nPage;.    rc
18730 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
18740 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
18750 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66   &nPage);.    if
18760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18770 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67  ){.     if( nPag
18780 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
18790 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
187a0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
187b0 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
187c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
187d0 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20   *pExists = 1;. 
187e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
187f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18800 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
18810 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
18820 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
18830 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
18840 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
18850 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  DbPage(Pager *pP
18860 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
18870 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
18880 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66  int rc;.  i64 of
18890 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
188a0 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73  MEMDB==0 );.  as
188b0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
188c0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
188d0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
188e0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
188f0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
18900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
18910 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
18920 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
18930 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
18940 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
18950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
18960 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
18970 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61   pPg->pData, pPa
18980 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
18990 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f  ffset);.  PAGER_
189a0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
189b0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29  er_readdb_count)
189c0 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70  ;.  PAGER_INCR(p
189d0 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20  Pager->nRead);. 
189e0 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20   IOTRACE(("PGIN 
189f0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
18a00 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  , pgno));.  if( 
18a10 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d  pgno==1 ){.    m
18a20 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
18a30 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38  bFileVers, &((u8
18a40 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34  *)pPg->pData)[24
18a50 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
18a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a80 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
18a90 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18aa0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
18ab0 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
18ac0 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
18ad0 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45 54  PAGERTRACE(("FET
18ae0 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CH %d page %d ha
18af0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
18b00 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
18b10 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
18b20 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
18b30 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a 20  gehash(pPg)));. 
18b40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
18b50 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
18b60 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
18b70 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61 72   obtain the shar
18b80 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64  ed lock required
18b90 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20   before.** data 
18ba0 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d  may be read from
18bb0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
18bc0 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64 20  . If the shared 
18bd0 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79  lock has already
18be0 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  .** been obtaine
18bf0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
18c00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
18c10 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61  ** Immediately a
18c20 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74  fter obtaining t
18c30 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28  he shared lock (
18c40 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74 68  if required), th
18c50 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63  is function.** c
18c60 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d  hecks for a hot-
18c70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
18c80 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61   one is found, a
18c90 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
18ca0 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f  back.** is perfo
18cb0 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rmed immediately
18cc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18cd0 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
18ce0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18d00 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72  E_OK;.  int isEr
18d10 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20  rorReset = 0;.. 
18d20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
18d30 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
18d40 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
18d50 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
18d60 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
18d70 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
18d80 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
18d90 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
18da0 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
18db0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
18dc0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
18dd0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
18de0 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
18df0 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
18e00 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
18e10 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
18e20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
18e30 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
18e40 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
18e50 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68   && sqlite3Pcach
18e60 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
18e70 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26  ->pPCache)==0 &&
18e80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18e90 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
18ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18eb0 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72  en ){.      isEr
18ec0 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20  rorReset = 1;.  
18ed0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
18ee0 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
18ef0 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72  _OK;.    pager_r
18f00 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
18f10 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  }..  /* If the p
18f20 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e  ager is still in
18f30 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   an error state,
18f40 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e   do not proceed.
18f50 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a   The error .  **
18f60 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63   state will be c
18f70 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70  leared at some p
18f80 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
18f90 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65  re when all page
18fa0 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65   .  ** reference
18fb0 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e  s are dropped an
18fc0 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20  d the cache can 
18fd0 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20  be discarded..  
18fe0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18ff0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
19000 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
19010 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
19020 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
19030 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69  rrCode;.  }..  i
19040 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
19050 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
19060 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29  | isErrorReset )
19070 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
19080 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
19090 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20  ->pVfs;.    int 
190a0 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30  isHotJournal = 0
190b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
190c0 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
190d0 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  rt( sqlite3Pcach
190e0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
190f0 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b  ->pPCache)==0 );
19100 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
19110 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
19120 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
19130 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
19140 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
19150 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
19160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19180 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
19190 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
191a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
191b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
191c0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
191d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
191e0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
191f0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a  D_LOCK );.    }.
19200 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
19210 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
19220 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
19230 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
19240 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
19250 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
19260 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
19270 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
19280 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
19290 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
192a0 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
192b0 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
192c0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
192d0 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
192e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
192f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19300 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
19310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19320 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
19330 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
19340 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
19350 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
19360 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19370 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
19380 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
19390 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
193a0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
193b0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
193c0 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
193d0 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
193e0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
193f0 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
19400 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
19410 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
19420 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
19430 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
19440 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
19450 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
19460 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
19470 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
19480 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
19490 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
194a0 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
194b0 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
194c0 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
194d0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
194e0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
194f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
19500 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
19510 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
19520 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
19530 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
19540 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
19550 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f  il to.      ** o
19560 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
19570 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
19580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19590 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
195a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
195b0 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
195c0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
195d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
195e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
195f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
19600 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19610 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19620 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
19630 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
19640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
19650 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
19660 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
19670 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
19680 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
19690 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
196a0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
196b0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
196c0 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
196d0 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
196e0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
196f0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
19700 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
19710 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
19720 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
19730 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
19740 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
19750 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
19760 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
19770 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
19780 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
19790 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
197a0 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
197b0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
197c0 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
197d0 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
197e0 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72        if( !isErr
197f0 6f 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65  orReset && pPage
19800 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
19810 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
19820 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
19830 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
19840 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
19850 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
19860 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
19870 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
19880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
198a0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
198b0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
198c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
198d0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
198e0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
198f0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
19900 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
19910 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
19920 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
19930 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
19940 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
19950 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
19960 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
19970 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
19980 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
19990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
199a0 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
199b0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
199c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
199d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
199e0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
199f0 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
19a00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
19a10 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
19a20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
19a30 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
19a40 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
19a50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
19a60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
19a70 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
19a80 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
19a90 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
19aa0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
19ab0 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
19ac0 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
19ad0 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
19af0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
19b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19b10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
19b20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
19b40 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
19b50 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
19b60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
19b70 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  1;.      pPager-
19b80 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
19b90 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
19ba0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
19bb0 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
19bc0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
19bd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
19be0 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
19bf0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
19c00 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
19c10 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
19c20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
19c30 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
19c40 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
19c50 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
19c60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
19c70 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
19c80 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20  (pPager, 1);.   
19c90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
19cb0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
19cc0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
19cd0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
19ce0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
19cf0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
19d00 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
19d10 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  RED || .        
19d20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
19d30 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
19d40 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
19d50 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b  SHARED).      );
19d60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
19d70 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
19d80 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  ecount(pPager->p
19d90 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20  PCache)>0 ){.   
19da0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
19db0 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62  -lock has just b
19dc0 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20  een acquired on 
19dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19de0 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74  e.      ** and t
19df0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
19e00 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
19e10 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
19e20 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65  ious.      ** re
19e30 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
19e40 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
19e50 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
19e60 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
19e70 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
19e80 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ed.  If the data
19e90 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64  base has changed
19ea0 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20  , flush the.    
19eb0 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20    ** cache..    
19ec0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61    **.      ** Da
19ed0 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69  tabase changes i
19ee0 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f  s detected by lo
19ef0 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65  oking at 15 byte
19f00 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  s beginning.    
19f10 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32    ** at offset 2
19f20 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e  4 into the file.
19f30 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f 66    The first 4 of
19f40 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73 20   these 16 bytes 
19f50 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33  are.      ** a 3
19f60 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68  2-bit counter th
19f70 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  at is incremente
19f80 64 20 77 69 74 68 20 65 61 63 68 20 63 68 61 6e  d with each chan
19f90 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  ge.  The.      *
19fa0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
19fb0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
19fc0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
19fd0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  nge when.      *
19fe0 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
19ff0 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20  use..      ** . 
1a000 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
1a010 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73   a vanishingly s
1a020 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74  mall chance that
1a030 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e   a change will n
1a040 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20  ot be .      ** 
1a050 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
1a060 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
1a070 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
1a080 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
1a090 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62       ** it can b
1a0a0 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20  e neglected..   
1a0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72     */.      char
1a0c0 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65   dbFileVers[size
1a0d0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
1a0e0 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73  eVers)];.      s
1a0f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1a100 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
1a110 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
1a120 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1a130 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67         rc = pPag
1a140 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
1a150 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1a160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a180 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
1a190 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1a1a0 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20  ->dbSize>0 ){.  
1a1b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1a1c0 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c  CKVERS %p %d\n",
1a1d0 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28   pPager, sizeof(
1a1e0 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20  dbFileVers)));. 
1a1f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a200 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1a210 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72  ->fd, &dbFileVer
1a220 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  s, sizeof(dbFile
1a230 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20  Vers), 24);.    
1a240 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a250 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a260 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
1a270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a280 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1a290 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
1a2a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
1a2b0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1a2c0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d  }..      if( mem
1a2d0 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
1a2e0 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
1a2f0 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
1a300 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
1a310 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
1a320 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1a330 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1a340 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
1a350 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1a360 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
1a370 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1a380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1a390 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1a3a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a3b0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1a3c0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
1a3d0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
1a3e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a3f0 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
1a400 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
1a410 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
1a420 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
1a430 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
1a440 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
1a450 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1a460 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a470 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1a480 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
1a490 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
1a4a0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
1a4b0 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
1a4c0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1a4d0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
1a4e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
1a4f0 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
1a500 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
1a510 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
1a520 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
1a530 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
1a540 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
1a550 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
1a560 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
1a570 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
1a580 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
1a590 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
1a5a0 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
1a5b0 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
1a5c0 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
1a5d0 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
1a5e0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41  s&PGHDR_NEED_REA
1a5f0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  D ){.    int rc 
1a600 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1a610 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
1a620 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1a630 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a640 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66   ){.      pPg->f
1a650 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
1a660 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65  EED_READ;.    }e
1a670 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1a680 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1a690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a6a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
1a6b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1a6c0 75 6e 74 20 68 61 73 20 72 65 61 63 68 65 64 20  unt has reached 
1a6d0 7a 65 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61  zero, and the pa
1a6e0 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  ger is not in th
1a6f0 65 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61  e.** middle of a
1a700 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1a710 6f 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20  on or opened in 
1a720 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
1a730 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73  unlock it..*/ .s
1a740 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1a750 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
1a760 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1a770 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61   if( (sqlite3Pca
1a780 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
1a790 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
1a7a0 0a 20 20 20 20 26 26 20 28 21 70 50 61 67 65 72  .    && (!pPager
1a7b0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1a7c0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1a7d0 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20  alOff>0) .  ){. 
1a7e0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
1a7f0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
1a800 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a810 44 72 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d  Drop a page from
1a820 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
1a830 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1a840 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  op()..**.** If t
1a850 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20  his means there 
1a860 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73  are now no pages
1a870 20 77 69 74 68 20 72 65 66 65 72 65 6e 63 65 73   with references
1a880 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c   to them, a roll
1a890 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61  back.** occurs a
1a8a0 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
1a8b0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 72  he database is r
1a8c0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  emoved..*/.stati
1a8d0 63 20 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70  c void pagerDrop
1a8e0 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 50 67  Page(DbPage *pPg
1a8f0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1a900 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1a910 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1a920 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61  eDrop(pPg);.  pa
1a930 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
1a940 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  d(pPager);.}../*
1a950 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1a960 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
1a970 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
1a980 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
1a990 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
1a9a0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
1a9b0 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
1a9c0 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
1a9d0 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
1a9e0 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
1a9f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1aa00 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
1aa10 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
1aa20 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
1aa30 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
1aa40 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
1aa50 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
1aa60 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
1aa70 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
1aa80 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
1aa90 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
1aaa0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
1aab0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
1aac0 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
1aad0 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
1aae0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
1aaf0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
1ab00 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
1ab10 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
1ab20 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
1ab30 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
1ab40 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
1ab50 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
1ab60 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
1ab70 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
1ab80 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
1ab90 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
1aba0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1abb0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
1abc0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
1abd0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
1abe0 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
1abf0 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
1ac00 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
1ac10 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
1ac20 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
1ac30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1ac40 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
1ac50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1ac60 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
1ac70 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
1ac80 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
1ac90 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
1aca0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
1acb0 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
1acc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
1acd0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
1ace0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
1acf0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
1ad00 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
1ad10 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
1ad20 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
1ad30 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
1ad40 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
1ad50 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
1ad60 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
1ad70 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
1ad80 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
1ad90 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
1ada0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
1adb0 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
1adc0 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
1add0 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
1ade0 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f  disk..** If noCo
1adf0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
1ae00 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
1ae10 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
1ae20 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
1ae30 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  * of the page at
1ae40 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64   this time, so d
1ae50 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20  o not do a disk 
1ae60 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c  read.  Just fill
1ae70 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   in the.** page 
1ae80 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
1ae90 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68  os.  But mark th
1aea0 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68  e fact that we h
1aeb0 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65  ave not read the
1aec0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73  .** content by s
1aed0 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
1aee0 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20  .needRead flag. 
1aef0 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a   Later on, if .*
1af00 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
1af10 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1af20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20  on this page or 
1af30 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
1af40 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61  is.** called aga
1af50 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  in with noConten
1af60 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==0, that means
1af70 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
1af80 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61  t is needed.** a
1af90 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64  nd the disk read
1afa0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
1afb0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
1afc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1afd0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
1afe0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
1aff0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
1b000 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b010 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1b020 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
1b030 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1b040 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
1b050 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1b060 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
1b070 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
1b080 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
1b090 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
1b0a0 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
1b0b0 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
1b0c0 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
1b0d0 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
1b0e0 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  Pg = 0;.  int rc
1b0f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b100 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1b110 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20  R_UNLOCK .      
1b120 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68   || sqlite3Pcach
1b130 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
1b140 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20  ->pPCache)>0 .  
1b150 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a       || pgno==1.
1b160 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d    );..  /* The m
1b170 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
1b180 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
1b190 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1b1a0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
1b1b0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
1b1c0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
1b1d0 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
1b1e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
1b1f0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
1b200 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
1b210 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
1b220 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1b230 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b240 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b250 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1b260 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
1b270 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
1b280 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
1b290 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1b2a0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
1b2b0 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
1b2c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
1b2d0 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
1b2e0 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
1b2f0 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
1b300 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70  database file. p
1b310 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29  agerSharedLock()
1b320 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a   is a no-op if .
1b330 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
1b340 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
1b350 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  held..  */.  rc 
1b360 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  = pagerSharedLoc
1b370 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  k(pPager);.  if(
1b380 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b390 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b3a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1b3b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b3c0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  GER_UNLOCK );.. 
1b3d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1b3e0 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
1b3f0 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
1b400 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20  1, &pPg);.  if( 
1b410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b420 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1b430 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
1b440 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Pager==0 ){.    
1b450 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
1b460 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
1b470 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
1b480 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
1b490 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
1b4a0 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  alized..    */. 
1b4b0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1b4c0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1b4d0 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20  er->nMiss);.    
1b4e0 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  pPg->pPager = pP
1b4f0 61 67 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ager;.    memset
1b500 28 70 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c  (pPg->pExtra, 0,
1b510 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
1b520 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1b530 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1b540 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29  t(pPager, &nMax)
1b550 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b570 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1b580 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72  ef(pPg);.      r
1b590 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b5a0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1b5b0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1b5c0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b   || noContent ){
1b5d0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  .      if( pgno>
1b5e0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
1b5f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b600 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1b610 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1b620 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b630 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
1b640 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30  et(pPg->pData, 0
1b650 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b660 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ze);.      if( n
1b670 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1b680 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1b690 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41  = PGHDR_NEED_REA
1b6a0 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  D;.      }.     
1b6b0 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20   IOTRACE(("ZERO 
1b6c0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1b6d0 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65  , pgno));.    }e
1b6e0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1b6f0 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67 65  readDbPage(pPage
1b700 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20  r, pPg, pgno);. 
1b710 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b720 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1b730 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b740 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1b750 20 2f 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   /* sqlite3Pager
1b760 55 6e 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20  Unref(pPg); */. 
1b770 20 20 20 20 20 20 20 70 61 67 65 72 44 72 6f 70         pagerDrop
1b780 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
1b790 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b7a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64      }.    }.#ifd
1b7b0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
1b7c0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
1b7d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1b7e0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1b7f0 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1b800 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1b810 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74  ted page is in t
1b820 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
1b830 2f 0a 20 20 20 20 61 73 73 65 72 74 28 73 71 6c  /.    assert(sql
1b840 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
1b850 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
1b860 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  he)>0 || pgno==1
1b870 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
1b880 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
1b890 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
1b8a0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
1b8b0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1b8c0 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
1b8d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1b8e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1b8f0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1b900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1b920 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b    *ppPage = pPg;
1b930 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b940 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
1b950 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
1b960 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
1b970 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
1b980 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
1b990 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
1b9a0 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
1b9b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1b9c0 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
1b9d0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1b9e0 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  not in cache..**
1b9f0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
1ba00 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
1ba10 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1ba20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
1ba30 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
1ba40 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
1ba50 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
1ba60 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
1ba70 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
1ba80 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
1ba90 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1baa0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
1bab0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1bac0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
1bad0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1bae0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
1baf0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
1bb00 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
1bb10 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
1bb20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
1bb30 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
1bb40 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1bb50 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
1bb60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bb70 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1bb80 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1bb90 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
1bba0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1bbb0 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
1bbc0 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
1bbd0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
1bbe0 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
1bbf0 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ULL).  ){.    sq
1bc00 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
1bc10 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1bc20 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
1bc30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1bc40 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
1bc50 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
1bc60 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
1bc70 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1bc80 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
1bc90 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
1bca0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
1bcb0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
1bcc0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
1bcd0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
1bce0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
1bcf0 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
1bd00 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
1bd10 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1bd20 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
1bd30 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
1bd40 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
1bd50 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69  bPage *pPg){.  i
1bd60 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61  f( pPg ){.    Pa
1bd70 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1bd80 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73  g->pPager;.    s
1bd90 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
1bda0 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61  ase(pPg);.    pa
1bdb0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
1bdc0 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  d(pPager);.  }. 
1bdd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bde0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
1bdf0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1be00 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
1be10 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
1be20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
1be30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
1be40 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
1be50 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
1be60 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
1be70 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
1be80 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1be90 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1bea0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
1beb0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
1bec0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41  rding to plan. A
1bed0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  n .** SQLITE_IOE
1bee0 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
1bef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
1bf00 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a   the call to .**
1bf10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29   sqlite3OsOpen()
1bf20 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1bf30 63 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75  c int openSubJou
1bf40 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1bf50 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1bf60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1bf70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bf80 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
1bf90 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  >sjfd->pMethods 
1bfa0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
1bfb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1bfc0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1bfd0 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
1bfe0 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72    sqlite3MemJour
1bff0 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  nalOpen(pPager->
1c000 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sjfd);.    }else
1c010 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1c020 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
1c030 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
1c040 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
1c050 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
1c060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1c070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c080 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
1c090 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
1c0a0 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
1c0b0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
1c0c0 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
1c0d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c0e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c0f0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
1c100 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
1c110 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1c120 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
1c130 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
1c140 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
1c150 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
1c160 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
1c170 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
1c180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1c190 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1c1a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1c1b0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1c1c0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1c1d0 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
1c1e0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
1c1f0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
1c200 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
1c210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1c220 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
1c230 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c240 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1c250 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
1c260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
1c270 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
1c280 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1c290 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1c2a0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c2b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
1c2c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
1c2d0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1c2e0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
1c2f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
1c300 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
1c310 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
1c320 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1c330 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
1c340 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1c350 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
1c360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c370 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
1c380 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
1c390 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
1c3a0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1c3b0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
1c3c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c3d0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
1c3e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
1c3f0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
1c400 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
1c410 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1c420 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1c430 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1c440 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
1c450 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
1c460 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
1c470 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
1c480 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c490 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
1c4a0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c4b0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1c4c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
1c4d0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
1c4e0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
1c4f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1c500 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
1c510 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
1c520 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
1c530 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
1c540 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1c550 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1c560 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
1c570 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
1c580 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1c590 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1c5a0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c5b0 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1c5c0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1c5d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
1c5e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
1c5f0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
1c600 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1c610 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
1c620 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c630 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1c640 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1c650 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
1c660 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
1c670 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
1c680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c690 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1c6a0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
1c6b0 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
1c6c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
1c6d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
1c6e0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
1c6f0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1c700 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
1c710 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1c720 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1c730 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1c740 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c750 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1c760 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1c770 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
1c780 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65  OrigSize = pPage
1c790 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1c7a0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1c7b0 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1c7c0 66 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  f( pPager->nSave
1c7d0 70 6f 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c  point && rc==SQL
1c7e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1c7f0 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61   = openSubJourna
1c800 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  l(pPager);.  }. 
1c810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c820 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
1c830 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
1c840 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1c850 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1c860 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1c870 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  on(pPager, 0);. 
1c880 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1c8a0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1c8b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c8c0 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
1c8d0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
1c8e0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
1c8f0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
1c900 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50  InJournal);.  pP
1c910 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1c920 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
1c930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
1c940 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
1c950 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c960 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
1c970 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
1c980 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
1c990 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
1c9a0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
1c9b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1c9c0 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65  seTwo() is calle
1c9d0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1c9e0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c9f0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1ca00 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1ca10 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  rClose() is call
1ca20 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1ca30 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1ca40 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
1ca50 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
1ca60 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
1ca70 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
1ca80 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
1ca90 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1caa0 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
1cab0 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
1cac0 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
1cad0 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
1cae0 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
1caf0 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
1cb00 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
1cb10 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
1cb20 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
1cb30 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
1cb40 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
1cb50 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
1cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1cb70 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
1cb80 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
1cb90 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
1cba0 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
1cbb0 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
1cbc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1cbd0 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
1cbe0 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
1cbf0 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
1cc00 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
1cc10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1cc20 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
1cc30 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
1cc40 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
1cc50 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
1cc60 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
1cc70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1cc80 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
1cc90 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
1cca0 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
1ccb0 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
1ccc0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1ccd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1cce0 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
1ccf0 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
1cd00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1cd10 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
1cd20 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
1cd30 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
1cd40 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1cd50 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1cd60 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
1cd70 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
1cd80 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
1cd90 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
1cda0 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
1cdb0 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
1cdc0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1cdd0 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
1cde0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1cdf0 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65  agerBegin(DbPage
1ce00 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61   *pPg, int exFla
1ce10 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1ce20 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ce30 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
1ce40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
1ce50 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
1ce60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ce70 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1ce80 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  _UNLOCK );.  if(
1ce90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1cea0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a  PAGER_SHARED ){.
1ceb0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1cec0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
1ced0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1cee0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72   !MEMDB );.    r
1cef0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1cf00 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1cf10 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1cf20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cf30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
1cf40 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1cf50 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
1cf60 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
1cf70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1cf80 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1cf90 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1cfa0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
1cfb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1cfc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cfd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1cfe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1cff0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1d000 20 30 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41   0;.    PAGERTRA
1d010 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
1d020 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1d030 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 69  pPager)));.    i
1d040 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
1d050 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
1d060 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20 20 20  ->tempFile.     
1d070 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
1d080 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1d090 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1d0a0 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OFF ){.      rc 
1d0b0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1d0c0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1d0d0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
1d0e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d0f0 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  pen && pPager->j
1d100 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
1d110 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
1d120 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
1d130 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
1d140 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1d150 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  the last.    ** 
1d160 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
1d170 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
1d180 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
1d190 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
1d1a0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
1d1b0 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
1d1c0 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
1d1d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
1d1e0 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
1d1f0 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65  t open and eithe
1d200 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  r was truncated 
1d210 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74  to 0 bytes or it
1d220 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20  s header was.   
1d230 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20   ** overwritten 
1d240 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
1d250 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d260 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
1d270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1d280 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1d290 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1d2a0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1d2b0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1d2c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1d2d0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
1d2e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
1d2f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1d300 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 20  e3BitvecCreate( 
1d310 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
1d320 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1d330 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->pInJournal ){
1d340 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1d350 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1d360 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1d370 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
1d380 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1d390 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1d3a0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1d3b0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1d3c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d3d0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1d3e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d3f0 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
1d400 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1d410 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1d420 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
1d430 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
1d440 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
1d450 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
1d460 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
1d470 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1d480 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
1d490 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
1d4a0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
1d4b0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
1d4c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1d4d0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1d4e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1d4f0 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
1d500 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
1d510 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
1d520 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
1d530 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d540 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
1d550 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
1d560 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
1d570 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1d580 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
1d590 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
1d5a0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
1d5b0 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
1d5c0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
1d5d0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
1d5e0 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
1d5f0 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
1d600 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1d610 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1d620 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
1d630 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
1d640 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
1d650 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
1d660 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
1d670 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1d680 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
1d690 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
1d6a0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
1d6b0 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
1d6c0 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
1d6d0 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
1d6e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
1d6f0 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
1d700 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1d710 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72  PagerCommit() or
1d720 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1d730 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65  lback() to.** re
1d740 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
1d750 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50  nt pager_write(P
1d760 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f  gHdr *pPg){.  vo
1d770 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
1d780 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
1d790 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d7a0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1d7b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1d7c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1d7d0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1d7e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1d7f0 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1d800 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1d810 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1d820 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1d830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1d840 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1d850 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1d860 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1d870 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1d880 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1d890 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1d8a0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1d8b0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74  Content==1, that
1d8c0 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64   means.  ** we d
1d8d0 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61  idn't really rea
1d8e0 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
1d8f0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54   of the page.  T
1d900 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20  his can happen. 
1d910 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65   ** (for example
1d920 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  ) when the page 
1d930 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  is being moved t
1d940 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  o the freelist. 
1d950 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65   But.  ** now we
1d960 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d   are (perhaps) m
1d970 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f  oving the page o
1d980 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ff of the freeli
1d990 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73  st for.  ** reus
1d9a0 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  e and we need to
1d9b0 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e   know its origin
1d9c0 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68  al content so th
1d9d0 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  at content.  ** 
1d9e0 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1d9f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1da00 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68  urnal.  So do th
1da10 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20  e read at this. 
1da20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20   ** time..  */. 
1da30 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1da40 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1da50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1da60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1da70 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1da80 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1da90 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1daa0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1dab0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1dac0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1dad0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1dae0 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ay..  */.  sqlit
1daf0 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74  e3PcacheMakeDirt
1db00 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61  y(pPg);.  if( pa
1db10 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1db20 20 26 26 20 21 73 75 62 6a 52 65 71 75 69 72 65   && !subjRequire
1db30 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20  sPage(pPg) ){.  
1db40 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1db50 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  ache = 1;.    pP
1db60 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1db70 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
1db80 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
1db90 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
1dba0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1dbb0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
1dbc0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
1dbd0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1dbe0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
1dbf0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
1dc00 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
1dc10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1dc20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
1dc30 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
1dc40 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1dc50 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
1dc60 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
1dc70 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
1dc80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1dc90 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1dca0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1dcb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dcc0 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
1dcd0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1dce0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dcf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1dd00 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1dd10 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1dd20 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1dd30 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1dd40 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1dd50 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1dd60 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  l.          && p
1dd70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1dd80 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1dd90 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1dda0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1ddb0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1ddc0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1ddd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1dde0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ddf0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1de00 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70  Cache = 1;.    p
1de10 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1de20 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
1de30 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1de40 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
1de50 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
1de60 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
1de70 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1de80 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
1de90 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1dea0 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
1deb0 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
1dec0 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
1ded0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
1dee0 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1def0 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
1df00 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
1df10 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 70 50  urnal(pPg) && pP
1df20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1df30 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  n ){.      if( p
1df40 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1df50 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
1df60 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1df70 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
1df80 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
1df90 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
1dfa0 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
1dfb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1dfc0 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
1dfd0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
1dfe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
1dff0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
1e000 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
1e010 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
1e020 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
1e030 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1e040 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
1e050 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1e060 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  r) );.        pD
1e070 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1e080 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1e090 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1e0a0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
1e0b0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
1e0c0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
1e0d0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1e0e0 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1e0f0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1e100 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
1e110 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1e120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e130 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e140 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1e150 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
1e160 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1e170 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1e1a0 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
1e1b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1e1c0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
1e1d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
1e1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e1f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e200 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e210 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
1e220 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
1e230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1e240 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
1e250 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1e260 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
1e270 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e280 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1e290 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1e2a0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1e2b0 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
1e2c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1e2d0 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
1e2e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
1e2f0 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
1e300 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1e310 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
1e320 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1e330 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E(("JOURNAL %d p
1e340 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
1e350 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1e360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
1e370 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1e380 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
1e390 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
1e3a0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1e3b0 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
1e3c0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1e3d0 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ));..        /* 
1e3e0 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72  Even if an IO or
1e3f0 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20   diskfull error 
1e400 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 6a  occurred while j
1e410 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20  ournalling the. 
1e420 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1e430 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1e440 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64 2d  e, set the need-
1e450 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74 68  sync flag for th
1e460 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  e page..        
1e470 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68  ** Otherwise, wh
1e480 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1e490 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
1e4a0 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a  k, the logic in.
1e4b0 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 62          ** playb
1e4c0 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77  ack_one_page() w
1e4d0 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20 74  ill think that t
1e4e0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
1e4f0 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20 20   be restored.   
1e500 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64       ** in the d
1e510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 6e  atabase file. An
1e520 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  d if an IO error
1e530 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64 6f   occurs while do
1e540 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20 20  ing so,.        
1e550 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74 69  ** then corrupti
1e560 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20  on may follow.. 
1e570 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e580 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1e590 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  oSync ){.       
1e5a0 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
1e5b0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
1e5c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1e5d0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1e5e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1e5f0 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
1e600 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69   has occured wri
1e610 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72  ting to the jour
1e620 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20  nal file. The . 
1e630 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1e640 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f  ction will be ro
1e650 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65  lled back by the
1e660 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20   layer above..  
1e670 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e680 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e690 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e6a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e6b0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50     }..        pP
1e6c0 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
1e6d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1e6e0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1e6f0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
1e700 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1e710 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1e720 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
1e730 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  no);.        tes
1e740 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
1e750 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
1e760 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1e770 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d  QLITE_OK || rc==
1e780 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
1e790 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20 61 64          rc |= ad
1e7a0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1e7b0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1e7c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1e7d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e7e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  K ){.          a
1e7f0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1e800 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
1e810 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e820 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1e840 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1e850 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70  nalStarted && !p
1e860 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1e870 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1e880 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
1e890 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
1e8a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1e8b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1e8c0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1e8d0 52 54 52 41 43 45 28 28 22 41 50 50 45 4e 44 20  RTRACE(("APPEND 
1e8e0 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1e8f0 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1e900 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1e910 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1e920 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
1e930 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
1e940 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1e950 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20  NC)?1:0)));.    
1e960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1e970 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
1e980 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1e990 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
1e9a0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
1e9b0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
1e9c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1e9d0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
1e9e0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
1e9f0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
1ea00 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1ea10 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
1ea20 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
1ea30 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
1ea40 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
1ea50 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
1ea60 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
1ea70 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
1ea80 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a 52 65  /.    if( subjRe
1ea90 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20  quiresPage(pPg) 
1eaa0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 75  ){.      rc = su
1eab0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67  bjournalPage(pPg
1eac0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1ead0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1eae0 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1eaf0 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1eb00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1eb10 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1eb20 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1eb30 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e  er->dbSize<pPg->
1eb40 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
1eb50 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
1eb60 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
1eb70 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1eb80 28 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  (PAGER_MJ_PGNO(p
1eb90 50 61 67 65 72 29 2d 31 29 20 29 7b 0a 20 20 20  Pager)-1) ){.   
1eba0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1ebb0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1ebc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ebd0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ebe0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1ebf0 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1ec00 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1ec10 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1ec20 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1ec30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1ec40 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1ec50 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1ec60 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1ec70 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1ec80 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1ec90 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1eca0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1ecb0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1ecc0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1ecd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1ece0 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1ecf0 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1ed00 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1ed10 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1ed20 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1ed30 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1ed40 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1ed50 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1ed60 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1ed70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1ed80 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1ed90 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1eda0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1edb0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1edc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1edd0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1ede0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1edf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ee00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1ee10 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1ee20 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1ee30 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1ee40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1ee50 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
1ee60 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1ee70 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1ee80 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1ee90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1eea0 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1eeb0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1eec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eed0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1eee0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1eef0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1ef00 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1ef10 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ef20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1ef30 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1ef40 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1ef50 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
1ef60 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
1ef70 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  = 0;..    /* Set
1ef80 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1ef90 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1efa0 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1efb0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1efc0 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1efd0 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1efe0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1eff0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1f000 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1f010 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1f020 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
1f030 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1f040 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
1f050 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
1f060 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
1f070 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
1f080 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
1f090 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
1f0a0 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
1f0b0 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
1f0c0 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
1f0d0 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
1f0e0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
1f0f0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
1f100 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1f110 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1f120 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
1f130 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
1f140 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
1f150 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
1f160 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
1f170 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1f180 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28  ecount(pPager, (
1f190 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e  int *)&nPageCoun
1f1a0 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  t);.    if( pPg-
1f1b0 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
1f1c0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1f1d0 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
1f1e0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
1f1f0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
1f200 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
1f210 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
1f220 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
1f230 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
1f240 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
1f250 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
1f260 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
1f270 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
1f280 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
1f290 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
1f2a0 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
1f2b0 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
1f2c0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1f2d0 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
1f2e0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
1f2f0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
1f300 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
1f310 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
1f320 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
1f330 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
1f340 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1f350 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
1f360 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1f370 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
1f380 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1f390 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f3a0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1f3b0 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
1f3c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f3d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f3e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f3f0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1f400 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1f410 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
1f420 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1f430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f440 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1f460 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
1f470 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
1f480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f490 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1f4a0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1f4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f4c0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1f4d0 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
1f4e0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1f4f0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
1f500 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
1f510 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1f520 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
1f530 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1f540 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f550 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f560 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1f570 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f580 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   If the PgHdr.ne
1f590 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
1f5a0 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
1f5b0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
1f5c0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1f5d0 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
1f5e0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
1f5f0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
1f600 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
1f610 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
1f620 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
1f630 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
1f640 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
1f650 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1f660 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
1f670 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
1f680 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
1f690 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
1f6a0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
1f6b0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1f6c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1f6d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f6e0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1f6f0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1f700 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
1f710 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
1f720 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1f730 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
1f740 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
1f750 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
1f760 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1f770 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
1f780 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
1f790 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
1f7a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1f7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f7c0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1f7d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f7e0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1f7f0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
1f800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f810 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1f820 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1f830 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1f840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1f850 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1f860 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1f870 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f880 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1f890 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1f8a0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1f8b0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1f8c0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1f8d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1f8e0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1f8f0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1f900 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1f910 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1f920 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1f930 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1f940 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1f950 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1f960 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1f970 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
1f980 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
1f990 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1f9a0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1f9b0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1f9c0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1f9d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1f9e0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1f9f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1fa00 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
1fa10 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1fa20 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1fa30 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1fa40 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
1fa50 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
1fa60 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
1fa70 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1fa80 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
1fa90 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1faa0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
1fab0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
1fac0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
1fad0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
1fae0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
1faf0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1fb00 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
1fb10 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
1fb20 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
1fb30 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
1fb40 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
1fb50 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
1fb60 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
1fb70 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1fb80 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
1fb90 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
1fba0 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
1fbb0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
1fbc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1fbd0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
1fbe0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1fbf0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1fc00 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1fc10 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1fc20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1fc30 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1fc40 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1fc50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1fc60 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1fc70 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1fc80 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1fc90 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1fca0 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
1fcb0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1fcc0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
1fcd0 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
1fce0 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
1fcf0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1fd00 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
1fd10 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
1fd20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
1fd30 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1fd40 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1fd50 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
1fd60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
1fd70 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
1fd80 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1fd90 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
1fda0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
1fdb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1fdc0 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
1fdd0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
1fde0 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
1fdf0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
1fe00 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
1fe10 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1fe20 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
1fe30 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
1fe40 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1fe50 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1fe60 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1fe70 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
1fe80 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
1fe90 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1fea0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1feb0 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
1fec0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
1fed0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
1fee0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1fef0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ) call..*/.int s
1ff00 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1ff10 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1ff20 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
1ff30 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
1ff40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ff50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1ff60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
1ff70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ff80 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
1ff90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1ffa0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1ffb0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
1ffc0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1ffd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ffe0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
1fff0 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
20000 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ysRollback = sql
20010 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20020 28 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  (pPager->dbOrigS
20030 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
20040 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
20050 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
20060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20070 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
20080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
20090 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
200a0 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  AlwaysRollback, 
200b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69  pPg->pgno);..  i
200c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
200d0 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
200e0 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
200f0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
20100 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  nt==0 ){.    ass
20110 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20120 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
20130 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20140 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d  er->dbSize==pPg-
20150 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
20160 3e 64 62 4f 72 69 67 53 69 7a 65 3c 70 50 61 67  >dbOrigSize<pPag
20170 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
20180 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
20190 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
201a0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
201b0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
201c0 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
201d0 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
201e0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
201f0 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
20200 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
20210 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
20220 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
20230 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
20240 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
20250 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
20260 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
20270 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
20280 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
20290 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
202a0 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
202b0 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
202c0 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
202d0 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
202e0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
202f0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
20300 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
20310 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
20320 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
20330 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
20340 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
20350 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
20360 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
20370 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
20380 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
20390 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
203a0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
203b0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
203c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
203d0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
203e0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
203f0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
20400 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e  no)).      pPg->
20410 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
20420 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
20430 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
20440 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
20450 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
20460 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
20470 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
20480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20490 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
204a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
204b0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
204c0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
204d0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
204e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
204f0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
20500 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
20510 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
20520 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
20530 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
20540 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
20550 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
20560 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
20570 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
20580 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
20590 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
205a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
205b0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
205c0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
205d0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
205e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
205f0 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
20600 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
20610 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
20620 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
20630 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
20640 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
20650 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
20660 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
20670 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
20680 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20690 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
206a0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
206b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
206c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 54 45 53 54  ->pPager;.  TEST
206d0 4f 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20 29 20  ONLY( int rc; ) 
206e0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
206f0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 69 74   from sqlite3Bit
20700 76 65 63 53 65 74 28 29 20 2a 2f 0a 0a 20 20 61  vecSet() */..  a
20710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20720 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
20730 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
20740 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20750 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
20760 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
20770 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
20780 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
20790 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
207a0 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  s the alwaysRoll
207b0 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e  back flag), then
207c0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
207d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
207e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
207f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
20800 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  0 .   || sqlite3
20810 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
20820 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
20830 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20  ck, pPg->pgno). 
20840 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
20850 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
20860 65 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e.  ){.    retur
20870 6e 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  n;.  }..#ifdef S
20880 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
20890 45 54 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ETE.  if( sqlite
208a0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
208b0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
208c0 70 50 67 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20 20  pPg->pgno)!=0.  
208d0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
208e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
208f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
20900 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
20910 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54   If SECURE_DELET
20920 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  E is disabled, t
20930 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
20940 77 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  way that this.  
20950 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  ** routine can b
20960 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61  e called on a pa
20970 67 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c  ge for which sql
20980 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
20990 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f  te().  ** has no
209a0 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
209b0 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20  y called during 
209c0 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
209d0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69  tion..  ** And i
209e0 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  f DontWrite() ha
209f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65  s previously bee
20a00 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f  n called, the fo
20a10 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e  llowing.  ** con
20a20 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
20a30 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28  met..  **.  ** (
20a40 4c 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72 75  Later:)  Not tru
20a50 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  e.  If the datab
20a60 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
20a70 20 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c 69   by having dupli
20a80 63 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  cate.  ** pages 
20a90 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
20aa0 28 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74 65  (ex: corrupt9.te
20ab0 73 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  st) then the fol
20ac0 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20  lowing is not.  
20ad0 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74  ** necessarily t
20ae0 72 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61  rue:.  */.  /* a
20af0 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a  ssert( !pPg->inJ
20b00 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
20b10 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
20b20 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
20b30 3b 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ; */..  assert( 
20b40 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
20b50 61 6c 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  al!=0 );.  pPg->
20b60 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
20b70 4e 45 45 44 5f 52 45 41 44 3b 0a 0a 20 20 2f 2a  NEED_READ;..  /*
20b80 20 46 61 69 6c 75 72 65 20 74 6f 20 73 65 74 20   Failure to set 
20b90 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
20ba0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 2d 76 65  InJournal bit-ve
20bb0 63 74 6f 72 73 20 69 73 20 62 65 6e 69 67 6e 2e  ctors is benign.
20bc0 0a 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  .  ** It merely 
20bd0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 6d 69  means that we mi
20be0 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78 74 72  ght do some extr
20bf0 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72 6e 61  a work to journa
20c00 6c 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 74 68  l a page.  ** th
20c10 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
20c20 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64   to be journaled
20c30 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
20c40 20 62 65 20 73 75 72 65 20 74 6f 20 74 65 73 74   be sure to test
20c50 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65 20 77   the.  ** case w
20c60 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
20c70 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
20c80 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 61   trying to set a
20c90 20 62 69 74 20 69 6e 20 61 20 0a 20 20 2a 2a 20   bit in a .  ** 
20ca0 62 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 2a 2f  bit vector..  */
20cb0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
20cc0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
20cd0 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d 20   TESTONLY( rc = 
20ce0 29 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  ) sqlite3BitvecS
20cf0 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  et(pPager->pInJo
20d00 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
20d10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 72  );.  testcase( r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
20d30 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 72  );.  TESTONLY( r
20d40 63 20 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70  c = ) addToSavep
20d50 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
20d60 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
20d70 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
20d80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
20d90 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
20da0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 0a 20 20  gnMalloc();...  
20db0 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e  PAGERTRACE(("DON
20dc0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
20dd0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
20de0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
20df0 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
20e00 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
20e10 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
20e20 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a 0a   pPg->pgno)).}..
20e30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
20e40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
20e50 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
20e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
20e70 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
20e80 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
20e90 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
20ea0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
20eb0 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
20ec0 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
20ed0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69  r *pPager, int i
20ee0 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64  sDirect){.  PgHd
20ef0 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
20f00 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
20f10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20f20 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66 20  TE_OK;..#ifndef 
20f30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
20f40 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 61 73 73  OMIC_WRITE.  ass
20f50 65 72 74 28 20 69 73 44 69 72 65 63 74 3d 3d 30  ert( isDirect==0
20f60 20 29 3b 20 20 2f 2a 20 69 73 44 69 72 65 63 74   );  /* isDirect
20f70 20 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66 6f   is only true fo
20f80 72 20 61 74 6f 6d 69 63 20 77 72 69 74 65 73 20  r atomic writes 
20f90 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  */.#endif.  if( 
20fa0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
20fb0 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61 67  ountDone && pPag
20fc0 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
20fd0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
20fe0 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
20ff0 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
21000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
21010 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
21020 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
21030 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21040 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21050 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
21060 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
21070 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
21080 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
21090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
210a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
210b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
210c0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
210d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
210e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
210f0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
21100 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
21110 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
21120 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
21130 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
21140 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
21150 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
21160 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
21170 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
21180 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
21190 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
211a0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
211b0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
211c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
211d0 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
211e0 49 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69  ITE.    if( isDi
211f0 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e  rect && pPager->
21200 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
21210 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
21220 20 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d   *zBuf = pPgHdr-
21230 3e 70 44 61 74 61 3b 0a 20 20 20 20 20 20 61 73  >pData;.      as
21240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
21250 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
21260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21270 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
21280 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
21290 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
212a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
212b0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
212c0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
212d0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
212e0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
212f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
21300 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
21310 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
21320 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
21330 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
21340 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  e to disk..*/.in
21350 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
21360 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
21370 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
21380 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
21390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
213a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
213b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
213c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
213d0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
213e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
213f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
21400 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21410 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
21420 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
21430 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
21440 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
21450 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
21460 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
21470 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
21480 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
21490 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
214a0 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
214b0 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
214c0 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
214d0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
214e0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
214f0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
21500 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21510 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
21520 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
21530 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
21540 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
21550 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21560 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
21570 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
21580 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
21590 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
215a0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
215b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
215c0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
215d0 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
215e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
215f0 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
21600 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
21610 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
21620 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
21630 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
21640 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
21650 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
21660 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
21670 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
21680 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
21690 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
216a0 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
216b0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
216c0 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
216d0 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
216e0 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
216f0 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
21700 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
21710 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
21720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21730 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
21740 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
21750 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
21760 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
21770 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
21780 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21790 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
217a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
217b0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
217c0 7a 4d 61 73 74 65 72 2c 20 0a 20 20 69 6e 74 20  zMaster, .  int 
217d0 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e 74 20  noSync.){.  int 
217e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
217f0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
21800 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
21810 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
21820 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
21830 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68 61  If no changes ha
21840 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77 65  ve been made, we
21850 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20 74   can leave the t
21860 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c 79  ransaction early
21870 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
21880 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d  ger->dbModified=
21890 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70  =0 &&.        (p
218a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
218b0 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
218c0 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a  LMODE_DELETE ||.
218d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
218e0 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21  ->exclusiveMode!
218f0 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =0) ){.    asser
21900 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  t( pPager->dirty
21910 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67  Cache==0 || pPag
21920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
21930 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
21940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21950 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
21960 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
21970 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
21980 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a  s nSize=%d\n", .
21990 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
219a0 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
219b0 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
219c0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  ));..  /* If thi
219d0 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
219e0 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
219f0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
21a00 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
21a10 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
21a20 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
21a30 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
21a40 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
21a50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
21a60 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
21a70 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
21a80 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
21a90 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
21aa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21ab0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
21ac0 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  TE.    /* The at
21ad0 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
21ae0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
21af0 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  sed if all of th
21b00 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  e.    ** followi
21b10 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
21b20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20   **.    **    + 
21b30 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  The file-system 
21b40 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f  supports the ato
21b50 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
21b60 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20  ty for.    **   
21b70 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a     blocks of siz
21b80 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64  e page-size, and
21b90 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69  .    **    + Thi
21ba0 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
21bb0 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
21bc0 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
21bd0 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
21be0 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  + Exactly one pa
21bf0 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
21c00 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
21c10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
21c20 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
21c30 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
21c40 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
21c50 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  d, then the jour
21c60 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
21c70 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72  ver.    ** be cr
21c80 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
21c90 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
21ca0 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74  */.    int useAt
21cb0 6f 6d 69 63 57 72 69 74 65 3b 0a 20 20 20 20 70  omicWrite;.    p
21cc0 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
21cd0 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
21ce0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
21cf0 20 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65    useAtomicWrite
21d00 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d   = (.        !zM
21d10 61 73 74 65 72 20 26 26 20 0a 20 20 20 20 20 20  aster && .      
21d20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
21d30 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20  lOpen &&.       
21d40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21d50 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53  Off==jrnlBufferS
21d60 69 7a 65 28 70 50 61 67 65 72 29 20 26 26 20 0a  ize(pPager) && .
21d70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21d80 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
21d90 64 62 46 69 6c 65 53 69 7a 65 20 26 26 20 0a 20  dbFileSize && . 
21da0 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20 7c         (pPg==0 |
21db0 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d 30  | pPg->pDirty==0
21dc0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
21dd0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
21de0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
21df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
21e00 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
21e10 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
21e20 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
21e30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
21e40 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
21e50 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
21e60 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
21e70 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
21e80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
21e90 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
21ea0 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
21eb0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
21ec0 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
21ed0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
21ee0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
21ef0 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
21f00 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
21f10 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
21f20 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
21f30 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
21f40 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
21f50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
21f60 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
21f70 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
21f80 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
21f90 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
21fa0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
21fb0 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
21fc0 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
21fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
21fe0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
21ff0 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
22000 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
22010 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
22020 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
22030 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
22040 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
22050 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22070 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
22080 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
22090 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
220a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
220b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
220c0 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
220d0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
220e0 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
220f0 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
22100 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
22110 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
22120 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
22130 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
22140 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
22150 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
22160 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
22170 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
22180 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
22190 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
221a0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
221b0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
221c0 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
221d0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
221e0 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
221f0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
22200 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
22210 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
22220 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
22230 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
22240 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
22250 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
22260 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
22270 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
22280 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
22290 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
222a0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
222b0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
222c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
222d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
222e0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
222f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
22300 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
22310 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
22320 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
22330 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22340 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  UM.        if( p
22350 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50  Pager->dbSize<pP
22360 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
22370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
22380 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
22390 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
223a0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
223b0 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
223c0 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  es.          ** 
223d0 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20  being discarded 
223e0 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  by the truncatio
223f0 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65  n must be writte
22400 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
22410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
22420 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  le..          */
22430 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
22440 69 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  i;.          Pgn
22450 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
22460 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
22470 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
22480 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
22490 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  >dbSize;.       
224a0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
224b0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
224c0 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  igSize;.        
224d0 20 20 66 6f 72 28 20 69 3d 70 50 61 67 65 72 2d    for( i=pPager-
224e0 3e 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  >dbSize+1; i<=pP
224f0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
22500 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
22510 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
22520 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
22530 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
22540 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
22550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
22560 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22570 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
22580 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
22590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
225a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
225b0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
225c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
225d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
225e0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
225f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22600 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
22610 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22620 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
22630 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
22640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22650 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 20      } .         
22660 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
22670 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
22680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22690 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
226a0 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
226b0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
226c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
226d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
226e0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
226f0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
22700 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
22710 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
22720 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22730 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
22740 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
22750 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
22760 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
22770 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
22780 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
22790 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
227a0 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63  pPCache);.    rc
227b0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
227c0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
227d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
227e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
227f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
22800 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
22810 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72  .      /* The er
22820 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c  ror might have l
22830 65 66 74 20 74 68 65 20 64 69 72 74 79 20 6c 69  eft the dirty li
22840 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70  st all fouled up
22850 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20   here,.      ** 
22860 62 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  but that does no
22870 74 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65  t matter because
22880 20 69 66 20 74 68 65 20 69 66 20 74 68 65 20 64   if the if the d
22890 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20  irty list did.  
228a0 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75      ** get corru
228b0 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74  pted, then the t
228c0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
228d0 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20  roll back and.  
228e0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74      ** discard t
228f0 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20  he dirty list.  
22900 54 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 65  There is an asse
22910 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70  rt in.      ** p
22920 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
22930 74 79 5f 70 61 67 65 73 28 29 20 74 68 61 74 20  ty_pages() that 
22940 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f  verifies that no
22950 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a   attempt.      *
22960 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65  * is made to use
22970 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74   an invalid dirt
22980 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f  y list..      */
22990 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63  .      goto sync
229a0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
229b0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
229c0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
229d0 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 69 66  PCache);..    if
229e0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
229f0 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  <pPager->dbFileS
22a00 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
22a10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
22a20 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
22a30 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  IVE );.      rc 
22a40 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
22a50 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
22a60 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
22a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22a80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
22a90 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
22aa0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
22ab0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
22ac0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
22ad0 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
22ae0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22af0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
22b00 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
22b10 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
22b20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
22b30 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
22b40 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
22b50 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
22b60 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
22b70 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
22b80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
22b90 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
22ba0 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
22bb0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
22bc0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
22bd0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
22be0 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
22bf0 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
22c00 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
22c10 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
22c20 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
22c30 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
22c40 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
22c50 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
22c60 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
22c70 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
22c80 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
22c90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
22ca0 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
22cb0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
22cc0 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
22cd0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
22ce0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
22cf0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
22d00 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
22d10 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
22d20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
22d30 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
22d40 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
22d50 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
22d60 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
22d70 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
22d80 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
22d90 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
22da0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
22db0 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
22dc0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
22dd0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
22de0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
22df0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
22e00 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
22e10 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
22e20 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
22e30 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
22e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22e50 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22e60 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
22e70 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ied==0 &&.      
22e80 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e    (pPager->journ
22e90 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
22ea0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
22eb0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50   ||.          pP
22ec0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
22ed0 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  ode!=0) ){.    a
22ee0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
22ef0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
22f00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22f10 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  pen==0 );.    re
22f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22f30 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
22f40 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
22f50 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22f60 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
22f70 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
22f80 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
22f90 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
22fa0 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
22fb0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
22fc0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
22fd0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
22fe0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ter);.  rc = pag
22ff0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23000 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   rc);.  return r
23010 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
23020 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
23030 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
23040 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
23050 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
23060 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
23070 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
23080 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
23090 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
230a0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
230b0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
230c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
230d0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
230e0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
230f0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
23100 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
23110 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
23120 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
23130 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
23140 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
23150 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
23160 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23170 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
23180 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
23190 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
231a0 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
231b0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
231c0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
231d0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
231e0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
231f0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
23200 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
23210 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23220 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23230 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
23240 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
23250 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23260 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
23270 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
23280 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23290 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
232a0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
232b0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
232c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
232d0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
232e0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
232f0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
23300 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
23310 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
23320 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
23330 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
23340 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
23350 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
23360 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
23370 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
23380 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
23390 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
233a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
233b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
233c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
233d0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
233e0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
233f0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23400 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
23410 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
23420 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
23430 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
23440 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
23450 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
23460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23470 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
23480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
23490 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
234a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
234b0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
234c0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
234d0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
234e0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
234f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
23500 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
23510 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
23520 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
23530 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
23540 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
23550 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
23560 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
23570 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
23580 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
23590 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
235a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
235b0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
235c0 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
235d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
235e0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
235f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23600 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
23610 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
23620 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
23630 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
23640 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
23650 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
23660 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
23670 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23680 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
23690 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
236a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
236b0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
236c0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
236d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
236e0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
236f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
23700 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
23710 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
23720 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
23730 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
23740 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
23750 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
23760 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
23770 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
23780 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
23790 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
237a0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
237b0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
237c0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
237d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
237e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
237f0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
23800 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
23810 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
23820 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
23830 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
23840 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
23850 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
23860 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
23870 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
23880 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
23890 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
238a0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
238b0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
238c0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
238d0 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
238e0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
238f0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
23900 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
23910 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
23920 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
23930 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
23940 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
23950 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
23960 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
23970 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
23980 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
23990 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
239a0 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
239b0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
239c0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
239d0 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
239e0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
239f0 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
23a00 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
23a10 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23a20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
23a30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
23a40 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
23a50 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
23a60 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
23a70 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ts open..*/.int 
23a80 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
23a90 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
23aa0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
23ab0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
23ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23ad0 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
23ae0 74 3e 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t>pPager->nSavep
23af0 6f 69 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  oint && pPager->
23b00 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
23b10 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61    int ii;.    Pa
23b20 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
23b30 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68  ew;..    /* Eith
23b40 65 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  er the sub-journ
23b50 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 74 68  al is open or th
23b60 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
23b70 65 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 2a 2f  e savepoints. */
23b80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23b90 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
23ba0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a  =0 || pPager->sj
23bb0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
23bc0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
23bd0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
23be0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
23bf0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
23c00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
23c10 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
23c20 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
23c30 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
23c40 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
23c50 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
23c60 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
23c70 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
23c80 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
23c90 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
23ca0 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
23cb0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
23cc0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
23cd0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
23ce0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
23cf0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
23d00 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
23d10 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
23d20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
23d30 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23d40 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
23d50 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
23d60 5b 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  [pPager->nSavepo
23d70 69 6e 74 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  int], 0,.       
23d80 20 28 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 70   (nSavepoint - p
23d90 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
23da0 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65  t) * sizeof(Page
23db0 72 53 61 76 65 70 6f 69 6e 74 29 0a 20 20 20 20  rSavepoint).    
23dc0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
23dd0 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
23de0 3b 0a 20 20 20 20 69 69 20 3d 20 70 50 61 67 65  ;.    ii = pPage
23df0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  r->nSavepoint;. 
23e00 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
23e10 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
23e20 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
23e30 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
23e40 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
23e50 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
23e60 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 2f 2a  d. */.    for(/*
23e70 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53   no-op */; ii<nS
23e80 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
23e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23ea0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
23eb0 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
23ec0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
23ed0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
23ee0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
23ef0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
23f00 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23f10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
23f20 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
23f30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23f40 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
23f50 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
23f60 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
23f70 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
23f80 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
23f90 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
23fa0 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
23fb0 6d 74 4e 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  mtNRec;.      aN
23fc0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
23fd0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
23fe0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
23ff0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
24000 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
24010 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
24020 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24030 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24040 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24050 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
24060 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
24070 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
24080 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
24090 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
240a0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
240b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
240c0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
240d0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
240e0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
240f0 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
24100 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
24110 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
24120 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
24130 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
24140 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
24150 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
24160 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
24170 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
24180 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
24190 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
241a0 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
241b0 63 63 75 72 65 64 20 73 69 6e 63 65 20 73 61 76  ccured since sav
241c0 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
241d0 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
241e0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
241f0 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69  ase, all savepoi
24200 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65  nts with an inde
24210 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69  x greater than i
24220 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72  Savepoint .** ar
24230 65 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  e destroyed..**.
24240 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
24250 6c 65 73 73 20 74 68 61 6e 20 28 69 53 61 76 65  less than (iSave
24260 70 6f 69 6e 74 2b 31 29 20 61 63 74 69 76 65 20  point+1) active 
24270 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 6e 20  savepoints when 
24280 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
24290 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20 69  n is called it i
242a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69  s a no-op..*/ .i
242b0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
242c0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
242d0 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20  pPager, int op, 
242e0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
242f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24300 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
24310 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
24320 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
24330 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
24340 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
24350 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
24360 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
24370 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
24380 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69   nNew = iSavepoi
24390 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f  nt + (op==SAVEPO
243a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  INT_ROLLBACK);. 
243b0 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
243c0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
243d0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
243e0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
243f0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
24400 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
24410 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
24420 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
24430 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
24440 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 3d  ew;..    if( op=
24450 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
24460 41 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ACK && pPager->j
24470 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
24480 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
24490 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
244a0 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
244b0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
244c0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
244d0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
244e0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
244f0 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
24500 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24510 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
24520 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
24530 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
24540 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
24550 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
24560 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
24570 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
24580 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nal. */.    if( 
24590 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53  nNew==0 && op==S
245a0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
245b0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   && pPager->sjfd
245c0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
245d0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
245e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
245f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24600 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
24610 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->sjfd, 0);.    
24620 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
24630 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ec = 0;.    }.  
24640 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24650 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
24660 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
24670 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
24680 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
24690 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
246a0 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
246b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
246c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
246d0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
246e0 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
246f0 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
24700 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
24710 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
24720 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
24730 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24740 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
24750 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
24760 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
24770 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
24780 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
24790 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
247a0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
247b0 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
247c0 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
247d0 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
247e0 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
247f0 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
24800 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
24810 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
24820 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
24830 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24840 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
24850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24860 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
24870 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
24880 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
24890 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
248a0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
248b0 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
248c0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
248d0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
248e0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
248f0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
24900 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
24910 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
24920 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
24930 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
24940 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
24950 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
24960 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
24970 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
24980 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
24990 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
249a0 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
249b0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
249c0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
249d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
249e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
249f0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
24a00 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
24a10 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
24a20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
24a30 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
24a40 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
24a50 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
24a60 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
24a70 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
24a80 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
24a90 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
24aa0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
24ab0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
24ac0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
24ad0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
24ae0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
24af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24b00 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
24b10 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
24b20 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
24b30 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
24b40 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
24b50 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
24b60 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
24b70 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
24b80 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
24b90 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
24ba0 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
24bb0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
24bc0 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
24bd0 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
24be0 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
24bf0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
24c00 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
24c10 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
24c20 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
24c30 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
24c40 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
24c50 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
24c60 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
24c70 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
24c80 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
24c90 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
24ca0 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
24cb0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
24cc0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
24cd0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
24ce0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
24cf0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
24d00 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
24d10 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
24d20 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
24d30 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
24d40 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24d50 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
24d60 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
24d70 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
24d80 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
24d90 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
24da0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
24db0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
24dc0 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
24dd0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
24de0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
24df0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
24e00 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
24e10 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
24e20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
24e30 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
24e40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
24e50 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
24e60 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
24e70 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
24e80 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
24e90 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
24ea0 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
24eb0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
24ec0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
24ed0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
24ee0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
24ef0 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
24f00 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
24f10 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
24f20 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
24f30 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
24f40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24f50 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
24f60 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
24f70 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
24f80 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
24f90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
24fa0 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  d;  /* The page 
24fb0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
24fc0 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
24fd0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 20  dSyncPgno = 0;. 
24fe0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
24ff0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
25000 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
25010 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64  page being moved
25020 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61   is dirty and ha
25030 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64  s not been saved
25040 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20   by the latest. 
25050 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74   ** savepoint, t
25060 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72  hen save the cur
25070 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
25080 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
25090 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
250a0 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69  rnal now. This i
250b0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  s required to ha
250c0 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ndle the followi
250d0 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a  ng scenario:.  *
250e0 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a  *.  **   BEGIN;.
250f0 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
25100 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d  l page X, then m
25110 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f  odify it in memo
25120 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56  ry>.  **     SAV
25130 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a  EPOINT one;.  **
25140 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67         <Move pag
25150 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  e X to location 
25160 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  Y>.  **     ROLL
25170 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a  BACK TO one;.  *
25180 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58  *.  ** If page X
25190 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65   were not writte
251a0 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
251b0 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f  rnal here, it wo
251c0 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
251d0 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74  possible to rest
251e0 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ore its contents
251f0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
25200 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a  ACK TO one".  **
25210 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20   statement were 
25220 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
25230 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
25240 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20  &PGHDR_DIRTY .  
25250 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
25260 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
25270 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
25280 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
25290 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
252a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
252b0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
252c0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
252d0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
252e0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
252f0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
25300 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
25310 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25320 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
25330 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
25340 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
25350 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
25360 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
25370 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
25380 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f  ntent(pPg);..  /
25390 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
253a0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
253b0 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
253c0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
253d0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
253e0 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
253f0 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
25400 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
25410 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
25420 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
25430 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
25440 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
25450 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
25460 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
25470 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
25480 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
25490 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
254a0 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
254b0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
254c0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
254d0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
254e0 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
254f0 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
25500 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
25510 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
25520 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
25530 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
25540 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
25550 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
25560 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
25570 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
25580 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
25590 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
255a0 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
255b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
255c0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
255d0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
255e0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
255f0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
25600 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
25610 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
25620 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
25630 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
25640 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
25650 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
25660 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
25670 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
25680 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
25690 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
256a0 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
256b0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
256c0 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
256d0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
256e0 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
256f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
25700 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
25710 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
25720 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
25730 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
25740 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
25750 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
25760 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
25770 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  NC);.  }..  sqli
25780 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
25790 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  g, pgno);.  if( 
257a0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71  pPgOld ){.    sq
257b0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
257c0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
257d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
257e0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
257f0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
25800 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  e = 1;.  pPager-
25810 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
25820 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
25830 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
25840 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
25850 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
25860 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25870 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
25880 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
25890 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
258a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
258b0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
258c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
258d0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
258e0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
258f0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
25900 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
25910 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
25920 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
25930 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
25940 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
25950 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
25960 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
25970 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
25980 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
25990 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
259a0 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
259b0 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
259c0 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
259d0 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
259e0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
259f0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
25a00 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
25a10 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
25a20 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
25a30 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
25a40 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
25a50 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
25a60 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
25a70 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
25a80 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
25a90 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
25aa0 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
25ab0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
25ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
25ad0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
25ae0 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
25af0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
25b00 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
25b10 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
25b20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
25b30 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
25b40 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
25b50 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
25b60 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
25b70 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
25b80 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
25b90 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
25ba0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
25bb0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
25bc0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
25bd0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
25be0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
25bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
25c00 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
25c10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25c20 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
25c30 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
25c40 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
25c50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25c60 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
25c70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
25c80 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  & needSyncPgno<=
25c90 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
25ca0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ze ){.        sq
25cb0 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
25cc0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
25cd0 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
25ce0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
25cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25d00 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
25d10 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
25d20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25d30 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d  >noSync==0 && !M
25d40 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48  EMDB );.    pPgH
25d50 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  dr->flags |= PGH
25d60 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
25d70 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
25d80 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
25d90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
25da0 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
25db0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
25dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
25dd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
25de0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
25df0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
25e00 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
25e10 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
25e20 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
25e30 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
25e40 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
25e50 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
25e60 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
25e70 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
25e80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
25e90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
25ea0 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
25eb0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
25ec0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
25ed0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
25ee0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
25ef0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
25f00 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
25f10 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
25f20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
25f30 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
25f40 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d  urn (pPager?pPg-
25f50 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f  >pExtra:0);.}../
25f60 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
25f70 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
25f80 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
25f90 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
25fa0 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
25fb0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
25fc0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
25fd0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
25fe0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
25ff0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
26000 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
26010 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
26020 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
26030 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
26040 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
26050 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
26060 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
26070 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
26080 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26090 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
260a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
260b0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
260c0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
260d0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
260e0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
260f0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
26100 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
26110 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
26120 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
26130 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
26140 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
26150 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
26160 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
26170 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
26180 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
26190 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
261a0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
261b0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
261c0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
261d0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
261e0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
261f0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26200 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
26210 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26220 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
26230 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
26240 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
26250 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
26260 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
26270 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
26280 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
26290 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
262a0 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
262b0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
262c0 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
262d0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
262e0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
262f0 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
26300 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
26310 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20  MODE_QUERY.**   
26320 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26330 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
26340 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26350 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
26360 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26370 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
26380 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26390 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20  DE_OFF.**.** If 
263a0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
263b0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
263c0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
263d0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
263e0 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66  .** value specif
263f0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
26400 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65  eturned indicate
26410 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
26420 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
26430 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  ** journal-mode.
26440 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
26450 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
26460 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
26470 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28  nt eMode){.  if(
26480 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61   !MEMDB ){.    a
26490 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
264a0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
264b0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
264c0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
264d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
264e0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
264f0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
26500 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26510 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
26520 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
26530 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
26540 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
26550 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
26560 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26570 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
26580 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
26590 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
265a0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
265b0 20 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52     assert( PAGER
265c0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
265d0 52 59 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  RY<0 );.    if( 
265e0 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20  eMode>=0 ){.    
265f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
26600 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
26610 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
26620 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
26630 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
26640 4d 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20  MODE_QUERY );.  
26650 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
26660 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
26670 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
26680 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
26690 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
266a0 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
266b0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
266c0 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
266d0 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
266e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
266f0 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
26700 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
26710 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
26720 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
26730 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
26740 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
26750 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
26760 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
26770 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
26780 2a 2f 0a                                         */.