/ Hex Artifact Content
Login

Artifact ce4a0a0f10ebfd8b2f70a5edf5af30d233ab8ce7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 36  : pager.c,v 1.56
0350: 35 20 32 30 30 39 2f 30 32 2f 30 34 20 31 30 3a  5 2009/02/04 10:
0360: 30 39 3a 30 34 20 64 61 6e 69 65 6c 6b 31 39 37  09:04 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
1330: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
1340: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
1350: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
1360: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
1370: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1380: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
13a0: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13b0: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
13c0: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
13d0: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
13e0: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
13f0: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1400: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1410: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
1420: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
1450: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
1460: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1480: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1490: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
14a0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
14b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
14c0: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
14d0: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
14e0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
14f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1500: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1510: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
1520: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1530: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
1540: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
1550: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
1560: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
1570: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1580: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1590: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
15a0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
15b0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
15c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
15f0: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1600: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1610: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1620: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
1630: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1640: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
1650: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
1660: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
1670: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1680: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1690: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
16a0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
16b0: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
16c0: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
16d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
16e0: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
16f0: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1700: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1710: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
1720: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
1730: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
1760: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
1770: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1780: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1790: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
17a0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
17b0: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
17c0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
17d0: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
17e0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
17f0: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1810: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
1820: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
1830: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1850: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
1860: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
1870: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1880: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1890: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
18a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
18c0: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
18d0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
18e0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18f0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1910: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
1920: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
1930: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
1940: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
1950: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
1960: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
1970: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1980: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1990: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
19a0: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
19b0: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
19c0: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
19d0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
19e0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
19f0: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1a00: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1a10: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
1a20: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
1a30: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
1a40: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
1a50: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
1a60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1a70: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a80: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a90: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1aa0: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1ab0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1ac0: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1ad0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1ae0: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1af0: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1b00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b10: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1b20: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1b30: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1b40: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1b50: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1b60: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1b70: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b80: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b90: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1ba0: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1bb0: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1bc0: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1bd0: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1be0: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1bf0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1c00: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1c10: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1c20: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1c30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c40: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1c50: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1c60: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1c70: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c80: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c90: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1ca0: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1cb0: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1cc0: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1cd0: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1ce0: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1cf0: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1d00: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1d10: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1d20: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1d30: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1d40: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1d50: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1d60: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d90: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1da0: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1db0: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1dc0: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1dd0: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1df0: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1e00: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1e10: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1e20: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1e30: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1e40: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1e50: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1e60: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1e70: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e80: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e90: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1ea0: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1eb0: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1ec0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1ed0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ee0: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1ef0: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1f00: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1f10: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1f20: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1f30: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1f40: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1f50: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1f60: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1f70: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f80: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f90: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1fa0: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1fb0: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1fc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1fd0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1fe0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1ff0: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
2000: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
2010: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
2020: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
2030: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
2040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2050: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
2060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2070: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2080: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2090: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
20a0: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
20b0: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
20c0: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
20d0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
20e0: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
20f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2100: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2110: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
2120: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
2130: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
2140: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
2150: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
2160: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
2170: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2180: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2190: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
21a0: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
21c0: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
21d0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
21e0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
21f0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2200: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2210: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
2220: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
2230: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
2240: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
2250: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
2260: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
2270: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2280: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2290: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
22a0: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
22b0: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
22c0: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
22d0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
22e0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
22f0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2300: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2310: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
2320: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
2330: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
2340: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
2350: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
2360: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
2370: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2380: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2390: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
23a0: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
23b0: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
23c0: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
23d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
23e0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
23f0: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2400: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2410: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
2420: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
2430: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
2440: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
2450: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
2460: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
2470: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2480: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2490: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
24a0: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
24b0: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
24c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
24d0: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
24e0: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
24f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2500: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2510: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
2520: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2530: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
2540: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
2550: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
2560: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
2570: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2580: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2590: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
25a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25b0: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
25c0: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
25d0: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
25e0: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
25f0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2600: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2610: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
2620: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
2630: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
2640: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
2650: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
2660: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
2670: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2680: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2690: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
26a0: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
26b0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
26c0: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
26d0: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
26e0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
26f0: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2700: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2710: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
2720: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
2730: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
2740: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2760: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
2770: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2780: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2790: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
27a0: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
27b0: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
27c0: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
27d0: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
27e0: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
27f0: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2800: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2810: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
2820: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
2830: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
2840: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
2850: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
2860: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
2870: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2880: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2890: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28a0: 75 72 6e 61 6c 22 2e 0a 2a 2f 0a 73 74 72 75 63  urnal"..*/.struc
28b0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28c0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
28e0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
28f0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2900: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2910: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2920: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2930: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2940: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2950: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2960: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2970: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2980: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
2990: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29c0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29d0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
29e0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
29f0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a00: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a10: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a20: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a40: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a50: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a60: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2a90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2aa0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ab0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ac0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2ad0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2ae0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2af0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b00: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b10: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b20: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b30: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b40: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b60: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b70: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2b80: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ba0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bb0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2bc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bd0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2be0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2bf0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c00: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c10: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c20: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c30: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c40: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c50: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c60: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c70: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2c80: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2c90: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2ca0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2cc0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cd0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2ce0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2cf0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d00: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d10: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d20: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d30: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d40: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d50: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d60: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d70: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2d80: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2d90: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2da0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2db0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2dc0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2dd0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2de0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2df0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e00: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e20: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e30: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e40: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e50: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e70: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2e80: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2e90: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ea0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2eb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ec0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ed0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2ee0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2ef0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f10: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f20: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2f80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fc0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2fd0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
2fe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2ff0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3000: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3010: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3020: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3040: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3050: 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  rrect */.  Pgno 
3060: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
3070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3080: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3090: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
30a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
30c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
30d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
30f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
3100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3120: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3130: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3150: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
3160: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
3170: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
31a0: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
31b0: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
31c0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
31d0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
31e0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
31f0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
3200: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
3210: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3240: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
3250: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
3260: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
3270: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
3280: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3290: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
32a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
32b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
32c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
32d0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
32e0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
32f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3300: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
3310: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3320: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
3330: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
3340: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
3350: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3360: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
3370: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
3380: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
3390: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33a0: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
33b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
33c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
33d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
33e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
33f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
3400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
3410: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
3420: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
3430: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
3440: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
3450: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
3460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3470: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3480: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
3490: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
34a0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
34b0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
34c0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
34d0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
34e0: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
34f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3500: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3510: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3520: 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74  llback */..  int
3530: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
3540: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
3550: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
3560: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
3570: 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  y page */.  u32 
3580: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
3590: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
35a0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
35b0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
35c0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
35f0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
3600: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
3610: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3620: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
3630: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3640: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3650: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3660: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3680: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3690: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
36a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
36b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
36c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
36d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
36e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
36f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
3700: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
3710: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
3720: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
3730: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
3740: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3750: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3760: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
3770: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3780: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
3790: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
37a0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
37b0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
37c0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
37d0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
37e0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
37f0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
3800: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3810: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
3820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3830: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
3840: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
3850: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3860: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3870: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3880: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3890: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
38a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
38b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
38c0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  () */.#endif.  c
38d0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
38e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
38f0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
3900: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
3910: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34  tmp use */.  i64
3920: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
3930: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
3940: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
3950: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
3960: 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  les */.  PCache 
3970: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
3980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3990: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
39a0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
39b0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
39c0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
39d0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
39e0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
39f0: 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sses */.};../*.*
3a00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3a10: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3a20: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
3a30: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
3a40: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
3a50: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
3a60: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
3a70: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
3a80: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
3a90: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
3aa0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
3ab0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3ac0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3b00: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
3b10: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b20: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
3b30: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
3b40: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3b50: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3b60: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b70: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
3b80: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3b90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3ba0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
3bb0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
3bc0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
3bd0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3be0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
3bf0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
3c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
3c10: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
3c20: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
3c30: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
3c40: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
3c50: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
3c60: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3c70: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3c80: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3c90: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3ca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3cb0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3cc0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3cd0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3ce0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3cf0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
3d10: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
3d20: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
3d30: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
3d40: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
3d50: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
3d60: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3d70: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3d80: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3d90: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3da0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3dc0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3dd0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3de0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3df0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3e00: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3e10: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3e20: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3e30: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3e40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3e50: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e60: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
3e70: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3e80: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3e90: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3ea0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3eb0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3ec0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3ed0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3ee0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3ef0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3f00: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3f10: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
3f20: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
3f30: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
3f40: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
3f50: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3f60: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3f70: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3f80: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3f90: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3fa0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3fb0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3fc0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3fd0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3fe0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3ff0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
4000: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
4010: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
4020: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
4030: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
4040: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
4050: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
4060: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
4070: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
4080: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
4090: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
40a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
40b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
40c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
40d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
40e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
40f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
4100: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
4110: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
4120: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
4130: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
4140: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
4150: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
4160: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
4170: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
4180: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
4190: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
41a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
41b0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
41c0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
41d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
41e0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
41f0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4200: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4210: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4220: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
4230: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
4240: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
4250: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
4260: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
4270: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
4280: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
4290: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
42a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
42b0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
42c0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
42d0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
42e0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
42f0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4300: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4310: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4320: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4330: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4340: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4350: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4360: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4370: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4380: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4390: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
43a0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
43b0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
43c0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
43d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
43e0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
43f0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4400: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4410: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4420: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4430: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4440: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4450: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4460: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4470: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4480: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
4490: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
44a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
44b0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
44c0: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
44d0: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
44e0: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
44f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
4500: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
4510: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
4520: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
4530: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
4540: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
4550: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
4560: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
4570: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
4580: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
4590: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
45a0: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
45b0: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
45c0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
45d0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
45e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
45f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
4600: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
4610: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4620: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
4630: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
4640: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
4650: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
4660: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
4670: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
4680: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
4690: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
46a0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
46b0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
46c0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
46d0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
46e0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
46f0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
4700: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
4710: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
4720: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
4730: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4740: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
4750: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
4760: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
4770: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
4780: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
4790: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
47a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
47b0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
47c0: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
47d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
47e0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
47f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4800: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
4810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
4820: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
4830: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
4840: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
4850: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
4860: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
4870: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
4880: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
4890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
48a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
48b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
48c0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
48d0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
48e0: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
48f0: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
4900: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
4910: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
4920: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4930: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
4940: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
4950: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
4960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4970: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4980: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
4990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
49a0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
49b0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
49c0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
49d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
49e0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
49f0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
4a00: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4a10: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4a20: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
4a30: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
4a40: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
4a50: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
4a60: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
4a70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4a80: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4a90: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4aa0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4ab0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4ac0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4ad0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
4ae0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
4af0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4b00: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
4b10: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
4b20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b50: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b60: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b70: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b80: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
4b90: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
4ba0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
4bb0: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
4bc0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4bd0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4be0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4bf0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4c00: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4c10: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4c20: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4c30: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4c40: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4c50: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
4c60: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
4c70: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4c80: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4c90: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4ca0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4cb0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4cc0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
4cd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
4ce0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
4cf0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
4d00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
4d10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
4d20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
4d30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
4d40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
4d50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
4d60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
4d70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
4d80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
4d90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
4da0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
4db0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
4dc0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
4dd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
4de0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
4df0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
4e00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
4e10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
4e20: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
4e30: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
4e40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
4e50: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
4e60: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
4e70: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
4e80: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
4e90: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
4ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4eb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
4ec0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
4ed0: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
4ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
4ef0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
4f00: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
4f10: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
4f20: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
4f30: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
4f40: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
4f50: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
4f60: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
4f70: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
4f80: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
4f90: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
4fa0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
4fb0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
4fc0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
4fd0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
4fe0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
4ff0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
5000: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
5010: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
5020: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5030: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
5040: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
5050: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
5060: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
5070: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
5080: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
5090: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
50a0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
50b0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
50c0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
50d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
50e0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
50f0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
5100: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
5110: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
5120: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
5130: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
5140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5150: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
5160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5170: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
5180: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
5190: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
51a0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
51b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
51c0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
51d0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
51e0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
51f0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
5200: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
5210: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
5220: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
5230: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5250: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
5260: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
5270: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
52a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
52b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
52c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
52d0: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
52e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
52f0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
5300: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
5310: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
5320: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
5330: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
5340: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5350: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
5360: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5370: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
5380: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5390: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
53a0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
53b0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
53c0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
53d0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
53e0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
53f0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
5400: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
5410: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
5420: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
5430: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
5440: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5450: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
5460: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
5470: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
5480: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5490: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
54a0: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
54b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
54c0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
54d0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
54e0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
54f0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
5500: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
5510: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
5520: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5530: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
5540: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
5550: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
5560: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
5570: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
5580: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
5590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
55a0: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
55b0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
55c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
55d0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
55e0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
55f0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
5600: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
5610: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
5620: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
5630: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
5640: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
5650: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
5660: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
5670: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
5680: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
5690: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
56a0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
56b0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
56c0: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
56d0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
56e0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
56f0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5700: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
5710: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
5720: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
5730: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
5740: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
5750: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
5760: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5770: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5780: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5790: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
57a0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
57b0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
57c0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
57d0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
57e0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
57f0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5800: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
5810: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
5820: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
5830: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
5840: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
5850: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5860: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
5870: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
5880: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
5890: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
58a0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
58b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
58c0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
58d0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
58e0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
58f0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
5900: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
5910: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
5920: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
5930: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5940: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5950: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5960: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5970: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
5980: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
5990: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
59a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
59b0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
59c0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
59d0: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
59e0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
59f0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
5a00: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
5a10: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
5a20: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
5a30: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
5a40: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
5a50: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
5a60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5a70: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
5a80: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
5a90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
5aa0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
5ab0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
5ac0: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
5ad0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
5ae0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
5af0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
5b00: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
5b10: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
5b20: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
5b30: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
5b40: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
5b50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
5b60: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
5b70: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
5b90: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
5ba0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
5bb0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
5bc0: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
5bd0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
5be0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
5bf0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
5c00: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
5c10: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
5c20: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
5c30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c40: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
5c50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5c60: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
5c70: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
5c80: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5c90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
5ca0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
5cb0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
5cc0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
5cd0: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
5ce0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
5cf0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
5d00: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
5d10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
5d20: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
5d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5d40: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
5d50: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5d60: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
5d70: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
5d80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
5d90: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
5da0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
5db0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
5dc0: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
5dd0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5df0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5e00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5e10: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
5e20: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
5e30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
5e60: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e80: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
5e90: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
5ea0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
5eb0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
5ed0: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
5ee0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
5ef0: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
5f00: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
5f10: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
5f20: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
5f30: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
5f40: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f60: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
5f70: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
5f80: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5f90: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
5fa0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
5fb0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
5fc0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
5fd0: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
5fe0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
5ff0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
6000: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
6010: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
6020: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
6030: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
6040: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
6050: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
6060: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
6070: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
6080: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
6090: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
60a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
60b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
60c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
60d0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
60e0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
60f0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6100: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
6110: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
6120: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
6130: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
6140: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
6150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6160: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
6170: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
6180: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
6190: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
61a0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
61b0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
61c0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
61d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
61e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
61f0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
6200: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
6210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
6220: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
6230: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
6240: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
6250: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
6260: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
6270: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
6280: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
6290: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
62a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
62b0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
62c0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
62d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
62e0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
62f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
6300: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
6310: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
6320: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6330: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6340: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
6350: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
6360: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
6370: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
6380: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
6390: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
63a0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
63b0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
63c0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
63d0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
63e0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
63f0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
6400: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
6410: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
6420: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
64c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
64d0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
64e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
64f0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
6500: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6510: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
6520: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
6530: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6540: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
6550: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
6580: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6590: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
65a0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
65b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
65c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
65d0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
65e0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
65f0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
6600: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
6610: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
6620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6630: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
6640: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
6650: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6660: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
6670: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
6680: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
6690: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
66a0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
66b0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
66c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
66d0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
66e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
66f0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
6700: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
6710: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
6720: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
6730: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
6740: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
6750: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
6760: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
6770: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
6780: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
6790: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
67a0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
67b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
67c0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
67d0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
67e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
67f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
6800: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
6810: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
6820: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
6830: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
6840: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
6850: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
6860: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
6870: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
6880: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
6890: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
68a0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
68b0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
68c0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
68d0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
68e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
68f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
6900: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
6910: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
6920: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
6930: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
6940: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
6950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
6960: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
6970: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
6980: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6990: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
69a0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
69b0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
69c0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
69d0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
69e0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
69f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a00: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6a10: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
6a20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
6a30: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
6a40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6a50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6a80: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
6a90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
6aa0: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
6ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6ac0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
6ad0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
6ae0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
6af0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
6b00: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
6b10: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
6b20: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
6b30: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
6b40: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
6b50: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6b70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6b80: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
6b90: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
6ba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
6bb0: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
6bc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6bd0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
6be0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
6bf0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
6c00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
6c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c20: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
6c30: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
6c40: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
6c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
6c60: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
6c70: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
6c80: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
6c90: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
6ca0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
6cb0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
6cc0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
6cd0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
6ce0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
6cf0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
6d00: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
6d10: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
6d20: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
6d30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
6d40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6d50: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
6d60: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
6d70: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
6d80: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
6d90: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
6da0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
6db0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
6dc0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
6dd0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6de0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6df0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6e00: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
6e10: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6e30: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
6e40: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
6e50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6e60: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
6e70: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
6e80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6e90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
6ea0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
6eb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6ed0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
6ee0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
6ef0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
6f00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
6f10: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
6f20: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
6f30: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
6f40: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
6f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
6f60: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
6f70: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
6f80: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
6f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6fa0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
6fb0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
6fc0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
6fd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
6fe0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
6ff0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
7000: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
7010: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
7020: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
7030: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
7040: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
7050: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
7060: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
7070: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
7080: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
7090: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
70a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
70b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
70c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
70d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
70e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
70f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7100: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
7110: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
7120: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
7130: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
7140: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
7150: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
7160: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7180: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7190: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
71a0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
71b0: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
71c0: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
71d0: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
71e0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
71f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7200: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
7210: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
7220: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
7230: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7260: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
7270: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
7280: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
72b0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
72c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
72d0: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
72e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
72f0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
7300: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
7310: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7320: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
7330: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
7340: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7350: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
7360: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
7370: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
7380: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
7390: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
73a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
73b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
73c0: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
73d0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
73e0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
73f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
7400: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
7410: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
7420: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
7430: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7440: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
7450: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
7460: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
7470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
7480: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
7490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
74a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
74b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
74c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
74d0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
74e0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
74f0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
7500: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
7510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7520: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
7530: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
7540: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
7550: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
7560: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
7570: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
7580: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
7590: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
75a0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
75b0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
75c0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
75d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
75e0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
75f0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7600: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7610: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7620: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7630: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
7640: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
7650: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
7660: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
7670: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
7680: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
7690: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
76a0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
76b0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
76c0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
76d0: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
76e0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
76f0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7700: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7710: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7720: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7730: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
7740: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
7750: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
7760: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
7770: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
7780: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
7790: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
77a0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
77b0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
77c0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
77d0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
77e0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
77f0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
7800: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
7810: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7820: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
7830: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
7840: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
7850: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
7860: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
7870: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
7880: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
7890: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
78a0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
78b0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
78c0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
78d0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
78e0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
78f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
7900: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
7910: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7920: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
7930: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
7940: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
7950: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
7960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
7970: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
7980: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
7990: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
79a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
79b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
79c0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
79d0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
79e0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
79f0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a10: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
7a20: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
7a30: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7a40: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7a50: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
7a60: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
7a70: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
7a80: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
7a90: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
7aa0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
7ab0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
7ac0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
7ad0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7ae0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7af0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
7b00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7b10: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
7b20: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
7b30: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7b40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7b50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
7b60: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
7b70: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7b80: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7b90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7ba0: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
7bb0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7bc0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7bd0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
7be0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
7bf0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7c00: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7c10: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7c20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7c30: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
7c40: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
7c50: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
7c60: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
7c70: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
7c80: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
7c90: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
7ca0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
7cb0: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
7cc0: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
7cd0: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
7ce0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
7cf0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
7d00: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
7d10: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
7d20: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
7d30: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
7d40: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
7d50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7d60: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
7d70: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
7d80: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
7d90: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
7da0: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
7db0: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
7dc0: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
7dd0: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
7de0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
7df0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
7e00: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
7e10: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
7e20: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
7e30: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
7e40: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
7e50: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
7e60: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
7e70: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
7e80: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
7e90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
7ea0: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
7eb0: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
7ec0: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
7ed0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
7ee0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
7ef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
7f00: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
7f10: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
7f20: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
7f30: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
7f40: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
7f50: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
7f60: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
7f70: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
7f80: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
7f90: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
7fa0: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
7fb0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
7fc0: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
7fd0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7fe0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
7ff0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
8000: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
8010: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
8020: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
8030: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
8040: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
8050: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
8060: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
8070: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
8080: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
8090: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
80a0: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
80b0: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
80c0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
80d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
80e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
80f0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
8100: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
8110: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
8120: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
8130: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
8140: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
8150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
8160: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
8170: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
8180: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
8190: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
81a0: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
81b0: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
81c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
81d0: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
81e0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
81f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
8200: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
8210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8220: 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  f);.    pPager->
8230: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
8240: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
8250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8260: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
8270: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8280: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
8290: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
82a0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
82b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
82c0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
82d0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
82e0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
82f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
8300: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8310: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
8320: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
8330: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
8340: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
8350: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
8360: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
8370: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
8380: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
8390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
83a0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
83b0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
83c0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
83d0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
83e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
83f0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
8400: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
8410: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
8420: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
8430: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
8440: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
8450: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
8460: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
8470: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
8480: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
8490: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
84a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
84b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
84c0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
84d0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
84e0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
84f0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
8500: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
8510: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
8520: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
8530: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
8540: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
8550: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
8560: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
8570: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
8580: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
8590: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
85a0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
85b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
85c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85d0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
85e0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8600: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
8610: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8620: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8630: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8640: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8650: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8660: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8680: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8690: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
86a0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
86b0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
86c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
86d0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
86e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
86f0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8700: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8710: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8720: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8730: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8740: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8750: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8760: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8770: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
87a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
87b0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
87c0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
87d0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
87e0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
87f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8800: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8810: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8820: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8830: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8840: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8850: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8860: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8870: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8880: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8890: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
88a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
88b0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
88c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
88d0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
88e0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
88f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8900: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8910: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8920: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8930: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8940: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8960: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8970: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8980: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8990: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
89a0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
89b0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
89c0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
89d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
89e0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
89f0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8a00: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8a10: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8a20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8a30: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8a40: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8a50: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8a60: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8a70: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8a80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8a90: 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66 28 20  iHdrOff);.  if( 
8aa0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8ab0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d   rc;.  }.  if( m
8ac0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8ad0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8ae0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8af0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
8b10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8b20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8b30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8b40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8b50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8b60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8b70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8b80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8b90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8ba0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8bb0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8bc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8bd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8be0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8c10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8c20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8c30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8c60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8c70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8c80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ca0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8cb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8cc0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8cd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ce0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8cf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8d00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8d20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8d30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8d40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8d50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8d60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8d70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8d80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8d90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8da0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8db0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8dc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8dd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8de0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8df0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8e00: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8e10: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8e20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8e30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8e40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8e50: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
8e60: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
8e70: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e80: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8ea0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
8eb0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
8ec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8ed0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8ee0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
8ef0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
8f00: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
8f10: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
8f20: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
8f30: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
8f40: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
8f50: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
8f60: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
8f70: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
8f80: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8f90: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
8fa0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
8fb0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
8fc0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
8fd0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
8fe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ff0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9010: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9020: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9030: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9040: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9050: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9060: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9070: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9080: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9090: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
90a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
90b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
90c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
90d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
90e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
90f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9100: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9110: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9120: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9130: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9140: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9150: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9160: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9170: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9180: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9190: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
91a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
91b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
91c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
91d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
91e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
91f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9200: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9210: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9220: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9230: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9240: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9250: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9260: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9270: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9280: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9290: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
92a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
92b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
92c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
92d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
92e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
92f0: 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20 20 20  PageSize16);.   
9300: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
9310: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9320: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9330: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
9340: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
9350: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
9360: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
9370: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
9380: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
9390: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
93a0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
93b0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
93c0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
93d0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
93e0: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
93f0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
9400: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
9410: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
9420: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
9430: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
9440: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
9450: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
9460: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
9470: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
9480: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
9490: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
94a0: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
94b0: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
94c0: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
94d0: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
94e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
94f0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9500: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
9510: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
9520: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
9530: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
9540: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
9550: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
9560: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
9570: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
9580: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
9590: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
95a0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
95b0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
95c0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
95d0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
95e0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
95f0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
9600: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
9610: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
9620: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
9630: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
9640: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
9650: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
9660: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
9670: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
9680: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
9690: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
96a0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
96b0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
96c0: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
96d0: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
96e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96f0: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
9700: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
9710: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
9720: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
9730: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
9740: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
9750: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
9770: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
9780: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
9790: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
97a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
97b0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
97c0: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
97d0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
97e0: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
97f0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
9800: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
9810: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
9820: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
9830: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
9840: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
9850: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
9860: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
9870: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
9880: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
9890: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
98a0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
98d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
98e0: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
9910: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9920: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
9950: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
9960: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
9970: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9990: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
99a0: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
99b0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
99e0: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
99f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   */..  if( !zMas
9a00: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
9a10: 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70  etMaster.   || p
9a20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9a40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9a50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9a60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9a80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9aa0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9ab0: 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
9ac0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9ad0: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9ae0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
9af0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
9b00: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
9b20: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
9b30: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
9b40: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
9b50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
9b60: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
9b70: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
9b80: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
9b90: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
9ba0: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
9bb0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
9bc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9bd0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
9be0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
9bf0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
9c00: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
9c10: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
9c20: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
9c30: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9c40: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
9c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
9c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
9c80: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9ca0: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
9cb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9cc0: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
9cd0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9ce0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
9cf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9d00: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9d10: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
9d20: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
9d30: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9d40: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9d50: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
9d60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9d70: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
9d80: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
9d90: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9da0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
9db0: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
9dc0: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
9dd0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9de0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9df0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
9e00: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
9e10: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9e20: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9e30: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9e40: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
9e50: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
9e60: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
9e70: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9e80: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
9e90: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
9ea0: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
9eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9ec0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9ed0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
9ee0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
9ef0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9f00: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
9f10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9f20: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
9f30: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
9f40: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
9f50: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
9f60: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
9f70: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
9f80: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
9f90: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
9fa0: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
9fb0: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
9fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
9fd0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
9fe0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
9ff0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
a000: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
a010: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
a020: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
a030: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
a040: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
a050: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
a060: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
a070: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
a080: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
a090: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
a0a0: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
a0b0: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
a0c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
a0d0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
a0e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
a0f0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
a100: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
a110: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a120: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
a130: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
a140: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
a150: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
a160: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a170: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a180: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a1a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
a1c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
a1d0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
a1e0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
a1f0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
a200: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
a210: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
a220: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
a230: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
a240: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
a250: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
a260: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
a270: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
a280: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a2b0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
a2c0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
a2d0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
a2e0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
a2f0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
a300: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
a310: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
a320: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
a330: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
a340: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
a350: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
a360: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
a370: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
a380: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
a390: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
a3a0: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
a3b0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a3c0: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
a3d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
a3e0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
a3f0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a400: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
a410: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
a420: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
a430: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
a440: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
a450: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
a460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a470: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
a480: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
a490: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
a4a0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
a4b0: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
a4c0: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
a4d0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
a4e0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
a4f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
a510: 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
a520: 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
a530: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
a540: 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
a550: 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
a560: 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
a570: 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
a580: 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
a590: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
a5a0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
a5b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
a5c0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
a5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a5e0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
a5f0: 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
a600: 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a620: 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
a630: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
a640: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
a650: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a660: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
a670: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
a680: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
a690: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
a6a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
a6b0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
a6c0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a6d0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a6e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a6f0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
a700: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a710: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
a720: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
a730: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
a740: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
a750: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a760: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
a770: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
a780: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
a790: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
a7a0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
a7b0: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
a7c0: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
a7d0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
a7f0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
a800: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
a810: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
a820: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
a830: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
a840: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
a850: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a860: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
a870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a880: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a890: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
a8a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
a8b0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
a8c0: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
a8d0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
a8e0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
a8f0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
a900: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
a910: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
a920: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
a930: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
a940: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
a950: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
a960: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
a970: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a980: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a990: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a9b0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
a9c0: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
a9d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a9e0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
a9f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
aa00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
aa10: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
aa20: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
aa30: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
aa40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
aa50: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
aa60: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
aa70: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
aa80: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
aa90: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
aaa0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
aab0: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
aac0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
aad0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
aae0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
aaf0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
ab00: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
ab10: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
ab20: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
ab30: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ab40: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
ab50: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
ab60: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
ab70: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
ab80: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
ab90: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
aba0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
abb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
abc0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
abd0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ac00: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
ac10: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
ac20: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
ac30: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
ac40: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
ac50: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
ac60: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
ac70: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
ac80: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
ac90: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
aca0: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
acb0: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
acc0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
acd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ace0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
acf0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ad00: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ad10: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ad20: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
ad30: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
ad40: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
ad50: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
ad60: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
ad70: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
ad80: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
ad90: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
ada0: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
adb0: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
adc0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
add0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
ade0: 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c  pens. TODO: Real
adf0: 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  ly, this doesn't
ae00: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
ae10: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
ae20: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
ae30: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
ae40: 69 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  in pagerSharedLo
ae50: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
ae60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
ae70: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72  alid = 0;..    r
ae80: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
ae90: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
aea0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
aeb0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
aec0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
aed0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
aee0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
aef0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
af00: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
af10: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
af20: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
af30: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
af40: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
af50: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
af60: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
af70: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
af80: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
af90: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
afa0: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
afb0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
afc0: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
afd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
afe0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
aff0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b010: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b020: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
b040: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
b050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
b060: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
b070: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
b080: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b090: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
b0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b0b0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
b0c0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b0d0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
b0e0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
b0f0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
b100: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
b110: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
b120: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
b130: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
b140: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
b150: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
b160: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b170: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
b180: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
b190: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
b1a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
b1b0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
b1c0: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
b1d0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
b1e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b1f0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
b200: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
b210: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
b220: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
b230: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
b240: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
b250: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
b260: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
b270: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
b280: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
b290: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
b2a0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
b2b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
b2c0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
b2d0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
b2e0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
b2f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b300: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
b310: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
b320: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
b330: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
b340: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
b350: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
b360: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b370: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
b380: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
b390: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
b3a0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b3b0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
b3c0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b3d0: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b3e0: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b3f0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b400: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b410: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b420: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b430: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b440: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b450: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b460: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b470: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b480: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b490: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b4a0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b4b0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b4c0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b4d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b4e0: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b4f0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b500: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b510: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b520: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b530: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b540: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b550: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b570: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b580: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b590: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b5a0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b5b0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b5c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b5d0: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b5e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b5f0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b600: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b610: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b620: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b630: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b640: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b650: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b660: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b670: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b680: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b690: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b6a0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6c0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b6d0: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b6e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b6f0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b700: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b710: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b720: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b730: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b740: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b750: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b760: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b770: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b780: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b790: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b7a0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b7b0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
b7c0: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
b7d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
b7e0: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
b7f0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
b800: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b810: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
b820: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
b830: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
b840: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
b850: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
b860: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
b870: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
b880: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
b890: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
b8a0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
b8b0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
b8c0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
b8d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
b8e0: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b8f0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b900: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
b910: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
b920: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
b930: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
b940: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
b950: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
b960: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
b970: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
b980: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
b990: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
b9a0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
b9b0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
b9c0: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
b9d0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
b9e0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
b9f0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ba00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ba10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
ba20: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
ba30: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
ba40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ba50: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
ba60: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
ba70: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
ba80: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
ba90: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
baa0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bab0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bad0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bae0: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
baf0: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bb00: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bb10: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bb20: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bb30: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bb40: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bb50: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bb60: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bb70: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bb80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bb90: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbb0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
bbc0: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
bbd0: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
bbe0: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
bbf0: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
bc00: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
bc10: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
bc20: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
bc30: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
bc40: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
bc50: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bc60: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
bc70: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bc80: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bc90: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bca0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bcb0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bcc0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bcd0: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bce0: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bcf0: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bd00: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bd10: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bd20: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bd30: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bd40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bd50: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bd60: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bd70: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bd80: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bd90: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bda0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bdb0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
bdc0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
bdd0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
bde0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
bdf0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
be00: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
be10: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
be20: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
be30: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
be40: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
be50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
be60: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
be70: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
be80: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
be90: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
bea0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
beb0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
bec0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
bed0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
bee0: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
bef0: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf00: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
bf10: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
bf20: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
bf30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
bf40: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
bf50: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
bf60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bf70: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
bf80: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
bf90: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
bfa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bfb0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
bfc0: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
bfd0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
bfe0: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
bff0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c000: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c010: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c020: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c030: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c040: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c050: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c060: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c070: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c080: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c090: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c0a0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c0b0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c0c0: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0e0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c0f0: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c100: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c110: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c120: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c130: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c140: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c150: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c160: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c170: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c180: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c190: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c1a0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c1b0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c1c0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c1d0: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c1e0: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c1f0: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c200: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c210: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c220: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c230: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c250: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c260: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c270: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c280: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c290: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c2a0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c2b0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c2c0: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c2d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c2e0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c2f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c300: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c310: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c320: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c330: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c340: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c350: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c360: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c370: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c380: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c390: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c3a0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c3b0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c3c0: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3e0: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c3f0: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c400: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c410: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c420: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c430: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c440: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c450: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c460: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c470: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c480: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c490: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c4a0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c4b0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c4c0: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c4d0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c4e0: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c4f0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c510: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c530: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c540: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c550: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c560: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c570: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c580: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c590: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c5a0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c5b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c5c0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c5d0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5f0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c600: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c610: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c620: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c630: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c640: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c650: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c660: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c670: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c680: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c690: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c6a0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c6b0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c6c0: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c6d0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c6e0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c6f0: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c700: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c710: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c720: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c730: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c740: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c750: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c760: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c770: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c780: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c790: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c7a0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c7b0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
c7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
c7d0: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
c7e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c7f0: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
c800: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
c810: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
c820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c830: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
c840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c850: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c860: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
c870: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
c880: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
c890: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
c8a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c8b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c8c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c8d0: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
c8e0: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
c8f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c900: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
c910: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
c920: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
c930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
c950: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
c960: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
c970: 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 26 26  CATE.         &&
c980: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
c990: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c9a0: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
c9b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
c9c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c9d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
c9e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c9f0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
ca00: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78  e if( pPager->ex
ca10: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
ca20: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75    || pPager->jou
ca30: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
ca40: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
ca50: 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  IST.    ){.     
ca60: 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61   rc = zeroJourna
ca70: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73  lHdr(pPager, has
ca80: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70  Master);.      p
ca90: 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
caa0: 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50  r, rc);.      pP
cab0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cac0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
cad0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
cae0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ed = 0;.    }els
caf0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
cb00: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cb10: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
cb20: 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
cb30: 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  | rc );.      sq
cb40: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
cb50: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
cb60: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
cb70: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  OK && !pPager->t
cb80: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
cb90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
cba0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
cbb0: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
cbc0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
cbd0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65    }.    }..#ifde
cbe0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
cbf0: 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33  AGES.    sqlite3
cc00: 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69 72  PcacheIterateDir
cc10: 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ty(pPager->pPCac
cc20: 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61  he, pager_set_pa
cc30: 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a  gehash);.#endif.
cc40: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
cc50: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
cc60: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
cc70: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
cc80: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
cc90: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70  nJournal);.    p
cca0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
ccb0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  l = 0;.    pPage
ccc0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
ccd0: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
cce0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
ccf0: 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e  {.    rc2 = osUn
cd00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
cd10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
cd20: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cd30: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
cd40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
cd50: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
cd60: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
cd70: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
cd80: 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20  ER_SYNCED ){.   
cd90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
cda0: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
cdb0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
cdc0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
cdd0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
cde0: 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
cdf0: 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b  >dbModified = 0;
ce00: 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20  ..  /* TODO: Is 
ce10: 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68  this optimal? Wh
ce20: 79 20 69 73 20 74 68 65 20 64 62 20 73 69 7a 65  y is the db size
ce30: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72   invalidated her
ce40: 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  e .  ** when the
ce50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
ce60: 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20  s not unlocked? 
ce70: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  */.  pPager->dbO
ce80: 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73  rigSize = 0;.  s
ce90: 71 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e  qlite3PcacheTrun
cea0: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43  cate(pPager->pPC
ceb0: 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62  ache, pPager->db
cec0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45  Size);.  if( !ME
ced0: 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
cee0: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
cef0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   0;.  }..  retur
cf00: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
cf10: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
cf20: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61 44 61  ** Parameter aDa
cf30: 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ta must point to
cf40: 20 61 20 62 75 66 66 65 72 20 6f 66 20 70 50 61   a buffer of pPa
cf50: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
cf60: 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  tes.** of data. 
cf70: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
cf80: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61  rn a checksum ba
cf90: 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74  sed ont the cont
cfa0: 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ents of the .** 
cfb0: 70 61 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64  page of data and
cfc0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
cfd0: 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b  ue of pPager->ck
cfe0: 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  sumInit..**.** T
cff0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d000: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69  l checksum. It i
d010: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d020: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d030: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d040: 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63  value (pPager->c
d050: 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76  ksumInit) and ev
d060: 65 72 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a  ery 200th byte.*
d070: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  * of the page da
d080: 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74  ta, starting wit
d090: 68 20 62 79 74 65 20 6f 66 66 73 65 74 20 28 70  h byte offset (p
d0a0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25  Pager->pageSize%
d0b0: 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79  200)..** Each by
d0c0: 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  te is interprete
d0d0: 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e  d as an 8-bit un
d0e0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
d0f0: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74  **.** Changing t
d100: 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20  he formula used 
d110: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20  to compute this 
d120: 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73  checksum results
d130: 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70   in an.** incomp
d140: 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66  atible journal f
d150: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  ile format..**.*
d160: 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  * If journal cor
d170: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
d180: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
d190: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
d1a0: 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61  likely .** scena
d1b0: 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20  rio is that one 
d1c0: 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72  end or the other
d1d0: 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77   of the record w
d1e0: 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20  ill be changed. 
d1f0: 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c  .** It is much l
d200: 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20  ess likely that 
d210: 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20  the two ends of 
d220: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  the journal reco
d230: 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f  rd will be.** co
d240: 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69  rrect and the mi
d250: 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e  ddle be corrupt.
d260: 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68    Thus, this "ch
d270: 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a  ecksum" scheme,.
d280: 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61  ** though fast a
d290: 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68  nd simple, catch
d2a0: 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69  es the mostly li
d2b0: 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72  kely kind of cor
d2c0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
d2d0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
d2e0: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
d2f0: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
d300: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
d310: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
d320: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nit;         /* 
d330: 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74  Checksum value t
d340: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
d350: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
d360: 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20  geSize-200;     
d370: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d380: 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28  nter */.  while(
d390: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
d3a0: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
d3b0: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
d3c0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
d3d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
d3e0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
d3f0: 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75  m either the jou
d400: 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73  rnal file (if is
d410: 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a  MainJrnl==1) or.
d420: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  ** from the sub-
d430: 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61  journal (if isMa
d440: 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70  inJrnl==0) and p
d450: 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67  layback that pag
d460: 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62  e..** The page b
d470: 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20  egins at offset 
d480: 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  *pOffset into th
d490: 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66  e file. The *pOf
d4a0: 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
d4b0: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
d4c0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
d4d0: 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
d4e0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
d4f0: 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c  he isMainJrnl fl
d500: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
d510: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72  is is the main r
d520: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d530: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72  and.** false for
d540: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d550: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69  ournal.  The mai
d560: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
d570: 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b  al uses.** check
d580: 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
d590: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
d5a0: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s not..**.** If 
d5b0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
d5c0: 6f 66 20 74 68 65 20 70 61 67 65 20 72 65 63 6f  of the page reco
d5d0: 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  rd read from the
d5e0: 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66   (sub-)journal f
d5f0: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
d600: 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
d610: 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  nt value of Page
d620: 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70  r.dbSize, then p
d630: 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b  layback is.** sk
d640: 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45  ipped and SQLITE
d650: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
d660: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20  .**.** If pDone 
d670: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
d680: 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f 72 64  n it is a record
d690: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
d6a0: 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  ave already.** b
d6b0: 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  een played back.
d6c0: 20 20 49 66 20 74 68 65 20 70 61 67 65 20 61 74    If the page at
d6d0: 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c   *pOffset has al
d6e0: 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65  ready been playe
d6f0: 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68  d back.** (if th
d700: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
d710: 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74  pDone bit is set
d720: 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20  ) then skip the 
d730: 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b  playback..** Mak
d740: 65 20 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65  e sure the pDone
d750: 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
d760: 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73  ng to the *pOffs
d770: 65 74 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a  et page is set.*
d780: 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72  * prior to retur
d790: 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ning..**.** If t
d7a0: 68 65 20 70 61 67 65 20 72 65 63 6f 72 64 20 69  he page record i
d7b0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
d7c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
d7d0: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  b-)journal file.
d7e0: 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61  ** and played ba
d7f0: 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ck, then SQLITE_
d800: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
d810: 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
d820: 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72  ccurs.** while r
d830: 65 61 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72  eading the recor
d840: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d850: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72  )journal file or
d860: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a   while writing.*
d870: 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
d880: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65  e file, then the
d890: 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
d8a0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64  s returned. If d
d8b0: 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73  ata.** is succes
d8c0: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
d8d0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
d8e0: 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70 70 65  al file but appe
d8f0: 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72  ars to be.** cor
d900: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
d910: 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
d920: 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65   Data is conside
d930: 72 65 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e  red corrupted in
d940: 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74  .** two circumst
d950: 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20  ances:.** .**   
d960: 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20  * If the record 
d970: 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69  page-number is i
d980: 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47  llegal (0 or PAG
d990: 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a  ER_MJ_PGNO), or.
d9a0: 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 72 65  **   * If the re
d9b0: 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f  cord is being ro
d9c0: 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  lled back from t
d9d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
d9e0: 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20  file.**     and 
d9f0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65  the checksum fie
da00: 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ld does not matc
da10: 68 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e  h the record con
da20: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74  tent..**.** Neit
da30: 68 65 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f  her of these two
da40: 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70   scenarios are p
da50: 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61  ossible during a
da60: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
da70: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
da80: 69 73 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  is is a savepoin
da90: 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  t rollback, then
daa0: 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65   memory may have
dab0: 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c   to be dynamical
dac0: 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  ly.** allocated 
dad0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
dae0: 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
daf0: 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c   case and an all
db00: 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a  ocation fails,.*
db10: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  * SQLITE_NOMEM i
db20: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
db30: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
db40: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
db50: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
db60: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
db70: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
db80: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
db90: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
dba0: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
dbb0: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
dbc0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
dbd0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
dbe0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
dbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc00: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
dc10: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
dc20: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
dc30: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
dc40: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
dc50: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
dc60: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
dc70: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
dc80: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
dc90: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
dca0: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
dcb0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
dcc0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dce0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
dcf0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
dd00: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd20: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
dd30: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
dd40: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
dd50: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd70: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
dd80: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
dd90: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
dda0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ddb0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
ddc0: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
ddd0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
dde0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
ddf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
de00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
de10: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
de20: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
de30: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
de40: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
de50: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
de60: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
de70: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
de80: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
de90: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
dea0: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
deb0: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
dec0: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
ded0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
dee0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
def0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
df00: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
df10: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
df20: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
df30: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
df40: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28 75  */..  aData = (u
df50: 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
df60: 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
df70: 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
df80: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
df90: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
dfa0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
dfb0: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
dfc0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
dfd0: 61 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72  and page data fr
dfe0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  om the journal o
dff0: 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  r sub-journal.  
e000: 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20  ** file. Return 
e010: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
e020: 20 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61   the caller if a
e030: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
e040: 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20  s..  */.  jfd = 
e050: 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61  isMainJrnl ? pPa
e060: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
e070: 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20  r->sjfd;.  rc = 
e080: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
e090: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
e0a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e0b0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
e0c0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
e0d0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
e0e0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
e0f0: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
e100: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
e110: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e120: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
e130: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
e140: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
e150: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
e160: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
e170: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
e180: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
e190: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
e1a0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
e1b0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
e1c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
e1d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
e1e0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
e1f0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
e200: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
e210: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
e220: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
e230: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
e240: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
e250: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
e260: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
e270: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
e280: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e290: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
e2a0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
e2b0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73  Pager) ){.    as
e2c0: 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74  sert( !isSavepnt
e2d0: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
e2e0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
e2f0: 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f    if( pgno>(Pgno
e300: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
e310: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
e320: 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  Test(pDone, pgno
e330: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e340: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
e350: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
e360: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
e370: 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f  32bits(jfd, (*pO
e380: 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d  ffset)-4, &cksum
e390: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
e3a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
e3b0: 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26  f( !isSavepnt &&
e3c0: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
e3d0: 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73  ger, aData)!=cks
e3e0: 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  um ){.      retu
e3f0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
e400: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
e410: 20 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20   pDone && (rc = 
e420: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
e430: 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d  (pDone, pgno))!=
e440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e450: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
e460: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e470: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
e480: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
e490: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
e4a0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
e4b0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
e4c0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
e4d0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
e4e0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
e4f0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
e500: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
e510: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
e520: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
e530: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
e540: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
e550: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
e560: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
e570: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
e580: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
e590: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
e5a0: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
e5b0: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
e5c0: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
e5d0: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
e5e0: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
e5f0: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
e600: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
e610: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
e620: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
e630: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
e640: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
e650: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
e660: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
e670: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
e680: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
e690: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
e6a0: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
e6b0: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
e6c0: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
e6d0: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
e6e0: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
e6f0: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
e700: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
e710: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
e720: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
e730: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
e740: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
e750: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
e760: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
e770: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
e780: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
e790: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
e7a0: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
e7b0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
e7c0: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
e7d0: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
e7e0: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
e7f0: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
e800: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
e810: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
e820: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
e830: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
e840: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
e850: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
e860: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
e870: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
e880: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
e890: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
e8a0: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
e8b0: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
e8c0: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
e8d0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
e8e0: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
e8f0: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
e900: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
e910: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
e920: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
e930: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
e940: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
e950: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
e960: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
e970: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
e980: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
e990: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
e9a0: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
e9b0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
e9c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
e9d0: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
e9e0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
e9f0: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
ea00: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
ea10: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
ea20: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
ea30: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
ea40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
ea50: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
ea60: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
ea70: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
ea80: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
ea90: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
eaa0: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
eab0: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
eac0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
ead0: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
eae0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
eaf0: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
eb00: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
eb10: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
eb20: 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
eb30: 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
eb40: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
eb50: 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
eb60: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
eb70: 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
eb80: 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
eb90: 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
eba0: 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
ebb0: 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
ebc0: 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
ebd0: 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
ebe0: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
ebf0: 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
ec00: 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  d..  */.  pPg = 
ec10: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
ec20: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41  ger, pgno);.  PA
ec30: 47 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42  GERTRACE(("PLAYB
ec40: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
ec50: 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c  ash(%08x) %s\n",
ec60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec70: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
ec80: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
ec90: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
eca0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a  geSize, aData),.
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
ecc0: 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e  isMainJrnl?"main
ecd0: 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a  -journal":"sub-j
ece0: 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20  ournal").  ));. 
ecf0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
ed00: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
ed10: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
ed20: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
ed30: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
ed40: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73  _SYNC)).   && is
ed50: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
ed60: 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66  .  ){.    i64 of
ed70: 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  st = (pgno-1)*(i
ed80: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
ed90: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
eda0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
edb0: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
edc0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
edd0: 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28  , ofst);.    if(
ede0: 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
edf0: 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
ee00: 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
ee10: 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  Size = pgno;.   
ee20: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61   }.    sqlite3Ba
ee30: 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65  ckupUpdate(pPage
ee40: 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f  r->pBackup, pgno
ee50: 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73  , aData);.  }els
ee60: 65 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e  e if( !isMainJrn
ee70: 6c 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20  l && pPg==0 ){. 
ee80: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
ee90: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61   a rollback of a
eea0: 20 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64   savepoint and d
eeb0: 61 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74  ata was not writ
eec0: 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68  ten to.    ** th
eed0: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74  e database and t
eee0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
eef0: 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20  n-memory, there 
ef00: 69 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20  is a potential. 
ef10: 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57     ** problem. W
ef20: 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
ef30: 6e 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20  next fetched by 
ef40: 74 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72  the b-tree layer
ef50: 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c  , it .    ** wil
ef60: 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  l be read from t
ef70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ef80: 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d  , which may or m
ef90: 61 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a  ay not be .    *
efa0: 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20  * current. .    
efb0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20  **.    ** There 
efc0: 61 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  are a couple of 
efd0: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74  different ways t
efe0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20  his can happen. 
eff0: 41 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20  All are quite.  
f000: 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68    ** obscure. Wh
f010: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79  en running in sy
f020: 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
f030: 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  this can only ha
f040: 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20  ppen .    ** if 
f050: 74 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74  the page is on t
f060: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20  he free-list at 
f070: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
f080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
f090: 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61  en.    ** popula
f0a0: 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20  ted, then moved 
f0b0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67  using sqlite3Pag
f0c0: 65 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20  erMovepage()..  
f0d0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
f0e0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61  solution is to a
f0f0: 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  dd an in-memory 
f100: 70 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68  page to the cach
f110: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  e containing.   
f120: 20 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73   ** the data jus
f130: 74 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  t read from the 
f140: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72  sub-journal. Mar
f150: 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
f160: 72 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20  rty .    ** and 
f170: 69 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71  if the pager req
f180: 75 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d  uires a journal-
f190: 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20  sync, then mark 
f1a0: 74 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20  the page as .   
f1b0: 20 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20   ** requiring a 
f1c0: 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66  journal-sync bef
f1d0: 6f 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65  ore it is writte
f1e0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
f1f0: 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20  sert( isSavepnt 
f200: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d  );.    if( (rc =
f210: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
f220: 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e  uire(pPager, pgn
f230: 6f 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51  o, &pPg, 1))!=SQ
f240: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
f250: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f260: 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  }.    pPg->flags
f270: 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
f280: 52 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65  READ;.    sqlite
f290: 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
f2a0: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28  (pPg);.  }.  if(
f2b0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
f2c0: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
f2d0: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
f2e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
f2f0: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
f300: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
f310: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
f320: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
f330: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
f340: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
f350: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
f360: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
f370: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
f380: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
f390: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
f3a0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
f3b0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
f3c0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
f3d0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
f3e0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
f3f0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
f400: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
f410: 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
f420: 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ta;.    memcpy(p
f430: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
f440: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
f450: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
f460: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
f470: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
f480: 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d  iter(pPg);.    }
f490: 0a 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a  .    if( isMainJ
f4a0: 72 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70  rnl && (!isSavep
f4b0: 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d  nt || *pOffset<=
f4c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
f4d0: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
f4e0: 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
f4f0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
f500: 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
f510: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
f520: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
f530: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
f540: 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
f550: 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
f560: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
f570: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
f580: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
f590: 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
f5a0: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
f5b0: 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
f5c0: 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
f5d0: 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
f5e0: 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
f5f0: 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   the..      **. 
f600: 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
f610: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
f620: 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
f630: 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
f640: 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
f650: 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
f660: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
f670: 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
f680: 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
f690: 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
f6a0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
f6b0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
f6c0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
f6d0: 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
f6e0: 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
f6f0: 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
f700: 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
f710: 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
f720: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
f730: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
f740: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f750: 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
f760: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
f770: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
f780: 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
f790: 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
f7a0: 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
f7b0: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
f7c0: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
f7d0: 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
f7e0: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
f7f0: 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
f800: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
f810: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
f820: 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
f830: 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
f840: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f850: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
f860: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
f870: 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
f880: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
f890: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
f8a0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
f8b0: 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
f8c0: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
f8d0: 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
f8e0: 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
f8f0: 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
f900: 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
f910: 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
f920: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
f930: 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
f940: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
f950: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
f960: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
f970: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f980: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
f990: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
f9a0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
f9b0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
f9c0: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
f9d0: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
f9e0: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
f9f0: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
fa00: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
fa10: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
fa20: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
fa30: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
fa40: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
fa50: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
fa60: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
fa70: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
fa80: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
fa90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
faa0: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
fab0: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
fac0: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
fad0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
fae0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
faf0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fb00: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fb10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
fb20: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
fb30: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fb40: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
fb50: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
fb60: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68  routine looks ah
fb70: 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ead into the mai
fb80: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
fb90: 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  nd determines.**
fba0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
fbb0: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20  the next record 
fbc0: 28 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74  (the record that
fbd0: 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a   begins at file.
fbe0: 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  ** offset pPager
fbf0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73  ->journalOff) is
fc00: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70   a well-formed p
fc10: 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  age record consi
fc20: 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61  sting.** of a va
fc30: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c  lid page number,
fc40: 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65   pPage->pageSize
fc50: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
fc60: 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62  t, followed.** b
fc70: 79 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73  y a valid checks
fc80: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  um..**.** The pa
fc90: 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ger never needs 
fca0: 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20  to know this in 
fcb0: 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20  order to do its 
fcc0: 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72  job.   This.** r
fcd0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
fce0: 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73  sed from with as
fcf0: 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
fd00: 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
fd10: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fd20: 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
fd30: 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
fd40: 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
fd50: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
fd60: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
fd70: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
fd80: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
fd90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
fda0: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
fdb0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
fdc0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
fdd0: 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
fde0: 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
fdf0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
fe00: 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
fe10: 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
fe20: 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
fe30: 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
fe40: 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
fe50: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
fe60: 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
fe70: 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
fe80: 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
fe90: 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
fea0: 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
feb0: 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
fec0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
fed0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
fee0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
fef0: 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
ff20: 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
ff30: 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
ff40: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
ff50: 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
ff60: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
ff70: 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
ff80: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
ff90: 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
ffa0: 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
ffb0: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
ffc0: 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
ffd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
ffe0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
fff0: 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
10000 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
10010 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
10020 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
10030 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
10040 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
10070 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
10080 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
10090 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
100a0 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
100b0 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
100c0 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
100d0 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
100e0 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
100f0 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
10100 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
10110 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10120 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
10130 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
10160 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
10170 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
10180 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
10190 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
101a0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
101b0 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
101c0 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
101d0 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
101e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
101f0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10200 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
10210 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
10220 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
10230 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
10240 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
10250 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
10260 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
10270 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
10280 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
10290 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
102a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
102b0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
102c0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
102d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
102e0 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
102f0 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10300 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10310 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
10320 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
10330 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
10340 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
10350 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
10360 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
10370 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
10380 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
10390 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
103a0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
103b0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
103c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
103d0 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
103e0 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
103f0 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
10400 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
10410 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
10420 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
10430 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
10440 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
10450 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
10460 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
10470 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
10480 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
10490 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
104a0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
104b0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
104c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
104d0 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
104e0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
104f0 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
10500 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
10510 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
10520 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
10530 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
10540 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
10550 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
10560 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
10570 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
10580 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
10590 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
105a0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
105b0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
105c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
105d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
105e0 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
105f0 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10600 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10610 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10620 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10630 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10640 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
10650 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
10660 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
10670 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10680 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
10690 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
106a0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
106b0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
106c0 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
106d0 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
106e0 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
106f0 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10700 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10710 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10720 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10730 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10750 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
10760 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
10770 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
10780 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
10790 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
107a0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
107b0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
107c0 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
107d0 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
107e0 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
107f0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10800 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10810 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10820 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10830 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10840 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
10850 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
10860 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
10870 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
10880 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
10890 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
108a0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
108b0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
108c0 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
108d0 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
108e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
108f0 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10900 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10910 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10920 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10930 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10940 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10950 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10960 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10970 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10980 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10990 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
109a0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
109b0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
109c0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
109d0 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
109e0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
109f0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10a00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10a10 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10a20 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10a50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10a60 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10a70 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10a80 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10a90 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10aa0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10ab0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10ac0 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10ad0 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10ae0 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10af0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10b00 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10b10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10b20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10b30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10b40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10b50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10b60 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10b70 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10b80 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10b90 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10ba0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10bb0 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10bc0 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10bd0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10be0 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10bf0 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10c00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10c10 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10c20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10c30 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10c40 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10c50 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
10c60 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
10c70 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
10c80 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
10c90 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10cb0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
10cc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
10cd0 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
10ce0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
10cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10d00 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
10d10 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
10d20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
10d30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10d40 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
10d50 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
10d60 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10d70 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
10d80 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
10d90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10da0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10db0 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
10dc0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
10dd0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
10de0 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
10df0 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
10e00 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
10e10 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
10e20 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
10e30 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
10e40 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10e50 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
10e60 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
10e70 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
10e80 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
10e90 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
10ea0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
10eb0 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
10ec0 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
10ed0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
10ee0 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
10ef0 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
10f00 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
10f10 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
10f20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10f30 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
10f40 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
10f50 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
10f60 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
10f70 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
10f80 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
10f90 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
10fa0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
10fb0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
10fc0 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
10fd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10fe0 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
10ff0 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
11000 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
11010 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
11020 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
11030 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
11040 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
11050 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
11060 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
11070 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
11080 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
11090 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
110a0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
110b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
110c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
110d0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
110e0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
110f0 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
11100 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
11110 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
11120 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
11130 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11140 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
11150 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
11160 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
11170 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
11180 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11190 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
111a0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
111b0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
111c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
111d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
111e0 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
111f0 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11200 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11210 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
11220 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
11230 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11240 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
11250 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
11260 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
11270 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11290 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
112a0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
112b0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
112c0 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
112d0 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
112e0 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
112f0 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11300 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
11310 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
11320 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11340 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11350 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
11360 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
11370 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
11380 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
11390 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
113a0 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
113b0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
113c0 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
113d0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
113e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
113f0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
11400 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11410 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11420 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
11430 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
11440 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
11450 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
11460 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
11470 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11480 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
11490 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
114a0 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
114b0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
114c0 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
114d0 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
114e0 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
114f0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11500 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11510 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
11520 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
11530 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11540 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11550 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
11560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
11570 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
11580 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
11590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
115a0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
115b0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
115c0 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
115d0 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
115e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
115f0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
11600 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
11610 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
11620 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
11630 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
11640 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11650 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
11660 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
11670 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
11680 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
11690 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
116a0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
116b0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
116c0 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
116d0 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
116e0 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
116f0 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11700 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11710 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11720 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11730 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
11740 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
11750 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
11760 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
11770 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
11780 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
11790 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
117a0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
117b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
117c0 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
117d0 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
117e0 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
117f0 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11800 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11810 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11820 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11830 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
11840 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
11850 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
11860 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
11870 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
11880 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
11890 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
118a0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
118b0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
118c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
118d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
118e0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
118f0 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11900 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11910 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11920 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11930 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11950 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11960 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11970 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11980 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11990 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
119a0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
119b0 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
119c0 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
119d0 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
119e0 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
119f0 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11a00 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11a10 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11a20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11a30 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11a40 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11a50 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11a60 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11a70 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11a80 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11aa0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11ab0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11ac0 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11ad0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11ae0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11af0 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11b00 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11b10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11b30 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11b40 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11b50 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11b60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11b80 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11b90 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11ba0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11bb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11bc0 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11bd0 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11be0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11bf0 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11c00 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11c10 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11c20 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11c30 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11c40 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11c50 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11c60 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11c70 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
11c80 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
11c90 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
11ca0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
11cb0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
11cc0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11cd0 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
11ce0 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
11cf0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
11d00 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
11d10 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
11d20 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
11d30 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
11d40 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
11d50 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
11d60 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
11d70 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
11d80 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
11d90 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11da0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
11db0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
11dc0 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
11dd0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
11de0 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
11df0 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
11e00 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
11e10 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
11e20 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
11e30 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
11e40 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
11e50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
11e60 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
11e70 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
11e80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
11e90 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
11ea0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
11eb0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
11ec0 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
11ed0 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
11ee0 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
11ef0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
11f00 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
11f10 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
11f20 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
11f30 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
11f40 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
11f50 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
11f60 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
11f70 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
11f80 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
11f90 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
11fa0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
11fb0 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
11fc0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
11fd0 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
11fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
11ff0 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12000 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12010 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12020 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12030 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12040 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
12050 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
12060 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
12070 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
12080 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
12090 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
120a0 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
120b0 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
120c0 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
120d0 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
120e0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
120f0 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12100 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12110 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12120 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12130 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
12140 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
12150 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12160 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12170 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
12180 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
12190 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
121a0 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
121b0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
121c0 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
121d0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
121e0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
121f0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
12200 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
12210 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
12220 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12230 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
12240 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
12250 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
12260 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
12270 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
12280 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
12290 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
122a0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
122b0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
122c0 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
122d0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
122e0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
122f0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12300 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
12310 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
12320 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
12330 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
12340 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
12350 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12360 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12370 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
12380 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
12390 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
123a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
123b0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
123c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
123d0 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
123e0 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
123f0 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
12400 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
12410 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
12420 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
12430 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
12440 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12450 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
12460 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
12470 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
12480 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
12490 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
124a0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
124b0 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
124c0 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
124d0 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
124e0 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
124f0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
12500 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
12510 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
12520 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
12530 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
12540 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
12550 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
12560 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
12570 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
12580 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
12590 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
125a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
125b0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
125c0 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
125d0 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
125e0 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
125f0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12600 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
12610 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
12620 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
12630 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
12640 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
12650 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
12660 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
12670 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
12680 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
12690 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
126a0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
126b0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
126c0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
126d0 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
126e0 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
126f0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12700 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12710 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12720 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12730 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
12740 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
12750 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
12760 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
12770 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
12780 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
12790 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
127a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
127b0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
127c0 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
127d0 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
127e0 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
127f0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12800 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12810 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12820 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12830 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12840 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
12850 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
12860 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
12870 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
12880 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
12890 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
128a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
128b0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
128c0 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
128d0 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
128e0 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
128f0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12900 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12910 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12920 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12930 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12940 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12950 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12960 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12970 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12980 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12990 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
129a0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
129b0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
129c0 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
129d0 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
129e0 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
129f0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12a00 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12a10 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12a20 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12a30 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12a50 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12a60 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12a70 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12a80 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12a90 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12aa0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12ab0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12ac0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12ad0 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12ae0 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12af0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12b00 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12b10 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12b20 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12b30 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12b40 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12b50 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12b60 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12b70 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12b80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12b90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12ba0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12bb0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12bc0 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12bd0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12be0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12bf0 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12c00 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12c10 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12c20 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12c30 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12c40 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12c50 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
12c60 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
12c70 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
12c80 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
12c90 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
12ca0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
12cb0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
12cc0 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
12cd0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12ce0 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
12cf0 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
12d00 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
12d10 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
12d20 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
12d30 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
12d40 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
12d50 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
12d60 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
12d90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
12da0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
12db0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
12dc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12dd0 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
12de0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
12df0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
12e00 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
12e10 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
12e20 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
12e30 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
12e40 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
12e50 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
12e60 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12e90 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
12ea0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
12eb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
12ec0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
12ed0 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
12ee0 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
12ef0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
12f00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
12f10 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12f20 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
12f30 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
12f40 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
12f50 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
12f60 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
12f70 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
12f80 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
12f90 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
12fa0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
12fb0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
12fc0 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
12fd0 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
12fe0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
12ff0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13000 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13010 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
13020 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
13030 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13040 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
13050 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
13060 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
13070 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
13080 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
13090 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
130a0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
130b0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
130c0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
130d0 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
130e0 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
130f0 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
13100 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
13110 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
13120 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
13130 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13140 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
13150 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
13160 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
13170 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
13180 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
13190 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
131a0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
131b0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
131c0 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
131d0 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
131e0 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
131f0 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
13200 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
13210 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13220 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
13230 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
13240 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
13250 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
13260 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
13270 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
13280 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
13290 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
132a0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
132b0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
132c0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
132d0 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
132e0 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
132f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
13300 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13310 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13320 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
13330 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
13340 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
13350 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
13360 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
13370 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
13380 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13390 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
133a0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
133b0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
133c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
133d0 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
133e0 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
133f0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
13400 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
13410 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
13420 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
13430 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13440 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
13450 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
13460 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
13470 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
13480 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
13490 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
134a0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
134b0 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
134c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
134d0 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
134e0 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
134f0 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
13500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
13510 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
13520 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
13530 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
13540 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
13550 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
13560 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
13570 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
13580 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
13590 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
135a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
135b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
135c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
135d0 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
135e0 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
135f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
13600 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
13610 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
13620 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13630 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
13640 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
13650 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
13660 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
13670 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
13680 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
13690 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
136a0 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
136b0 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
136c0 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
136d0 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
136e0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
136f0 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
13700 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
13710 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
13720 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
13730 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
13740 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
13750 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
13760 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
13770 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
13780 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
13790 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
137a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
137b0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
137c0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
137d0 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
137e0 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
137f0 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
13800 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
13810 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
13820 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
13830 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
13840 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
13850 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
13860 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
13870 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
13880 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
13890 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
138a0 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
138b0 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
138c0 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
138d0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
138e0 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
138f0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
13900 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
13910 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
13920 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
13930 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
13940 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
13950 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
13960 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13970 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
13980 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
13990 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
139a0 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
139b0 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
139c0 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
139d0 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
139e0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
139f0 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
13a00 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
13a10 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
13a20 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
13a30 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
13a40 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
13a50 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
13a60 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
13a70 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
13a80 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
13a90 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
13aa0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
13ab0 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
13ac0 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
13ad0 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
13ae0 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
13af0 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
13b00 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
13b10 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
13b20 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
13b30 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
13b40 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
13b50 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
13b60 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
13b70 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  Hot.         && 
13b80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13b90 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
13ba0 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65  Z(pPager)!=pPage
13bb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
13bc0 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20         && ((szJ 
13bd0 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
13be0 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
13bf0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30  PG_SZ(pPager))>0
13c00 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67  .         && pag
13c10 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67  erNextJournalPag
13c20 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29  eIsValid(pPager)
13c30 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
13c40 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
13c50 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
13c60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
13c70 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13c80 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
13c90 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
13ca0 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
13cb0 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
13cc0 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13cd0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13ce0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
13cf0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
13d00 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
13d10 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
13d20 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
13d30 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
13d40 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
13d50 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
13d60 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
13d70 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
13d80 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13d90 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
13da0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13db0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
13dc0 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
13dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13de0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
13df0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
13e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
13e10 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
13e20 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
13e30 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
13e40 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
13e50 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
13e60 63 6b 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  ck into the .   
13e70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13e80 65 20 61 6e 64 2f 6f 72 20 70 61 67 65 20 63 61  e and/or page ca
13e90 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  che..    */.    
13ea0 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b  for(u=0; u<nRec;
13eb0 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   u++){.      if(
13ec0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
13ee0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
13ef0 20 20 20 20 20 20 20 20 6e 65 65 64 50 61 67 65          needPage
13f00 72 52 65 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rReset = 0;.    
13f10 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
13f20 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13f30 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
13f40 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
13f50 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b 0a 20 20  alOff, 0, 0);.  
13f60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13f70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13f90 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
13fa0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
13fc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
13fd0 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
13fe0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
13ff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14000 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61  /* If we are una
14010 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c  ble to rollback,
14020 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
14030 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20  se is probably. 
14040 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e           ** goin
14050 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e  g to end up bein
14060 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69  g corrupt.  It i
14070 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c  s corrupt to us,
14080 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20   anyhow..       
14090 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68     ** Perhaps th
140a0 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74  e next process t
140b0 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e  o come along can
140c0 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20   fix it.....    
140d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
140e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
140f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14100 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
14110 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
14120 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14130 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
14140 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
14150 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
14160 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
14170 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14190 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
141a0 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
141b0 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
141c0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
141d0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
141e0 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
141f0 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
14200 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
14210 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
14220 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
14230 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
14240 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
14250 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
14260 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
14270 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
14280 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14290 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
142a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
142b0 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
142c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
142d0 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
142e0 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
142f0 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
14300 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
14310 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
14320 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
14330 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
14340 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
14350 63 75 72 65 64 20 61 66 74 65 72 20 74 68 65 20  cured after the 
14360 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
14370 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
14380 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
14390 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
143a0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
143b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
143c0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
143d0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
143e0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
143f0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
14400 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
14410 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
14420 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
14430 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
14440 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
14450 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
14460 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
14470 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
14480 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
14490 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
144a0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
144b0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
144c0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
144d0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
144e0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
144f0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
14500 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
14510 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
14520 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
14530 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
14540 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14550 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
14560 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
14570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14580 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
14590 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
145a0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
145b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
145c0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
145d0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
145e0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
145f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14610 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
14630 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
14640 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14650 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
14660 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
14670 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14680 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
14690 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
146a0 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
146b0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
146c0 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
146d0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
146e0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
146f0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
14700 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
14710 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
14720 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
14730 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
14740 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
14750 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
14760 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
14770 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14780 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
14790 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
147a0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
147b0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
147c0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
147d0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
147e0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
147f0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
14800 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
14810 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
14820 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
14830 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
14840 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
14850 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
14860 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14870 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
14880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
14890 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
148a0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
148b0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
148c0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
148d0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
148e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
148f0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
14900 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
14910 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
14920 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
14930 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
14940 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
14950 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
14960 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
14970 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
14980 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
14990 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
149a0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
149b0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
149c0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
149d0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
149e0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
149f0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
14a00 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
14a10 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
14a20 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
14a30 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
14a40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
14a50 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
14a60 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
14a70 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
14a80 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
14a90 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
14aa0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
14ab0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14ac0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
14ad0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14ae0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
14af0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
14b00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14b10 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
14b20 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
14b30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14b40 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
14b50 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
14b60 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
14b70 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
14b80 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14b90 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
14ba0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
14bb0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
14bc0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14bd0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14be0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14bf0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
14c00 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
14c10 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
14c20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
14c30 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
14c40 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
14c50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
14c60 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
14c70 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
14c80 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
14c90 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
14ca0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
14cb0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
14cc0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
14cd0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
14ce0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
14cf0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
14d00 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
14d10 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
14d20 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
14d30 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
14d40 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
14d50 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
14d60 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
14d70 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
14d80 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
14d90 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
14da0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
14db0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
14dc0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
14dd0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
14de0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
14df0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
14e00 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
14e10 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
14e20 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
14e30 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
14e40 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
14e50 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
14e60 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
14e70 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
14e80 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
14e90 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
14ea0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
14eb0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
14ec0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
14ed0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
14ee0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
14ef0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
14f00 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
14f10 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
14f20 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
14f30 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
14f40 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
14f50 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
14f60 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
14f70 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
14f80 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
14f90 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
14fa0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
14fb0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
14fc0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
14fd0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
14fe0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
14ff0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
15000 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
15010 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
15020 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
15030 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
15040 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15050 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15060 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
15070 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
15080 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
15090 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
150a0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
150b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
150c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
150d0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
150e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
150f0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
15100 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
15110 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
15120 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
15130 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
15140 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
15150 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
15160 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
15170 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
15180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15190 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
151a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
151b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
151c0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
151d0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
151e0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
151f0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
15200 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
15210 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
15220 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
15230 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
15240 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
15250 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20  ->dbOrigSize;.. 
15260 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
15270 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
15280 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
15290 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
152a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
152b0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
152c0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
152d0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
152e0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
152f0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
15300 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
15310 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
15320 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
15330 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
15340 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
15350 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
15360 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
15370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
15380 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
15390 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
153a0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
153b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
153c0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
153d0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
153e0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
153f0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
15400 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
15410 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
15420 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
15430 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
15440 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
15450 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
15460 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15470 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
15480 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
15490 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
154a0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
154b0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
154c0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
154d0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
154e0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
154f0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
15500 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
15510 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
15520 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
15530 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
15540 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
15550 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
15560 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15570 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
15580 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
15590 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
155a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
155b0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
155c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
155d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
155e0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  e(pPager, 1, &pP
155f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15600 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20  , 1, pDone);.   
15610 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
15620 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
15630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
15640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15650 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
15660 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
15670 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
15680 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
15690 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
156a0 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
156b0 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
156c0 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
156d0 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
156e0 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
156f0 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
15700 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
15710 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
15720 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
15730 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
15740 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
15750 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
15760 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
15770 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
15780 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
15790 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
157a0 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
157b0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
157c0 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
157d0 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
157e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
157f0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
15800 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
15810 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
15820 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
15830 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
15840 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  my);.    assert(
15850 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15860 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   );..    /*.    
15870 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d 3e  ** The "pPager->
15880 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15890 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
158a0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
158b0 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74 65  alOff".    ** te
158c0 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74 6f  st is related to
158d0 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20 20   ticket #2565.  
158e0 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73 69  See the discussi
158f0 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  on in the.    **
15900 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
15910 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  ) function for a
15920 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15930 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15940 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52 65    assert( !(nJRe
15950 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  c==0.         &&
15960 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15970 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
15980 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
15990 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
159a0 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
159b0 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
159c0 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
159d0 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
159e0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
159f0 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
15a00 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
15a10 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  )).    );.    if
15a20 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20 20  ( nJRec==0 .    
15a30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
15a40 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
15a50 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70  DR_SZ(pPager)==p
15a60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15a70 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 6e  f.    ){.      n
15a80 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73 7a  JRec = (u32)((sz
15a90 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
15aa0 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f  nalOff)/JOURNAL_
15ab0 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a  PG_SZ(pPager));.
15ac0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
15ad0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
15ae0 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26 26  K && ii<nJRec &&
15af0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15b00 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a  Off<szJ; ii++){.
15b10 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15b20 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15b30 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  ge(pPager, 1, &p
15b40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15b50 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
15b60 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
15b70 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
15b80 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
15b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
15ba0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
15bb0 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
15bc0 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c  /* Finally,  rol
15bd0 6c 62 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d  lback pages from
15be0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15bf0 2e 20 20 50 61 67 65 20 74 68 61 74 20 77 65 72  .  Page that wer
15c00 65 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  e.  ** previousl
15c10 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75  y rolled back ou
15c20 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  t of the main jo
15c30 75 72 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68  urnal (and are h
15c40 65 6e 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20  ence in pDone). 
15c50 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
15c60 70 65 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e  ped.  Out-of-ran
15c70 67 65 20 70 61 67 65 73 20 61 72 65 20 61 6c 73  ge pages are als
15c80 6f 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  o skipped..  */.
15c90 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
15ca0 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20   ){.    u32 ii; 
15cb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
15cc0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
15cd0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
15ce0 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
15cf0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
15d00 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66 6f 72  geSize);.    for
15d10 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e  (ii=pSavepoint->
15d20 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c  iSubRec; rc==SQL
15d30 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61  ITE_OK && ii<pPa
15d40 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 20 69 69  ger->nSubRec; ii
15d50 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
15d60 74 28 20 6f 66 66 73 65 74 3d 3d 69 69 2a 28 34  t( offset==ii*(4
15d70 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
15d80 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e) );.      rc =
15d90 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15da0 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15db0 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c 20   0, &offset, 1, 
15dc0 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15dd0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15de0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
15df0 0a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ..  sqlite3Bitve
15e00 63 44 65 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b  cDestroy(pDone);
15e10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
15e30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15e40 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75   szJ;.  }.  retu
15e50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15e60 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
15e70 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
15e80 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
15e90 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
15ea0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15eb0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
15ec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
15ed0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73 71  nt mxPage){.  sq
15ee0 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43 61  lite3PcacheSetCa
15ef0 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e  chesize(pPager->
15f00 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65 29  pPCache, mxPage)
15f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  ;.}../*.** Adjus
15f20 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
15f30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15f40 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
15f50 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
15f60 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
15f70 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
15f80 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
15f90 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
15fa0 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
15fb0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
15fc0 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
15fd0 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
15fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15ff0 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
16000 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
16010 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
16030 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
16040 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
16050 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
16060 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
16070 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
16080 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
16090 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
160a0 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
160b0 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
160c0 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
160d0 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
160f0 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
16100 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
16110 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
16120 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
16130 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
16140 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
16150 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
16160 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
16170 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
16180 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
16190 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
161a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
161b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
161c0 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
161d0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
161e0 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
161f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
16200 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
16210 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
16220 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16230 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
16240 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
16250 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
16260 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
16280 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
16290 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
162a0 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
162b0 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
162c0 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
162d0 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
162e0 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
162f0 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
16300 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
16310 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
16320 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
16330 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16340 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
16350 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
16360 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
16370 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
16380 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
16390 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
163a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
163b0 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
163c0 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
163d0 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
163e0 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
163f0 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
16400 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
16410 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
16420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16430 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
16440 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
16450 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
16460 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16470 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c   level, int bFul
16480 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  lFsync){.  pPage
16490 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65  r->noSync =  (le
164a0 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
164b0 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
164c0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
164d0 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33  Sync = (level==3
164e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
164f0 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
16500 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
16510 73 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f  s = (bFullFsync?
16520 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
16530 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
16540 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
16550 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
16560 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
16570 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
16580 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
16590 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
165a0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
165b0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
165c0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
165d0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
165e0 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
165f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
16600 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
16610 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
16620 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
16630 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
16640 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
16650 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
16660 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
16670 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
16680 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  le..**.** Write 
16690 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
166a0 74 6f 72 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e  tor into *pFile.
166b0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
166c0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a  K on success .**
166d0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
166e0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
166f0 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c  fail. The OS wil
16700 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
16710 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 74  .** delete the t
16720 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
16730 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
16740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73  .**.** The flags
16750 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 56   passed to the V
16760 46 53 20 6c 61 79 65 72 20 78 4f 70 65 6e 28 29  FS layer xOpen()
16770 20 63 61 6c 6c 20 61 72 65 20 74 68 6f 73 65 20   call are those 
16780 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20  specified.** by 
16790 70 61 72 61 6d 65 74 65 72 20 76 66 73 46 6c 61  parameter vfsFla
167a0 67 73 20 4f 52 65 64 20 77 69 74 68 20 74 68 65  gs ORed with the
167b0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
167c0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
167d0 4e 5f 52 45 41 44 57 52 49 54 45 0a 2a 2a 20 20  N_READWRITE.**  
167e0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
167f0 52 45 41 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  REATE.**     SQL
16800 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
16810 56 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  VE.**     SQLITE
16820 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
16830 4f 53 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OSE.*/.static in
16840 74 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  t pagerOpentemp(
16850 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
16860 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
16870 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
16880 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
16890 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
168a0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
168b0 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
168c0 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
168d0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
168e0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
168f0 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
16900 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16910 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16920 63 6f 64 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20  code */..#ifdef 
16930 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
16940 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
16950 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
16960 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
16970 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
16980 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
16990 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
169a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
169b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
169c0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
169d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
169e0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
169f0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
16a00 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
16a10 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
16a20 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
16a30 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
16a40 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
16a50 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65  LITE_OK || isOpe
16a60 6e 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 72 65  n(pFile) );.  re
16a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16a80 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
16a90 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
16aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72  .**.** The pager
16ab0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 62 75 73   invokes the bus
16ac0 79 2d 68 61 6e 64 6c 65 72 20 69 66 20 73 71 6c  y-handler if sql
16ad0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74  ite3OsLock() ret
16ae0 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
16af0 42 55 53 59 20 77 68 65 6e 20 74 72 79 69 6e 67  BUSY when trying
16b00 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
16b10 20 6e 6f 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48   no-lock to a SH
16b20 41 52 45 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72  ARED lock,.** or
16b30 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16b40 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
16b50 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20  ESERVED lock to 
16b60 61 6e 20 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a  an EXCLUSIVE .**
16b70 20 6c 6f 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a   lock. It does *
16b80 6e 6f 74 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  not* invoke the 
16b90 62 75 73 79 20 68 61 6e 64 6c 65 72 20 77 68 65  busy handler whe
16ba0 6e 20 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d  n upgrading from
16bb0 0a 2a 2a 20 53 48 41 52 45 44 20 74 6f 20 52 45  .** SHARED to RE
16bc0 53 45 52 56 45 44 2c 20 6f 72 20 77 68 65 6e 20  SERVED, or when 
16bd0 75 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 20 53  upgrading from S
16be0 48 41 52 45 44 20 74 6f 20 45 58 43 4c 55 53 49  HARED to EXCLUSI
16bf0 56 45 0a 2a 2a 20 28 77 68 69 63 68 20 6f 63 63  VE.** (which occ
16c00 75 72 73 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  urs during hot-j
16c10 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
16c20 2e 20 53 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a  . Summary:.**.**
16c30 20 20 20 54 72 61 6e 73 69 74 69 6f 6e 20 20 20     Transition   
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 20 20 20 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78       | Invokes x
16c60 42 75 73 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20  BusyHandler.**  
16c70 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
16c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e  ---------.**   N
16cb0 4f 5f 4c 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20  O_LOCK       -> 
16cc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20  SHARED_LOCK     
16cd0 20 7c 20 59 65 73 0a 2a 2a 20 20 20 53 48 41 52   | Yes.**   SHAR
16ce0 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53  ED_LOCK   -> RES
16cf0 45 52 56 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20  ERVED_LOCK    | 
16d00 4e 6f 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  No.**   SHARED_L
16d10 4f 43 4b 20 20 20 2d 3e 20 45 58 43 4c 55 53 49  OCK   -> EXCLUSI
16d20 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a  VE_LOCK   | No.*
16d30 2a 20 20 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  *   RESERVED_LOC
16d40 4b 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c  K -> EXCLUSIVE_L
16d50 4f 43 4b 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a  OCK   | Yes.**.*
16d60 2a 20 49 66 20 74 68 65 20 62 75 73 79 2d 68 61  * If the busy-ha
16d70 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 72  ndler callback r
16d80 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
16d90 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a   the lock is .**
16da0 20 72 65 74 72 69 65 64 2e 20 49 66 20 69 74 20   retried. If it 
16db0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68  returns zero, th
16dc0 65 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55  en the SQLITE_BU
16dd0 53 59 20 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72  SY error is.** r
16de0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
16df0 61 6c 6c 65 72 20 6f 66 20 74 68 65 20 70 61 67  aller of the pag
16e00 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
16e10 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16e20 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
16e30 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ler(.  Pager *pP
16e40 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
16e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16e60 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
16e70 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
16e80 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c 20 20 20  ler)(void *),   
16e90 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
16ea0 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
16eb0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
16ec0 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
16ed0 72 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  rArg            
16ee0 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
16ef0 74 6f 20 70 61 73 73 20 74 6f 20 78 42 75 73 79  to pass to xBusy
16f00 48 61 6e 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a  Handler */.){  .
16f10 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
16f20 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
16f30 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
16f40 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
16f50 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
16f60 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rg;.}../*.** Set
16f70 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
16f80 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
16f90 72 2e 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  r. If not NULL, 
16fa0 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65  the reinitialize
16fb0 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77  r.** is called w
16fc0 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
16fd0 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63  of a page in cac
16fe0 68 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 28  he is modified (
16ff0 72 65 73 74 6f 72 65 64 29 0a 2a 2a 20 61 73 20  restored).** as 
17000 70 61 72 74 20 6f 66 20 61 20 74 72 61 6e 73 61  part of a transa
17010 63 74 69 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69  ction or savepoi
17020 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 54 68 65  nt rollback. The
17030 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
17040 0a 2a 2a 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  .** higher-level
17050 20 63 6f 64 65 20 61 6e 20 6f 70 70 6f 72 74 75   code an opportu
17060 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
17070 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
17080 6e 20 74 6f 20 0a 2a 2a 20 61 67 72 65 65 20 77  n to .** agree w
17090 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
170a0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
170b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
170c0 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
170d0 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
170e0 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
170f0 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  e*)){.  pPager->
17100 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
17110 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  nit;.}../*.** Ch
17120 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69  ange the page si
17130 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50  ze used by the P
17140 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65  ager object. The
17150 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a   new page size .
17160 2a 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20  ** is passed in 
17170 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
17180 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
17190 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
171a0 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
171b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
171c0 64 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f  d, it.** is a no
171d0 2d 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72  -op. The value r
171e0 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65  eturned is the e
171f0 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
17200 20 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20   code (i.e. .** 
17210 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f  one of SQLITE_IO
17220 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
17230 55 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  UPT or SQLITE_FU
17240 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  LL)..**.** Other
17250 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20  wise, if all of 
17260 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
17270 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
17280 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73  * the new page s
17290 69 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70  ize (value of *p
172a0 50 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c  PageSize) is val
172b0 69 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20  id (a power .** 
172c0 20 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65      of two betwe
172d0 65 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54  en 512 and SQLIT
172e0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c  E_MAX_PAGE_SIZE,
172f0 20 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64   inclusive), and
17300 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65  .**.**   * there
17310 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
17320 69 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e  ing page referen
17330 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ces, and.**.**  
17340 20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20   * the database 
17350 69 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e  is either not an
17360 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
17370 61 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20  ase or it is.** 
17380 20 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79      an in-memory
17390 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63   database that c
173a0 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74  urrently consist
173b0 73 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e  s of zero pages.
173c0 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  .**.** then the 
173d0 70 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67  pager object pag
173e0 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
173f0 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a   *pPageSize..**.
17400 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73  ** If the page s
17410 69 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20  ize is changed, 
17420 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
17430 6f 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50  on uses sqlite3P
17440 61 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a  agerMalloc() .**
17450 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77   to obtain a new
17460 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
17470 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
17480 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65   allocation atte
17490 6d 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53  mpt .** fails, S
174a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72  QLITE_NOMEM is r
174b0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
174c0 70 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e  page size remain
174d0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a  s unchanged. .**
174e0 20 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61   In all other ca
174f0 73 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ses, SQLITE_OK i
17500 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
17510 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
17520 7a 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65  ze is not change
17530 64 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  d, either becaus
17540 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75  e one of the enu
17550 6d 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69  merated.** condi
17560 74 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e  tions above is n
17570 6f 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67  ot true, the pag
17580 65 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20  er was in error 
17590 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a  state when this.
175a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
175b0 63 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75  called, or becau
175c0 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  se the memory al
175d0 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
175e0 20 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65   failed, .** the
175f0 6e 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20  n *pPageSize is 
17600 73 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20  set to the old, 
17610 72 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69  retained page si
17620 7a 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ze before return
17630 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
17640 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
17650 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
17660 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a  r, u16 *pPageSiz
17670 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  e){.  int rc = p
17680 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
17690 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
176a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70  _OK ){.    u16 p
176b0 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65  ageSize = *pPage
176c0 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74  Size;.    assert
176d0 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c  ( pageSize==0 ||
176e0 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20   (pageSize>=512 
176f0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
17700 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
17710 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61  E) );.    if( pa
17720 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53 69  geSize && pageSi
17730 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65  ze!=pPager->page
17740 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70  Size .     && (p
17750 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20  Pager->memDb==0 
17760 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
17770 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71  e==0).     && sq
17780 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
17790 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
177a0 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a  che)==0 .    ){.
177b0 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77        char *pNew
177c0 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
177d0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67  e3PageMalloc(pag
177e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
177f0 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !pNew ){.     
17800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17810 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OMEM;.      }els
17820 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  e{.        pager
17830 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17840 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17850 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
17860 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ize;.        sql
17870 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
17880 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
17890 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
178a0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
178b0 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  w;.        sqlit
178c0 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
178d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
178e0 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
178f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17900 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28    *pPageSize = (
17910 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u16)pPager->page
17920 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
17930 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17940 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
17950 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
17960 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
17970 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
17980 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
17990 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
179a0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
179b0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
179c0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
179d0 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
179e0 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
179f0 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
17a00 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
17a10 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
17a20 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
17a30 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
17a40 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
17a50 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
17a60 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
17a70 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
17a80 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
17a90 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
17aa0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
17ab0 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
17ac0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
17ad0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
17ae0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17af0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
17b00 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
17b10 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
17b20 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
17b30 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
17b40 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
17b50 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
17b60 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
17b70 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
17b80 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
17b90 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
17ba0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
17bb0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
17bc0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
17bd0 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
17be0 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
17bf0 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
17c00 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
17c10 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
17c20 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
17c30 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
17c40 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
17c50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
17c60 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
17c70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
17c80 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17c90 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
17ca0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
17cb0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
17cc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
17cd0 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
17ce0 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
17cf0 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
17d00 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
17d10 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
17d20 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
17d30 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
17d40 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
17d50 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
17d60 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
17d70 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
17d80 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
17d90 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
17da0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
17db0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
17dc0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
17dd0 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
17de0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
17df0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
17e00 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
17e10 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
17e20 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
17e30 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
17e40 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
17e50 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
17e60 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
17e70 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
17e80 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
17e90 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
17ea0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
17eb0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
17ec0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
17ed0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
17ee0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
17ef0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
17f00 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
17f10 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
17f20 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
17f30 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
17f40 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
17f50 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
17f60 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
17f70 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
17f80 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
17f90 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
17fa0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
17fb0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
17fc0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
17fd0 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77 61   If the pager wa
17fe0 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74 72  s opened on a tr
17ff0 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a 46  ansient file (zF
18000 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72  ilename==""), or
18010 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20  .** opened on a 
18020 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20 4e  file less than N
18030 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
18040 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
18050 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61  r is.** zeroed a
18060 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
18070 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69 6f  urned. The ratio
18080 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69 73  nale for this is
18090 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20 66   that this .** f
180a0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
180b0 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
180c0 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61 20   headers, and a 
180d0 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f 72  new transient or
180e0 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20 64  .** zero sized d
180f0 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68 65  atabase has a he
18100 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69 73  ader than consis
18110 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a  ts entirely of z
18120 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eroes..**.** If 
18130 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70 61  any IO error apa
18140 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49  rt from SQLITE_I
18150 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
18160 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a  is encountered,.
18170 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  ** the error cod
18180 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  e is returned to
18190 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64 20   the caller and 
181a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
181b0 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75  the.** output bu
181c0 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ffer undefined..
181d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
181e0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
181f0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
18200 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
18210 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
18220 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18230 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
18240 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
18250 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
18260 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
18270 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
18280 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18290 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
182a0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
182b0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
182c0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
182d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
182e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
182f0 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
18300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
18310 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
18320 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18330 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
18340 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18360 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
18370 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
18380 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f  tabase file asso
18390 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
183a0 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  pPager. Normally
183b0 2c 20 74 68 69 73 20 69 73 20 63 61 6c 63 75 6c  , this is calcul
183c0 61 74 65 64 20 61 73 20 28 3c 64 62 20 66 69 6c  ated as (<db fil
183d0 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69  e size>/<page-si
183e0 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ze>)..** However
183f0 2c 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  , if the file is
18400 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 3c   between 1 and <
18410 70 61 67 65 2d 73 69 7a 65 3e 20 62 79 74 65 73  page-size> bytes
18420 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a   in size, then .
18430 2a 2a 20 74 68 69 73 20 69 73 20 63 6f 6e 73 69  ** this is consi
18440 64 65 72 65 64 20 61 20 31 20 70 61 67 65 20 66  dered a 1 page f
18450 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
18460 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
18470 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
18480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18490 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  called, then the
184a0 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61 74 65 20  .** error state 
184b0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
184c0 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61  turned and *pnPa
184d0 67 65 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  ge left unchange
184e0 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65  d. Or,.** if the
184f0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 68 61 73   file system has
18500 20 74 6f 20 62 65 20 71 75 65 72 69 65 64 20 66   to be queried f
18510 6f 72 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  or the size of t
18520 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  he file and.** t
18530 68 65 20 71 75 65 72 79 20 61 74 74 65 6d 70 74  he query attempt
18540 20 72 65 74 75 72 6e 73 20 61 6e 20 49 4f 20 65   returns an IO e
18550 72 72 6f 72 2c 20 74 68 65 20 49 4f 20 65 72 72  rror, the IO err
18560 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18570 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
18580 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
18590 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  nged..**.** Othe
185a0 72 77 69 73 65 2c 20 69 66 20 65 76 65 72 79 74  rwise, if everyt
185b0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
185c0 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ul, then SQLITE_
185d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
185e0 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73  * and *pnPage is
185f0 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
18600 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
18610 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
18620 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18630 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
18640 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
18650 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50  Page){.  Pgno nP
18660 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
18670 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
18680 65 74 75 72 6e 20 76 69 61 20 2a 70 6e 50 61 67  eturn via *pnPag
18690 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e */..  /* If th
186a0 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
186b0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
186c0 73 74 61 74 65 2c 20 72 65 74 75 72 6e 20 74 68  state, return th
186d0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f  e error code. */
186e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
186f0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
18700 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
18710 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
18720 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 75  Determine the nu
18730 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18740 20 74 68 65 20 66 69 6c 65 2e 20 53 74 6f 72 65   the file. Store
18750 20 74 68 69 73 20 69 6e 20 6e 50 61 67 65 2e 20   this in nPage. 
18760 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
18770 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a  >dbSizeValid ){.
18780 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
18790 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65  er->dbSize;.  }e
187a0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  lse{.    int rc;
187b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187c0 20 2f 2a 20 45 72 72 6f 72 20 72 65 74 75 72 6e   /* Error return
187d0 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65  ed by OsFileSize
187e0 28 29 20 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20  () */.    i64 n 
187f0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
18800 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a 65 20 69    /* File size i
18810 6e 20 62 79 74 65 73 20 72 65 74 75 72 6e 65 64  n bytes returned
18820 20 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29   by OsFileSize()
18830 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28   */..    assert(
18840 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
18850 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  fd) || pPager->t
18860 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
18870 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18880 2d 3e 66 64 29 20 26 26 20 28 30 20 21 3d 20 28  ->fd) && (0 != (
18890 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
188a0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
188b0 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20 20 20 20  d, &n))) ){.    
188c0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
188d0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
188e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
188f0 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
18900 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
18910 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  ize ){.      nPa
18920 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ge = 1;.    }els
18930 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
18940 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67   (Pgno)(n / pPag
18950 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18960 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
18970 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18980 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
18990 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
189a0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
189b0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
189c0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
189d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
189e0 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d  Valid = 1;.    }
189f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
18a00 65 20 63 75 72 72 65 6e 74 20 6e 75 6d 62 65 72  e current number
18a10 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18a20 20 66 69 6c 65 20 69 73 20 67 72 65 61 74 65 72   file is greater
18a30 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
18a40 63 6f 6e 66 69 67 75 72 65 64 20 6d 61 78 69 6d  configured maxim
18a50 75 6d 20 70 61 67 65 72 20 6e 75 6d 62 65 72 2c  um pager number,
18a60 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   increase the al
18a70 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20  lowed limit so. 
18a80 20 2a 2a 20 74 68 61 74 20 74 68 65 20 66 69 6c   ** that the fil
18a90 65 20 63 61 6e 20 62 65 20 72 65 61 64 2e 0a 20  e can be read.. 
18aa0 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61 67 65 3e   */.  if( nPage>
18ab0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29  pPager->mxPgno )
18ac0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
18ad0 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61  Pgno = (Pgno)nPa
18ae0 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ge;.  }..  /* Se
18af0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
18b00 69 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  iable and return
18b10 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20   SQLITE_OK */.  
18b20 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20  if( pnPage ){.  
18b30 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61 67    *pnPage = nPag
18b40 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
18b50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
18b60 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
18b70 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
18b80 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68  e locktype on th
18b90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18ba0 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72   If.** a similar
18bb0 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
18bc0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
18bd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
18be0 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72  is a no-op.** (r
18bf0 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
18c00 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e  OK immediately).
18c10 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
18c20 2c 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  , attempt to obt
18c30 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ain the lock usi
18c40 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  ng sqlite3OsLock
18c50 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74  (). Invoke .** t
18c60 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
18c70 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
18c80 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
18c90 61 69 6c 61 62 6c 65 2e 20 52 65 70 65 61 74 20  ailable. Repeat 
18ca0 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65 20 62 75  .** until the bu
18cb0 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
18cc0 72 6e 73 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  rns false or unt
18cd0 69 6c 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  il the attempt t
18ce0 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65  o .** obtain the
18cf0 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
18d00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
18d10 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
18d20 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
18d30 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
18d40 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
18d50 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ock. If the lock
18d60 20 69 73 20 6f 62 74 61 69 6e 65 64 20 73 75 63   is obtained suc
18d70 63 65 73 73 66 75 6c 6c 79 2c 20 73 65 74 20 74  cessfully, set t
18d80 68 65 20 50 61 67 65 72 2e 73 74 61 74 65 20 0a  he Pager.state .
18d90 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 6f 20 6c  ** variable to l
18da0 6f 63 6b 74 79 70 65 20 62 65 66 6f 72 65 20 72  ocktype before r
18db0 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
18dc0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
18dd0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
18de0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
18df0 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
18e00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
18e30 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  /..  /* The OS l
18e40 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
18e50 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
18e60 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
18e70 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
18e80 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
18e90 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18ea0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
18eb0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
18ec0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
18ed0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
18ee0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
18ef0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
18f00 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
18f10 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
18f20 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
18f30 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
18f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18f50 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
18f60 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
18f70 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
18f80 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
18f90 68 61 74 20 74 68 69 73 20 69 73 20 65 69 74 68  hat this is eith
18fa0 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61  er a no-op (beca
18fb0 75 73 65 20 74 68 65 20 72 65 71 75 65 73 74 65  use the requeste
18fc0 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20  d lock is .  ** 
18fd0 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6f 72  already held, or
18fe0 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 72 61 6e   one of the tran
18ff0 73 69 73 74 69 6f 6e 73 20 74 68 61 74 20 74 68  sistions that th
19000 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20  e busy-handler. 
19010 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b   ** may be invok
19020 65 64 20 64 75 72 69 6e 67 2c 20 61 63 63 6f 72  ed during, accor
19030 64 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d  ding to the comm
19040 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73  ent above.  ** s
19050 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
19060 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a  syhandler()..  *
19070 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61  /.  assert( (pPa
19080 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
19090 74 79 70 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  type).       || 
190a0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
190b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20  PAGER_UNLOCK && 
190c0 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f  locktype==PAGER_
190d0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
190e0 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  | (pPager->state
190f0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
19100 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41   && locktype==PA
19110 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
19120 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65   );..  if( pPage
19130 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
19140 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
19150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
19160 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
19170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19180 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
19190 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
191a0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
191b0 54 45 5f 42 55 53 59 20 26 26 20 70 50 61 67 65  TE_BUSY && pPage
191c0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28  r->xBusyHandler(
191d0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
191e0 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20  dlerArg) );.    
191f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19200 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
19210 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c  r->state = (u8)l
19220 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
19230 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
19240 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
19250 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
19260 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
19280 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
19290 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
192a0 69 6d 61 67 65 20 74 6f 20 6e 50 61 67 65 20 70  image to nPage p
192b0 61 67 65 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66  ages. This .** f
192c0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
192d0 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79   actually modify
192e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
192f0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a  le on disk. It .
19300 2a 2a 20 6a 75 73 74 20 73 65 74 73 20 74 68 65  ** just sets the
19310 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
19320 6f 66 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  of the pager obj
19330 65 63 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  ect so that the 
19340 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f 6e 20 77  .** truncation w
19350 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77 68 65 6e  ill be done when
19360 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
19370 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
19380 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  itted..*/.void s
19390 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
193a0 61 74 65 49 6d 61 67 65 28 50 61 67 65 72 20 2a  ateImage(Pager *
193b0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
193c0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
193d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
193e0 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
193f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
19400 6e 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  nPage );.  asser
19410 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19420 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19430 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   );.  pPager->db
19440 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a  Size = nPage;.}.
19450 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  ./*.** Shutdown 
19460 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
19470 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
19480 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66   and close all f
19490 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  iles..**.** If a
194a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
194b0 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65   in progress whe
194c0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
194d0 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a  s called, that.*
194e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
194f0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41   rolled back.  A
19500 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ll outstanding p
19510 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64  ages are invalid
19520 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69  ated.** and thei
19530 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65  r memory is free
19540 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  d.  Any attempt 
19550 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73  to use a page as
19560 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
19570 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65   this page cache
19580 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
19590 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c  tion returns wil
195a0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
195b0 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70  lt in a coredump
195c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
195d0 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63  ction always suc
195e0 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e  ceeds. If a tran
195f0 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
19600 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20  e an attempt.** 
19610 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20  is made to roll 
19620 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65  it back. If an e
19630 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
19640 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ng the rollback 
19650 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  .** a hot journa
19660 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e  l may be left in
19670 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20   the filesystem 
19680 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20  but no error is 
19690 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74  returned.** to t
196a0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e  he caller..*/.in
196b0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
196c0 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
196d0 72 29 7b 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  r){.  disable_si
196e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
196f0 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65  s();.  sqlite3Be
19700 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
19710 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
19720 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
19730 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
19740 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
19750 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
19760 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19770 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
19780 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
19790 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
197a0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
197b0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
197c0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
197d0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
197e0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
197f0 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
19800 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
19810 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
19820 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
19830 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
19840 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
19850 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
19860 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
19870 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
19880 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
19890 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
198a0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
198b0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
198c0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
198d0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
198e0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
198f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
19900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
19910 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e   -1;.    pagerUn
19920 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
19930 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
19940 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
19950 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c  alloc();.  enabl
19960 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
19970 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
19980 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
19990 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
199a0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
199b0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
199c0 20 70 50 61 67 65 72 29 29 0a 20 20 73 71 6c 69   pPager)).  sqli
199d0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
199e0 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  r->fd);.  sqlite
199f0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
19a00 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
19a10 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
19a20 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
19a30 68 65 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  he);..  assert( 
19a40 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  !pPager->aSavepo
19a50 69 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  int && !pPager->
19a60 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  pInJournal );.  
19a70 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
19a80 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
19a90 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
19aa0 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69  sjfd) );..  sqli
19ab0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
19ac0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19ad0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  E_OK;.}..#if !de
19ae0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
19af0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19b00 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
19b10 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
19b20 65 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e  er for page pPg.
19b30 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
19b40 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
19b50 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
19b60 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f  return pPg->pgno
19b70 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19b80 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
19b90 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
19ba0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
19bb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19bc0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
19bd0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
19be0 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a  cheRef(pPg);.}..
19bf0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
19c00 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72  ournal. In other
19c10 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
19c20 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
19c30 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
19c40 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
19c50 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
19c60 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
19c70 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
19c80 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61  e.** disk and ca
19c90 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e  n be restored in
19ca0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
19cb0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
19cc0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
19cd0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
19ce0 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65  c flag is not se
19cf0 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
19d00 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f  ction is a.** no
19d10 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
19d20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75  the actions requ
19d30 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74  ired depend on t
19d40 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a  he journal-mode.
19d50 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63  ** and the devic
19d60 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
19d70 73 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c  s of the the fil
19d80 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c  e-system, as fol
19d90 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
19da0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
19db0 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  ile is an in-mem
19dc0 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
19dd0 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64  , no action need
19de0 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e  .**     be taken
19df0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65  ..**.**   * Othe
19e00 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65  rwise, if the de
19e10 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
19e20 70 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41  pport the SAFE_A
19e30 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a  PPEND property,.
19e40 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20  **     then the 
19e50 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68  nRec field of th
19e60 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
19e70 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20  written journal 
19e80 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73  header.**     is
19e90 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74   updated to cont
19ea0 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ain the number o
19eb0 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  f journal record
19ec0 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20  s that have.**  
19ed0 20 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20     been written 
19ee0 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66  following it. If
19ef0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70   the pager is op
19f00 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d  erating in full-
19f10 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65  sync.**     mode
19f20 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
19f30 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65  al file is synce
19f40 64 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69  d before this fi
19f50 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a  eld is updated..
19f60 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  **.**   * If the
19f70 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74   device does not
19f80 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51   support the SEQ
19f90 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79  UENTIAL property
19fa0 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a  , then .**     j
19fb0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
19fc0 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ynced..**.** Or,
19fd0 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a   in pseudo-code:
19fe0 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54  .**.**   if( NOT
19ff0 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72   <in-memory jour
1a000 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69  nal> ){.**     i
1a010 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45  f( NOT SAFE_APPE
1a020 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69  ND ){.**       i
1a030 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f  f( <full-sync mo
1a040 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75  de> ) xSync(<jou
1a050 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20  rnal file>);.** 
1a060 20 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52        <update nR
1a070 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20  ec field>.**    
1a080 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e   } .**     if( N
1a090 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20  OT SEQUENTIAL ) 
1a0a0 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66  xSync(<journal f
1a0b0 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  ile>);.**   }.**
1a0c0 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65  .** The Pager.ne
1a0d0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e  edSync flag is n
1a0e0 65 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20  ever be set for 
1a0f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c  temporary files,
1a100 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20   or any.** file 
1a110 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d  operating in no-
1a120 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72  sync mode (Pager
1a130 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e  .noSync set to n
1a140 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20  on-zero)..**.** 
1a150 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
1a160 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
1a170 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  rs the PGHDR_NEE
1a180 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65  D_SYNC flag of e
1a190 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75  very .** page cu
1a1a0 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20  rrently held in 
1a1b0 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65  memory before re
1a1c0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f  turning SQLITE_O
1a1d0 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65  K. If an IO.** e
1a1e0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1a1f0 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f  red, then the IO
1a200 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1a210 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
1a220 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aller..*/.static
1a230 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
1a240 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1a250 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1a260 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61  eedSync ){.    a
1a270 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a280 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
1a290 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1a2a0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
1a2b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
1a2c0 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  Y ){.      int r
1a2d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1a300 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  /.      const in
1a310 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
1a320 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
1a330 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
1a340 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
1a350 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1a360 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20  >jfd) );..      
1a370 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1a380 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1a390 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
1a3a0 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69 4e 52   /* Variable iNR
1a3b0 65 63 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  ecOffset is set 
1a3c0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1a3d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a3e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
1a3f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
1a400 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1a410 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
1a420 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1a430 20 20 20 20 2a 2a 20 54 68 69 73 20 66 69 65 6c      ** This fiel
1a440 64 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  d will be update
1a450 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  d following the 
1a460 78 53 79 6e 63 28 29 20 6f 70 65 72 61 74 69 6f  xSync() operatio
1a470 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
1a480 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a490 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34  . */.        i64
1a4a0 20 69 4e 52 65 63 4f 66 66 73 65 74 20 3d 20 70   iNRecOffset = p
1a4b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1a4c0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
1a4d0 6e 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20 20 20  nalMagic);..    
1a4e0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63      /* This bloc
1a4f0 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e 20  k deals with an 
1a500 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e  obscure problem.
1a510 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   If the last con
1a520 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  nection.        
1a530 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74 6f  ** that wrote to
1a540 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77   this database w
1a550 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20  as operating in 
1a560 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e  persistent-journ
1a570 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  al.        ** mo
1a580 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1a590 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61 74  rnal file may at
1a5a0 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74 75   this point actu
1a5b0 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a 20  ally be larger. 
1a5c0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 50         ** than P
1a5d0 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
1a5e0 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e 65  bytes. If the ne
1a5f0 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65 20  xt thing in the 
1a600 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
1a610 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73 20  ** file happens 
1a620 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d  to be a journal-
1a630 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e 20  header (written 
1a640 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20  as part of the. 
1a650 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
1a660 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  us connections t
1a670 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64  ransaction), and
1a680 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65   a crash or powe
1a690 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20 20  r-failure .     
1a6a0 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66 74     ** occurs aft
1a6b0 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  er nRec is updat
1a6c0 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74 68  ed but before th
1a6d0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72  is connection wr
1a6e0 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  ites .        **
1a6f0 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74   anything else t
1a700 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1a710 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72  le (or commits/r
1a720 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a 20  olls back its . 
1a730 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61         ** transa
1a740 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c  ction), then SQL
1a750 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ite may become c
1a760 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f 69  onfused when doi
1a770 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
1a780 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  ** hot-journal r
1a790 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e  ollback followin
1a7a0 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20 6d  g recovery. It m
1a7b0 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c  ay roll back all
1a7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  .        ** of t
1a7d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  his connections 
1a7e0 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63 65  data, then proce
1a7f0 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61  ed to rolling ba
1a800 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20  ck the old,.    
1a810 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61      ** out-of-da
1a820 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c  te data that fol
1a830 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61 73  lows it. Databas
1a840 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
1a850 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
1a860 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
1a870 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65 20  nd this, if the 
1a880 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
1a890 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e 74  s appear to cont
1a8a0 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ain.        ** a
1a8b0 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66 6f   valid header fo
1a8c0 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f  llowing Pager.jo
1a8d0 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77  urnalOff, then w
1a8e0 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20 20  rite a 0x00.    
1a8f0 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 74      ** byte to t
1a900 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20 74  he start of it t
1a910 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72 6f  o prevent it fro
1a920 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a  m being recogniz
1a930 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ed..        **. 
1a940 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61 62         ** Variab
1a950 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  le iNextHdrOffse
1a960 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1a970 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68 20  offset at which 
1a980 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
1a990 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61 64  problematic head
1a9a0 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69  er will occur, i
1a9b0 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d 61  f it exists. aMa
1a9c0 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20 20  gic is used .   
1a9d0 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65 6d       ** as a tem
1a9e0 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
1a9f0 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69 72   inspect the fir
1aa00 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79 74  st couple of byt
1aa10 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  es of.        **
1aa20 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a   the potential j
1aa30 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
1aa40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1aa50 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f 66    i64 iNextHdrOf
1aa60 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  fset = journalHd
1aa70 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
1aa80 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d 61 67  .        u8 aMag
1aa90 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20 20 72  ic[8];.        r
1aaa0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
1aab0 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
1aac0 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78 74 48  Magic, 8, iNextH
1aad0 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  drOffset);.     
1aae0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1aaf0 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  E_OK && 0==memcm
1ab00 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
1ab10 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b 0a 20  alMagic, 8) ){. 
1ab20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
1ab30 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62 79 74  const u8 zerobyt
1ab40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1ab50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ab60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1ab70 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20  , &zerobyte, 1, 
1ab80 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b  iNextHdrOffset);
1ab90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1aba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1abb0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1abc0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
1abd0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EAD ){.         
1abe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1abf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1ac00 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
1ac10 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
1ac20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
1ac30 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
1ac40 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
1ac50 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
1ac60 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1ac70 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
1ac80 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
1ac90 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
1aca0 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
1acb0 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
1acc0 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
1acd0 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
1ace0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
1acf0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20  or rollback..   
1ad00 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1ad10 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  ** This is not r
1ad20 65 71 75 69 72 65 64 20 69 66 20 74 68 65 20 70  equired if the p
1ad30 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20  ersistent media 
1ad40 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20  supports the.   
1ad50 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50       ** SAFE_APP
1ad60 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65  END property. Be
1ad70 63 61 75 73 65 20 69 6e 20 74 68 69 73 20 63 61  cause in this ca
1ad80 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  se it is not pos
1ad90 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a  sible .        *
1ada0 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20 64 61  * for garbage da
1adb0 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65  ta to be appende
1adc0 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74  d to the file, t
1add0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20  he nRec field.  
1ade0 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75        ** is popu
1adf0 6c 61 74 65 64 20 77 69 74 68 20 30 78 46 46 46  lated with 0xFFF
1ae00 46 46 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a  FFFFF when the j
1ae10 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
1ae20 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20   written.       
1ae30 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65   ** and never ne
1ae40 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1ae50 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
1ae60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1ae70 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
1ae80 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
1ae90 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
1aea0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
1aeb0 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a 6f  RTRACE(("SYNC jo
1aec0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
1aed0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1aee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
1aef0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
1af00 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
1af10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1af20 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1af30 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1af40 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
1af50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1af60 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1af70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1af80 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1af90 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
1afa0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 69 4e 52  \n", pPager, iNR
1afb0 65 63 4f 66 66 73 65 74 2c 20 34 29 29 3b 0a 20  ecOffset, 4));. 
1afc0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
1afd0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1afe0 6a 66 64 2c 20 69 4e 52 65 63 4f 66 66 73 65 74  jfd, iNRecOffset
1aff0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
1b000 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b020 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b030 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
1b040 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
1b050 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20  EQUENTIAL) ){.  
1b060 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b070 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  (("SYNC journal 
1b080 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
1b090 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
1b0a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1b0b0 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1b0c0 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63 20  er)).        rc 
1b0d0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1b0e0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1b0f0 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c  ger->sync_flags|
1b100 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50 61   .          (pPa
1b110 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d  ger->sync_flags=
1b120 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1b130 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  L?SQLITE_SYNC_DA
1b140 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20  TAONLY:0).      
1b150 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
1b160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b180 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1b190 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
1b1a0 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75 63 63  le was just succ
1b1b0 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e  essfully synced.
1b1c0 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65 64 53   Set Pager.needS
1b1d0 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a  ync .    ** to z
1b1e0 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ero and clear th
1b1f0 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
1b200 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61  C flag on all pa
1b210 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  gess..    */.   
1b220 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1b230 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
1b240 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1b250 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
1b260 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
1b270 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
1b280 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
1b290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b2a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  ;.}../*.** The a
1b2b0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1b2c0 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64  irst in a linked
1b2d0 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70   list of dirty p
1b2e0 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a  ages connected.*
1b2f0 2a 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70  * by the PgHdr.p
1b300 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54  Dirty pointer. T
1b310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  his function wri
1b320 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20  tes each one of 
1b330 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
1b340 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69   pages in the li
1b350 73 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  st to the databa
1b360 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
1b370 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20  ument may.** be 
1b380 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69  NULL, representi
1b390 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74  ng an empty list
1b3a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1b3b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
1b3c0 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  ** a no-op..**.*
1b3d0 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74  * The pager must
1b3e0 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61   hold at least a
1b3f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77   RESERVED lock w
1b400 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1b410 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20  n.** is called. 
1b420 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61  Before writing a
1b430 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64  nything to the d
1b440 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1b450 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70  is lock.** is up
1b460 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43  graded to an EXC
1b470 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1b480 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
1b490 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20  be obtained,.** 
1b4a0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1b4b0 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64  eturned and no d
1b4c0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1b4d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b4e0 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ile..** .** If t
1b4f0 68 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65  he pager is a te
1b500 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e  mp-file pager an
1b510 64 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c  d the actual fil
1b520 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a  e-system file.**
1b530 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
1b540 2c 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20  , it is created 
1b550 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72  and opened befor
1b560 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a  e any data is .*
1b570 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a  * written out..*
1b580 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f  *.** Once the lo
1b590 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72  ck has been upgr
1b5a0 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63  aded and, if nec
1b5b0 65 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65  essary, the file
1b5c0 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20   opened,.** the 
1b5d0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
1b5e0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
1b5f0 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69  abase file in li
1b600 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e  st order. Writin
1b610 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73  g.** a page is s
1b620 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65  kipped if it mee
1b630 74 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  ts either of the
1b640 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
1b650 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ria:.**.**   * T
1b660 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
1b670 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50  s greater than P
1b680 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a  ager.dbSize, or.
1b690 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52  **   * The PGHDR
1b6a0 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67  _DONT_WRITE flag
1b6b0 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70   is set on the p
1b6c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  age..**.** If wr
1b6d0 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65  iting out a page
1b6e0 20 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61   causes the data
1b6f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
1b700 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53  w, Pager.dbFileS
1b710 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65  ize.** is update
1b720 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49  d accordingly. I
1b730 66 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74  f page 1 is writ
1b740 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68  ten out, then th
1b750 65 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a  e value cached.*
1b760 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c  * in Pager.dbFil
1b770 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74  eVers[] is updat
1b780 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ed to match the 
1b790 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64  new value stored
1b7a0 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   in.** the datab
1b7b0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
1b7c0 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  If everything is
1b7d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
1b7e0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1b7f0 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  ed. If an IO err
1b800 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61  or .** occurs, a
1b810 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
1b820 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  is returned. Or,
1b830 20 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56   if the EXCLUSIV
1b840 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a  E lock cannot.**
1b850 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51   be obtained, SQ
1b860 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
1b870 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1b880 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
1b890 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
1b8a0 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
1b8b0 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20   *pPager;       
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
1b8e0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1b910 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
1b920 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1b930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b940 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
1b950 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
1b960 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1b970 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
1b980 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1b990 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1b9a0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
1b9b0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
1b9c0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
1b9d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
1b9e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
1b9f0 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f   ** call is a no
1ba00 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  -op..  **.  ** M
1ba10 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
1ba20 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
1ba30 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
1ba40 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
1ba50 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
1ba60 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
1ba70 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
1ba80 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
1ba90 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
1baa0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
1bab0 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
1bac0 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
1bad0 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
1bae0 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
1baf0 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
1bb00 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
1bb10 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
1bb20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
1bb30 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
1bb40 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
1bb50 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
1bb60 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
1bb70 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
1bb80 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
1bb90 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
1bba0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
1bbb0 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
1bbc0 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
1bbd0 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
1bbe0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
1bbf0 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
1bc00 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
1bc10 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1bc20 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
1bc30 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
1bc40 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
1bc50 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
1bc60 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
1bc70 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
1bc80 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
1bc90 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
1bca0 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
1bcb0 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ack..  */.  asse
1bcc0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1bcd0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1bce0 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  D );.  rc = page
1bcf0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
1bd00 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
1bd10 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66  _LOCK);..  /* If
1bd20 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74   the file is a t
1bd30 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74  emp-file has not
1bd40 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
1bd50 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49  , open it now. I
1bd60 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f  t.  ** is not po
1bd70 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f  ssible for rc to
1bd80 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53   be other than S
1bd90 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73  QLITE_OK if this
1bda0 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20   branch.  ** is 
1bdb0 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f  taken, as pager_
1bdc0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69  wait_on_lock() i
1bdd0 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65  s a no-op for te
1bde0 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20  mp-files..  */. 
1bdf0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
1be00 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
1be10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1be20 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d  tempFile && rc==
1be30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
1be40 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74   rc = pagerOpent
1be50 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
1be60 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1be70 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  vfsFlags);.  }..
1be80 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1be90 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20  ITE_OK && pList 
1bea0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
1beb0 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a   = pList->pgno;.
1bec0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
1bed0 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
1bee0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
1bef0 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
1bf00 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
1bf10 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
1bf20 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
1bf30 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
1bf40 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61  uncateImage() wa
1bf50 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
1bf60 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
1bf70 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
1bf80 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
1bf90 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
1bfa0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
1bfb0 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
1bfc0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
1bfd0 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64  *.    ** Also, d
1bfe0 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20  o not write out 
1bff0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61  any page that ha
1c000 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54  s the PGHDR_DONT
1c010 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20  _WRITE flag.    
1c020 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73  ** set (set by s
1c030 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1c040 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a  rite())..    */.
1c050 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50      if( pgno<=pP
1c060 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
1c070 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
1c080 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
1c090 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
1c0a0 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  offset = (pgno-1
1c0b0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1c0c0 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
1c0d0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 77 72   /* Offset to wr
1c0e0 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  ite */.      cha
1c0f0 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
1c100 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
1c110 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 36 29  >pData, pgno, 6)
1c120 3b 20 2f 2a 20 44 61 74 61 20 74 6f 20 77 72 69  ; /* Data to wri
1c130 74 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  te */..      /* 
1c140 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70 61  Write out the pa
1c150 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  ge data. */.    
1c160 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1c170 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
1c180 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
1c190 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c1a0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  t);..      /* If
1c1b0 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73 74   page 1 was just
1c1c0 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
1c1d0 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
1c1e0 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20  s to match.     
1c1f0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e 6f   ** the value no
1c200 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  w stored in the 
1c210 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
1c220 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 0a  f writing this .
1c230 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63 61        ** page ca
1c240 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61 73  used the databas
1c250 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
1c260 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69 7a  update dbFileSiz
1c270 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  e. .      */.   
1c280 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
1c290 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1c2a0 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1c2b0 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d  Vers, &pData[24]
1c2c0 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
1c2d0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
1c2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c2f0 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62   pgno>pPager->db
1c300 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  FileSize ){.    
1c310 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69      pPager->dbFi
1c320 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20  leSize = pgno;. 
1c330 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
1c340 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63 6b   Update any back
1c350 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79 69  up objects copyi
1c360 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
1c370 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20 2a  of this pager. *
1c380 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
1c390 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61 67  ackupUpdate(pPag
1c3a0 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e  er->pBackup, pgn
1c3b0 6f 2c 20 28 75 38 20 2a 29 70 44 61 74 61 29 3b  o, (u8 *)pData);
1c3c0 0a 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ..      PAGERTRA
1c3d0 43 45 28 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE(("STORE %d pa
1c3e0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1c3f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c400 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1c410 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70  pPager), pgno, p
1c420 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
1c430 69 73 74 29 29 29 3b 0a 20 20 20 20 20 20 49 4f  ist)));.      IO
1c440 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
1c450 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1c460 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41  pgno));.      PA
1c470 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c480 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
1c490 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47  ount);.      PAG
1c4a0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1c4b0 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c  nWrite);.    }el
1c4c0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
1c4d0 52 41 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25  RACE(("NOSTORE %
1c4e0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c4f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c500 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66  gno));.    }.#if
1c510 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1c520 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74  _PAGES.    pList
1c530 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1c540 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1c550 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  t);.#endif.    p
1c560 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
1c570 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  irty;.  }..  ret
1c580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c590 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
1c5a0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c5b0 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
1c5c0 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
1c5d0 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
1c5e0 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
1c5f0 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
1c600 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
1c610 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
1c620 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
1c630 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
1c640 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
1c650 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
1c660 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1c670 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
1c680 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
1c690 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
1c6a0 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
1c6b0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1c6c0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1c6d0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
1c6e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
1c6f0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1c700 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
1c710 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
1c720 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
1c730 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
1c740 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
1c750 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
1c760 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
1c770 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
1c780 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
1c790 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
1c7a0 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
1c7b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
1c7c0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
1c7d0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
1c7e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c7f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c800 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1c810 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
1c820 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
1c830 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
1c840 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 69  Pg->pData;.    i
1c850 36 34 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67  64 offset = pPag
1c860 65 72 2d 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70  er->nSubRec*(4+p
1c870 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c880 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 44 61 74  ;.    char *pDat
1c890 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1c8a0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1c8b0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 0a 20 20 20  pgno, 7);.  .   
1c8c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
1c8d0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1c8e0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1c8f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1c900 70 67 6e 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61  pgno));.  .    a
1c910 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
1c920 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
1c930 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1c940 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
1c950 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1c960 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
1c970 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
1c980 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
1c990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c9a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c9b0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73  sWrite(pPager->s
1c9c0 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
1c9d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c9e0 66 66 73 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a  ffset+4);.    }.
1c9f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
1ca00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1ca10 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b  Pager->nSubRec++
1ca20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ca30 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
1ca40 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  >0 );.    rc = a
1ca50 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
1ca60 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67  vecs(pPager, pPg
1ca70 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73  ->pgno);.    tes
1ca80 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
1ca90 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65  E_OK );.  }.  re
1caa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1cab0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cac0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1cad0 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
1cae0 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
1caf0 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
1cb00 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
1cb10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1cb20 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1cb30 20 61 20 50 61 67 65 72 20 6f 62 6a 65 63 74 0a   a Pager object.
1cb40 2a 2a 20 28 63 61 73 74 20 61 73 20 61 20 76 6f  ** (cast as a vo
1cb50 69 64 2a 29 2e 20 54 68 65 20 70 61 67 65 72 20  id*). The pager 
1cb60 69 73 20 61 6c 77 61 79 73 20 27 70 75 72 67 65  is always 'purge
1cb70 61 62 6c 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e  able' (not an in
1cb80 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62  -memory.** datab
1cb90 61 73 65 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ase). The second
1cba0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 72   argument is a r
1cbb0 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 70 61  eference to a pa
1cbc0 67 65 20 74 68 61 74 20 69 73 20 0a 2a 2a 20 63  ge that is .** c
1cbd0 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20 62  urrently dirty b
1cbe0 75 74 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  ut has no outsta
1cbf0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
1cc00 2e 20 54 68 65 20 70 61 67 65 0a 2a 2a 20 69 73  . The page.** is
1cc10 20 61 6c 77 61 79 73 20 61 73 73 6f 63 69 61 74   always associat
1cc20 65 64 20 77 69 74 68 20 74 68 65 20 50 61 67 65  ed with the Page
1cc30 72 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  r object passed 
1cc40 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
1cc50 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
1cc60 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73   The job of this
1cc70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20   function is to 
1cc80 6d 61 6b 65 20 70 50 67 20 63 6c 65 61 6e 20 62  make pPg clean b
1cc90 79 20 77 72 69 74 69 6e 67 20 69 74 73 20 63 6f  y writing its co
1cca0 6e 74 65 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f  ntents.** out to
1ccb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ccc0 6c 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  le, if possible.
1ccd0 20 54 68 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76   This may involv
1cce0 65 20 73 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a  e syncing the.**
1ccf0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
1cd00 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
1cd10 66 75 6c 2c 20 73 71 6c 69 74 65 33 50 63 61 63  ful, sqlite3Pcac
1cd20 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1cd30 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70   called on the p
1cd40 61 67 65 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  age and.** SQLIT
1cd50 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1cd60 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1cd70 63 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e  curs while tryin
1cd80 67 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  g to make the.**
1cd90 20 70 61 67 65 20 63 6c 65 61 6e 2c 20 74 68 65   page clean, the
1cda0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1cdb0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
1cdc0 68 65 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62  he page cannot b
1cdd0 65 0a 2a 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20  e.** made clean 
1cde0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 72  for some other r
1cdf0 65 61 73 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72  eason, but no er
1ce00 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
1ce10 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1ce20 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1ce30 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1ce40 65 61 6e 28 29 20 69 73 20 6e 6f 74 20 63 61 6c  ean() is not cal
1ce50 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  led..*/.static i
1ce60 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
1ce70 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
1ce80 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
1ce90 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
1cea0 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
1ceb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1cec0 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  rt( pPg->pPager=
1ced0 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73  =pPager );.  ass
1cee0 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
1cef0 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a  PGHDR_DIRTY );..
1cf00 20 20 2f 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79    /* The doNotSy
1cf10 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 62  nc flag is set b
1cf20 79 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  y the sqlite3Pag
1cf30 65 72 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  erWrite() functi
1cf40 6f 6e 20 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a  on while it.  **
1cf50 20 69 73 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20   is journalling 
1cf60 61 20 73 65 74 20 6f 66 20 74 77 6f 20 6f 72 20  a set of two or 
1cf70 6d 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  more database pa
1cf80 67 65 73 20 74 68 61 74 20 61 72 65 20 73 74 6f  ges that are sto
1cf90 72 65 64 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  red.  ** on the 
1cfa0 73 61 6d 65 20 64 69 73 6b 20 73 65 63 74 6f 72  same disk sector
1cfb0 2e 20 53 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f  . Syncing the jo
1cfc0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c  urnal is not all
1cfd0 6f 77 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20  owed while.  ** 
1cfe0 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
1cff0 67 20 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72  g as it is impor
1d000 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65  tant that all me
1d010 6d 62 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a  mbers of such a.
1d020 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65    ** set of page
1d030 73 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20  s are synced to 
1d040 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53  disk together. S
1d050 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74  o, if the page t
1d060 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
1d070 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f 20 6d  * is trying to m
1d080 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72  ake clean will r
1d090 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1d0a0 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20 64 6f   sync and the do
1d0b0 4e 6f 74 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  NotSync.  ** fla
1d0c0 67 20 69 73 20 73 65 74 2c 20 72 65 74 75 72 6e  g is set, return
1d0d0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
1d0e0 6e 79 74 68 69 6e 67 2e 20 54 68 65 20 70 63 61  nything. The pca
1d0f0 63 68 65 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20  che layer will. 
1d100 20 2a 2a 20 6a 75 73 74 20 68 61 76 65 20 74 6f   ** just have to
1d110 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 61 6c   go ahead and al
1d120 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
1d130 65 20 62 75 66 66 65 72 20 69 6e 73 74 65 61 64  e buffer instead
1d140 20 6f 66 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67   of.  ** reusing
1d150 20 70 50 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   pPg..  **.  ** 
1d160 53 69 6d 69 6c 61 72 6c 79 2c 20 69 66 20 74 68  Similarly, if th
1d170 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
1d180 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
1d190 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
1d1a0 6e 6f 74 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20  not.  ** try to 
1d1b0 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
1d1c0 74 73 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73  ts of pPg to dis
1d1d0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  k..  */.  if( pP
1d1e0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
1d1f0 20 28 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53   (pPager->doNotS
1d200 79 6e 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67  ync && pPg->flag
1d210 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1d220 43 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  C) ){.    return
1d230 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d240 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
1d250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 72  ournal file if r
1d260 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
1d270 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1d280 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
1d290 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
1d2a0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1d2b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d2c0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
1d2d0 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
1d2e0 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72    !(pPager->jour
1d2f0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
1d300 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
1d310 59 29 20 26 26 0a 20 20 20 20 20 20 21 28 73 71  Y) &&.      !(sq
1d320 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1d330 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1d340 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
1d350 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1d360 44 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  D).    ){.      
1d370 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1d380 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1d390 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1d3a0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1d3b0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
1d3c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 69 73  e number of this
1d3d0 20 70 61 67 65 20 69 73 20 6c 61 72 67 65 72 20   page is larger 
1d3e0 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
1d3f0 20 73 69 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68   size of.  ** th
1d400 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1d410 2c 20 69 74 20 6d 61 79 20 6e 65 65 64 20 74 6f  , it may need to
1d420 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1d430 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a  he sub-journal..
1d440 20 20 2a 2a 20 54 68 69 73 20 69 73 20 62 65 63    ** This is bec
1d450 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
1d460 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1d470 65 6c 69 73 74 28 29 20 62 65 6c 6f 77 20 77 69  elist() below wi
1d480 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75  ll not.  ** actu
1d490 61 6c 6c 79 20 77 72 69 74 65 20 64 61 74 61 20  ally write data 
1d4a0 74 6f 20 74 68 65 20 66 69 6c 65 20 69 6e 20 74  to the file in t
1d4b0 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
1d4c0 20 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65   ** Consider the
1d4d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65   following seque
1d4e0 6e 63 65 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20  nce of events:. 
1d4f0 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e   **.  **   BEGIN
1d500 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72  ;.  **     <jour
1d510 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  nal page X>.  **
1d520 20 20 20 20 20 3c 6d 6f 64 69 66 79 20 70 61 67       <modify pag
1d530 65 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  e X>.  **     SA
1d540 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a  VEPOINT sp;.  **
1d550 20 20 20 20 20 20 20 3c 73 68 72 69 6e 6b 20 64         <shrink d
1d560 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1d570 59 20 70 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20  Y pages>.  **   
1d580 20 20 20 20 70 61 67 65 72 53 74 72 65 73 73 28      pagerStress(
1d590 70 61 67 65 20 58 29 0a 20 20 2a 2a 20 20 20 20  page X).  **    
1d5a0 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
1d5b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58  .  **.  ** If (X
1d5c0 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
1d5d0 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
1d5e0 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
1d5f0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
1d600 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20    ** out to the 
1d610 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 62  database file, b
1d620 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70  ut will be dropp
1d630 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  ed from the cach
1d640 65 2e 20 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f  e. Then,.  ** fo
1d650 6c 6c 6f 77 69 6e 67 20 74 68 65 20 22 52 4f 4c  llowing the "ROL
1d660 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 73 74 61  LBACK TO sp" sta
1d670 74 65 6d 65 6e 74 2c 20 72 65 61 64 69 6e 67 20  tement, reading 
1d680 70 61 67 65 20 58 20 77 69 6c 6c 20 72 65 61 64  page X will read
1d690 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1d6a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d6b0 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  e. This will be 
1d6c0 74 68 65 20 63 6f 70 79 20 6f 66 20 70 61 67 65  the copy of page
1d6d0 20 58 20 61 73 20 69 74 0a 20 20 2a 2a 20 77 61   X as it.  ** wa
1d6e0 73 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  s when the trans
1d6f0 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
1d700 6e 6f 74 20 61 73 20 69 74 20 77 61 73 20 77 68  not as it was wh
1d710 65 6e 20 22 53 41 56 45 50 4f 49 4e 54 20 73 70  en "SAVEPOINT sp
1d720 22 0a 20 20 2a 2a 20 77 61 73 20 65 78 65 63 75  ".  ** was execu
1d730 74 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ted..  **.  ** T
1d740 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
1d750 6f 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  o write the curr
1d760 65 6e 74 20 64 61 74 61 20 66 6f 72 20 70 61 67  ent data for pag
1d770 65 20 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  e X into the .  
1d780 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
1d790 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
1d7a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
1d7b0 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
1d7c0 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65   will.  ** be re
1d7d0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 63 75  stored to its cu
1d7e0 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68 65 6e  rrent value when
1d7f0 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54   the "ROLLBACK T
1d800 4f 20 73 70 22 20 69 73 20 0a 20 20 2a 2a 20 65  O sp" is .  ** e
1d810 78 65 63 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  xecuted..  */.  
1d820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d830 4b 20 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  K && pPg->pgno>p
1d840 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1d850 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
1d860 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 72 63  e(pPg) ){.    rc
1d870 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
1d880 65 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f  e(pPg);.  }..  /
1d890 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6e 74  * Write the cont
1d8a0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
1d8b0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1d8c0 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
1d8d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d8e0 4b 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44  K ){.    pPg->pD
1d8f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  irty = 0;.    rc
1d900 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1d910 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1d920 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1d930 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
1d940 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
1d950 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41  ITE_OK ){.    PA
1d960 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45 53  GERTRACE(("STRES
1d970 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  S %d page %d\n",
1d980 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d990 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1d9a0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1d9b0 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  MakeClean(pPg);.
1d9c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 61    }..  return pa
1d9d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
1d9e0 2c 20 72 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  , rc);.}.../*.**
1d9f0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
1da00 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 50  itialize a new P
1da10 61 67 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  ager object and 
1da20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
1da30 20 69 74 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67   it.** in *ppPag
1da40 65 72 2e 20 54 68 65 20 70 61 67 65 72 20 73 68  er. The pager sh
1da50 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
1da60 62 65 20 66 72 65 65 64 20 62 79 20 70 61 73 73  be freed by pass
1da70 69 6e 67 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c  ing it.** to sql
1da80 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
1da90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
1daa0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
1dab0 73 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  s the path to th
1dac0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1dad0 74 6f 20 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a  to open..** If z
1dae0 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
1daf0 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
1db00 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
1db10 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
1db20 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
1db30 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
1db40 61 63 68 65 64 2e 20 54 65 6d 70 6f 72 61 72 79  ached. Temporary
1db50 20 66 69 6c 65 73 20 61 72 65 20 62 65 20 64 65   files are be de
1db60 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74  leted.** automat
1db70 69 63 61 6c 6c 79 20 77 68 65 6e 20 74 68 65 79  ically when they
1db80 20 61 72 65 20 63 6c 6f 73 65 64 2e 20 49 66 20   are closed. If 
1db90 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
1dba0 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a  emory:" then .**
1dbb0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1dbc0 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
1dbd0 65 2e 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  e. It is never w
1dbe0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
1dbf0 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20  .** This can be 
1dc00 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
1dc10 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
1dc20 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1dc30 68 65 20 6e 45 78 74 72 61 20 70 61 72 61 6d 65  he nExtra parame
1dc40 74 65 72 20 73 70 65 63 69 66 69 65 73 20 74 68  ter specifies th
1dc50 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1dc60 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63  s of space alloc
1dc70 61 74 65 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69  ated.** along wi
1dc80 74 68 20 65 61 63 68 20 70 61 67 65 20 72 65 66  th each page ref
1dc90 65 72 65 6e 63 65 2e 20 54 68 69 73 20 73 70 61  erence. This spa
1dca0 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
1dcb0 74 6f 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 76  to the user.** v
1dcc0 69 61 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ia the sqlite3Pa
1dcd0 67 65 72 47 65 74 45 78 74 72 61 28 29 20 41 50  gerGetExtra() AP
1dce0 49 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61  I..**.** The fla
1dcf0 67 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 75  gs argument is u
1dd00 73 65 64 20 74 6f 20 73 70 65 63 69 66 79 20 70  sed to specify p
1dd10 72 6f 70 65 72 74 69 65 73 20 74 68 61 74 20 61  roperties that a
1dd20 66 66 65 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65  ffect the.** ope
1dd30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  ration of the pa
1dd40 67 65 72 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  ger. It should b
1dd50 65 20 70 61 73 73 65 64 20 73 6f 6d 65 20 62 69  e passed some bi
1dd60 74 77 69 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  twise combinatio
1dd70 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 50 41 47 45  n.** of the PAGE
1dd80 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61  R_OMIT_JOURNAL a
1dd90 6e 64 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44  nd PAGER_NO_READ
1dda0 4c 4f 43 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  LOCK flags..**.*
1ddb0 2a 20 54 68 65 20 76 66 73 46 6c 61 67 73 20 70  * The vfsFlags p
1ddc0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
1ddd0 74 6d 61 73 6b 20 74 6f 20 70 61 73 73 20 74 6f  tmask to pass to
1dde0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
1ddf0 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78  eter.** of the x
1de00 4f 70 65 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66  Open() method of
1de10 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 56 46   the supplied VF
1de20 53 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66  S when opening f
1de30 69 6c 65 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  iles. .**.** If 
1de40 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
1de50 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1de60 64 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  d the specified 
1de70 66 69 6c 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20  file opened .** 
1de80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 53 51  successfully, SQ
1de90 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1dea0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 72  ned and *ppPager
1deb0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1dec0 0a 2a 2a 20 74 68 65 20 6e 65 77 20 70 61 67 65  .** the new page
1ded0 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 20  r object. If an 
1dee0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
1def0 70 50 61 67 65 72 20 69 73 20 73 65 74 20 74 6f  pPager is set to
1df00 20 4e 55 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72   NULL.** and err
1df10 6f 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64  or code returned
1df20 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1df30 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1df40 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69  E_NOMEM.** (sqli
1df50 74 65 33 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75  te3Malloc() is u
1df60 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
1df70 6d 65 6d 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f  memory), SQLITE_
1df80 43 41 4e 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20  CANTOPEN or .** 
1df90 76 61 72 69 6f 75 73 20 53 51 4c 49 54 45 5f 49  various SQLITE_I
1dfa0 4f 5f 58 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f  O_XXX errors..*/
1dfb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1dfc0 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
1dfd0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1dfe0 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
1dff0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
1e000 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
1e010 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
1e020 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
1e030 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1e040 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
1e050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e060 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
1e070 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1e080 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1e090 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1e0a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1e0b0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
1e0c0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
1e0d0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
1e0e0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
1e0f0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
1e100 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
1e110 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
1e120 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
1e130 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
1e140 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
1e150 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
1e160 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  ) */.){.  u8 *pP
1e170 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
1e180 67 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ger = 0;       /
1e190 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 74  * Pager object t
1e1a0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  o allocate and r
1e1b0 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  eturn */.  int r
1e1c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1e1d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1e1e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70  de */.  int temp
1e1f0 46 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20  File = 0;       
1e200 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 65 6d   /* True for tem
1e210 70 20 66 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69  p files (incl. i
1e220 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 29 20  n-memory files) 
1e230 2a 2f 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  */.  int memDb =
1e240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1e250 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e260 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69   an in-memory fi
1e270 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64  le */.  int read
1e280 4f 6e 6c 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Only = 0;       
1e290 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
1e2a0 20 69 73 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   is a read-only 
1e2b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f  file */.  int jo
1e2c0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20  urnalFileSize;  
1e2d0 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61     /* Bytes to a
1e2e0 6c 6c 6f 63 61 74 65 20 66 6f 72 20 65 61 63 68  llocate for each
1e2f0 20 6a 6f 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20   journal fd */. 
1e300 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
1e310 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c   = 0;     /* Ful
1e320 6c 20 70 61 74 68 20 74 6f 20 64 61 74 61 62 61  l path to databa
1e330 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1e340 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20   nPathname = 0; 
1e350 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e360 6f 66 20 62 79 74 65 73 20 69 6e 20 7a 50 61 74  of bytes in zPat
1e370 68 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75  hname */.  int u
1e380 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61  seJournal = (fla
1e390 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f  gs & PAGER_OMIT_
1e3a0 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20  JOURNAL)==0; /* 
1e3b0 46 61 6c 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f  False to omit jo
1e3c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e  urnal */.  int n
1e3d0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
1e3e0 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
1e3f0 41 44 4c 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20  ADLOCK)!=0;  /* 
1e400 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 72 65 61  True to omit rea
1e410 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  d-lock */.  int 
1e420 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
1e430 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
1e440 3b 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73  ;       /* Bytes
1e450 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72   to allocate for
1e460 20 50 43 61 63 68 65 20 2a 2f 0a 20 20 75 31 36   PCache */.  u16
1e470 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
1e480 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1e490 45 5f 53 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61  E_SIZE;  /* Defa
1e4a0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  ult page size */
1e4b0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1e4c0 74 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65  t how much space
1e4d0 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
1e4e0 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69   each journal fi
1e4f0 6c 65 2d 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28  le-handle.  ** (
1e500 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 66  there are two of
1e510 20 74 68 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20   them, the main 
1e520 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65 20  journal and the 
1e530 73 75 62 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68  sub-journal). Th
1e540 69 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6d  is.  ** is the m
1e550 61 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71  aximum space req
1e560 75 69 72 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d  uired for an in-
1e570 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66  memory journal f
1e580 69 6c 65 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a  ile handle .  **
1e590 20 61 6e 64 20 61 20 72 65 67 75 6c 61 72 20 6a   and a regular j
1e5a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64  ournal file-hand
1e5b0 6c 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 61 20  le. Note that a 
1e5c0 22 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c  "regular journal
1e5d0 2d 68 61 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61  -handle".  ** ma
1e5e0 79 20 62 65 20 61 20 77 72 61 70 70 65 72 20 63  y be a wrapper c
1e5f0 61 70 61 62 6c 65 20 6f 66 20 63 61 63 68 69 6e  apable of cachin
1e600 67 20 74 68 65 20 66 69 72 73 74 20 70 6f 72 74  g the first port
1e610 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ion of the journ
1e620 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20  al.  ** file in 
1e630 6d 65 6d 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d  memory to implem
1e640 65 6e 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ent the atomic-w
1e650 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
1e660 6e 20 28 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75  n (see .  ** sou
1e670 72 63 65 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c  rce file journal
1e680 2e 63 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  .c)..  */.  if( 
1e690 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
1e6a0 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
1e6b0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1e6c0 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
1e6d0 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
1e6e0 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
1e6f0 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
1e700 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1e710 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75   = sqlite3MemJou
1e720 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a  rnalSize();.  }.
1e730 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75  .  /* Set the ou
1e740 74 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f  tput variable to
1e750 20 4e 55 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e   NULL in case an
1e760 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
1e770 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
1e780 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
1e790 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 66 75  and store the fu
1e7a0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61  ll pathname in a
1e7b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66  n allocated buff
1e7c0 65 72 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20  er pointed.  ** 
1e7d0 74 6f 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c  to by zPathname,
1e7e0 20 6c 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d   length nPathnam
1e7f0 65 2e 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69  e. Or, if this i
1e800 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
1e810 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62  le,.  ** leave b
1e820 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e  oth nPathname an
1e830 64 20 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20  d zPathname set 
1e840 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  to 0..  */.  if(
1e850 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
1e860 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1e870 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56    nPathname = pV
1e880 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
1e890 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20  ;.    zPathname 
1e8a0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1e8b0 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20  nPathname*2);.  
1e8c0 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d    if( zPathname=
1e8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1e8e0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1e8f0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
1e900 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
1e910 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
1e920 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
1e930 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
1e940 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
1e950 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b        zPathname[
1e960 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  0] = 0;.    }els
1e970 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
1e980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e990 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
1e9a0 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
1e9b0 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74   nPathname, zPat
1e9c0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  hname);.    }.. 
1e9d0 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73     nPathname = s
1e9e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e9f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Pathname);.    i
1ea00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ea10 20 26 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e   && nPathname+8>
1ea20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1ea30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1ea40 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
1ea50 6e 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  n when the journ
1ea60 61 6c 20 70 61 74 68 20 72 65 71 75 69 72 65 64  al path required
1ea70 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   by.      ** the
1ea80 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
1ea90 6f 70 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d  opened will be m
1eaa0 6f 72 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d  ore than pVfs->m
1eab0 78 50 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20  xPathname.      
1eac0 2a 2a 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  ** bytes in leng
1ead0 74 68 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  th. This means t
1eae0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
1eaf0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20  ot be opened,.  
1eb00 20 20 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c      ** as it wil
1eb10 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c  l not be possibl
1eb20 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1eb30 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76  urnal file or ev
1eb40 65 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63  en.      ** chec
1eb50 6b 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  k for a hot-jour
1eb60 6e 61 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69  nal before readi
1eb70 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ng..      */.   
1eb80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
1eb90 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20  ANTOPEN;.    }. 
1eba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ebb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ebc0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
1ebd0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
1ebe0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ebf0 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
1ec00 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
1ec10 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
1ec20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
1ec30 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
1ec40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
1ec50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ec60 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1ec70 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
1ec80 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
1ec90 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
1eca0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
1ecb0 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
1ecc0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ecd0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
1ece0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
1ecf0 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
1ed00 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
1ed10 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1ed20 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
1ed30 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1ed40 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
1ed50 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
1ed60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
1ed70 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
1ed80 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
1ed90 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
1eda0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1edb0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
1edc0 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
1edd0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
1ede0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
1edf0 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ee00 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
1ee10 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
1ee20 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
1ee30 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
1ee40 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
1ee60 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
1ee70 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
1ee80 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
1ee90 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73  allocZero(.    s
1eea0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
1eeb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1eec0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
1eed0 0a 20 20 20 20 70 63 61 63 68 65 53 69 7a 65 20  .    pcacheSize 
1eee0 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 20       +          
1eef0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
1ef00 74 20 2a 2f 0a 20 20 20 20 70 56 66 73 2d 3e 73  t */.    pVfs->s
1ef10 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20  zOsFile  +      
1ef20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
1ef30 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20   db file */.    
1ef40 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ef50 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  * 2 +       /* T
1ef60 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  he two journal f
1ef70 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 6e 50 61  iles */ .    nPa
1ef80 74 68 6e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20  thname + 1 +    
1ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
1efa0 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61  ename */.    nPa
1efb0 74 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20  thname + 8 + 1  
1efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
1efd0 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  rnal */.  );.  i
1efe0 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
1eff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1f000 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
1f010 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f020 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
1f040 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
1f050 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
1f060 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
1f070 50 74 72 20 2b 3d 20 73 69 7a 65 6f 66 28 2a 70  Ptr += sizeof(*p
1f080 50 61 67 65 72 29 29 3b 0a 20 20 70 50 61 67 65  Pager));.  pPage
1f090 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
1f0a0 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f0b0 3d 20 70 63 61 63 68 65 53 69 7a 65 29 3b 0a 20  = pcacheSize);. 
1f0c0 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
1f0d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f0e0 70 50 74 72 20 2b 3d 20 70 56 66 73 2d 3e 73 7a  pPtr += pVfs->sz
1f0f0 4f 73 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  OsFile);.  pPage
1f100 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
1f110 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
1f120 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
1f130 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
1f140 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
1f150 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
1f160 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 0a  rnalFileSize);..
1f170 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
1f180 20 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65   Pager.zFilename
1f190 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72   and Pager.zJour
1f1a0 6e 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20  nal buffers, if 
1f1b0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69  required. */.  i
1f1c0 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
1f1d0 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75      pPager->zJou
1f1e0 72 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29  rnal =   (char*)
1f1f0 28 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61  (pPtr += nPathna
1f200 6d 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d  me + 1);.    mem
1f210 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
1f220 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  ename, zPathname
1f230 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
1f240 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
1f250 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68  >zJournal, zPath
1f260 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
1f270 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
1f280 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
1f290 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
1f2a0 72 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 73  rnal", 8);.    s
1f2b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
1f2c0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50  hname);.  }.  pP
1f2d0 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
1f2e0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73  s;.  pPager->vfs
1f2f0 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73  Flags = vfsFlags
1f300 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
1f310 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a   pager file..  *
1f320 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1f330 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1f340 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20  ] && !memDb ){. 
1f350 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f370 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
1f380 20 72 65 74 75 72 6e 65 64 20 62 79 20 78 4f 70   returned by xOp
1f390 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63 20 3d  en() */.    rc =
1f3a0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1f3b0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
1f3c0 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
1f3d0 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20 26 66  fd, vfsFlags, &f
1f3e0 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64 4f 6e  out);.    readOn
1f3f0 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54  ly = (fout&SQLIT
1f400 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
1f410 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1f420 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
1f430 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
1f440 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
1f450 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68 6f 6f  ess,.    ** choo
1f460 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
1f470 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
1f480 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
1f490 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
1f4a0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
1f4b0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f4c0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
1f4d0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1f4e0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
1f4f0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
1f500 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1f510 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
1f520 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74  by sqlite3OsSect
1f530 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
1f540 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73 74     + The largest
1f550 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74 20   page size that 
1f560 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61  can be written a
1f570 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20 2a  tomically..    *
1f580 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f590 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
1f5a0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 73 65  Only ){.      se
1f5b0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
1f5c0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
1f5d0 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  t(SQLITE_DEFAULT
1f5e0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51 4c 49  _PAGE_SIZE<=SQLI
1f5f0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f600 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20  AGE_SIZE);.     
1f610 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3c   if( szPageDflt<
1f620 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1f630 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ze ){.        if
1f640 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
1f650 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
1f660 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f670 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
1f680 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
1f690 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f6a0 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
1f6b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f6c0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
1f6d0 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73 65 63  (u16)pPager->sec
1f6e0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
1f6f0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65   }.      }.#ifde
1f700 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f710 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1f720 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74     {.        int
1f730 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1f740 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1f750 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1f760 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  );.        int i
1f770 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  i;.        asser
1f780 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
1f790 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
1f7a0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  8));.        ass
1f7b0 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
1f7c0 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
1f7d0 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  36>>8));.       
1f7e0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
1f7f0 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
1f800 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
1f810 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a 50        for(ii=szP
1f820 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51 4c  ageDflt; ii<=SQL
1f830 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1f840 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69  PAGE_SIZE; ii=ii
1f850 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  *2){.          i
1f860 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
1f870 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
1f880 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >8)) ){.        
1f890 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d      szPageDflt =
1f8a0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ii;.          }
1f8b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f8c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1f8d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f8e0 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  If a temporary f
1f8f0 69 6c 65 20 69 73 20 72 65 71 75 65 73 74 65 64  ile is requested
1f900 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e  , it is not open
1f910 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
1f920 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
1f930 61 73 65 20 77 65 20 61 63 63 65 70 74 20 74 68  ase we accept th
1f940 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73  e default page s
1f950 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20 61 63  ize and delay ac
1f960 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70  tually.    ** op
1f970 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75  ening the file u
1f980 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 63  ntil the first c
1f990 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65 28 29  all to OsWrite()
1f9a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f9b0 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 61  This branch is a
1f9c0 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e 20 69  lso run for an i
1f9d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1f9e0 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  e. An in-memory.
1f9f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1fa00 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61  is the same as a
1fa10 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61 74 20   temp-file that 
1fa20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
1fa30 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64   out to.    ** d
1fa40 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61 6e 20  isk and uses an 
1fa50 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61  in-memory rollba
1fa60 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  ck journal..    
1fa70 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
1fa80 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1fa90 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1faa0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a  EXCLUSIVE;.  }..
1fab0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1fac0 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67 65 72  ng call to Pager
1fad0 53 65 74 50 61 67 65 73 69 7a 65 28 29 20 73 65  SetPagesize() se
1fae0 72 76 65 73 20 74 6f 20 73 65 74 20 74 68 65 20  rves to set the 
1faf0 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a 20 50  value of .  ** P
1fb00 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 61 6e  ager.pageSize an
1fb10 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  d to allocate th
1fb20 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  e Pager.pTmpSpac
1fb30 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f 0a 20  e buffer..  */. 
1fb40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1fb50 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1fb60 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d  ( pPager->memDb=
1fb70 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  =0 );.    rc = s
1fb80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
1fb90 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
1fba0 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 20  szPageDflt);.   
1fbb0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
1fbc0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1fbd0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
1fbe0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
1fbf0 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
1fc00 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
1fc10 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74  e .  ** Pager st
1fc20 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
1fc30 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  e the file..  */
1fc40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1fc50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1fc60 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d  rt( !pPager->pTm
1fc70 70 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71  pSpace );.    sq
1fc80 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1fc90 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71  ger->fd);.    sq
1fca0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1fcb0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
1fcc0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  c;.  }..  /* Ini
1fcd0 74 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63  tialize the PCac
1fce0 68 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  he object. */.  
1fcf0 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
1fd00 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
1fd10 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
1fd20 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74  eOpen(szPageDflt
1fd30 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62  , nExtra, !memDb
1fd40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1fd50 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67        !memDb?pag
1fd60 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69  erStress:0, (voi
1fd70 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67  d *)pPager, pPag
1fd80 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
1fd90 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50   PAGERTRACE(("OP
1fda0 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c  EN %d %s\n", FIL
1fdb0 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72  EHANDLEID(pPager
1fdc0 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a  ->fd), pPager->z
1fdd0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f  Filename));.  IO
1fde0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
1fdf0 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %s\n", pPager, p
1fe00 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1fe10 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73  ))..  pPager->us
1fe20 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
1fe30 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
1fe40 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
1fe50 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
1fe60 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
1fe70 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
1fe80 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
1fe90 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
1fea0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
1feb0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
1fec0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
1fed0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
1fee0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20  (u8)memDb;.  /* 
1fef0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ff00 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
1ff10 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1ff20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
1ff30 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
1ff40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
1ff50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  gno = SQLITE_MAX
1ff60 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f  _PAGE_COUNT;.  /
1ff70 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  * pPager->state 
1ff80 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20  = PAGER_UNLOCK; 
1ff90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1ffa0 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74  ger->state == (t
1ffb0 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f  empFile ? PAGER_
1ffc0 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45  EXCLUSIVE : PAGE
1ffd0 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f  R_UNLOCK) );.  /
1ffe0 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
1fff0 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
20000 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28  er->tempFile = (
20010 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61  u8)tempFile;.  a
20020 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d  ssert( tempFile=
20030 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
20040 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20  DE_NORMAL .     
20050 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65       || tempFile
20060 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
20070 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  ODE_EXCLUSIVE );
20080 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
20090 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
200a0 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70  LUSIVE==1 );.  p
200b0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
200c0 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46  Mode = (u8)tempF
200d0 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e  ile; .  pPager->
200e0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
200f0 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
20100 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  le;.  pPager->me
20110 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b  mDb = (u8)memDb;
20120 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
20130 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e  nly = (u8)readOn
20140 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
20150 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
20160 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
20170 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65  nc = (pPager->te
20180 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
20190 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70  urnal) ?1:0;.  p
201a0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
201b0 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  = pPager->noSync
201c0 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d   ?0:1;.  pPager-
201d0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51  >sync_flags = SQ
201e0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
201f0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
20200 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
20210 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
20220 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
20230 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
20240 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
20250 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45  ger->nExtra = nE
20260 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e  xtra;.  pPager->
20270 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
20280 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
20290 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c  T_JOURNAL_SIZE_L
202a0 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 20  IMIT;.  assert( 
202b0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
202c0 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65 20 29  d) || tempFile )
202d0 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a  ;.  setSectorSiz
202e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
202f0 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50   memDb ){.    pP
20300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20310 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
20320 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  LMODE_MEMORY;.  
20330 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78  }.  /* pPager->x
20340 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
20350 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
20360 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
20370 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
20380 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
20390 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
203a0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
203b0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
203c0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
203d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  SQLITE_OK;.}....
203e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
203f0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ion is called af
20400 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e  ter transitionin
20410 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55 4e 4c  g from PAGER_UNL
20420 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f  OCK to.** PAGER_
20430 53 48 41 52 45 44 20 73 74 61 74 65 2e 20 49 74  SHARED state. It
20440 20 74 65 73 74 73 20 69 66 20 74 68 65 72 65 20   tests if there 
20450 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
20460 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74   present in.** t
20470 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66  he file-system f
20480 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
20490 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  er. A hot journa
204a0 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 0a 2a  l is one that .*
204b0 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  * needs to be pl
204c0 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63 6f 72  ayed back. Accor
204d0 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66 75 6e  ding to this fun
204e0 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75  ction, a hot-jou
204f0 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65 78 69  rnal.** file exi
20500 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  sts if the follo
20510 77 69 6e 67 20 74 68 72 65 65 20 63 72 69 74 65  wing three crite
20520 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
20530 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
20540 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
20550 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
20560 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
20570 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20580 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
20590 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
205a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
205b0 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
205c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
205d0 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
205e0 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
205f0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ize..**.** If th
20600 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20610 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20620 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
20630 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
20640 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
20650 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
20660 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
20670 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
20680 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
20690 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 49 6e  he same name. In
206a0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 6a   this case the j
206b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 0a 2a  ournal file is.*
206c0 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 75  * just deleted u
206d0 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c 20 2a  sing OsDelete, *
206e0 70 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74  pExists is set t
206f0 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  o 0 and SQLITE_O
20700 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
20710 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20720 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70  tine does not op
20730 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
20740 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 69  ile to examine i
20750 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  ts.** content.  
20760 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e  Hence, the journ
20770 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
20780 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
20790 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
207a0 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 62   file that has b
207b0 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61 6e 64  een deleted, and
207c0 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f   hence not be ho
207d0 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65  t.  Or.** the he
207e0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
207f0 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a 65 72  nal might be zer
20800 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73 20 72  oed out.  This r
20810 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e  outine.** does n
20820 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68 65 73  ot discover thes
20830 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e  e cases of a non
20840 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69  -hot journal - i
20850 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  f the.** journal
20860 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e 64   file exists and
20870 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20 74 68   is not empty th
20880 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73 75 6d  is routine assum
20890 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e  es it.** is hot.
208a0 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79    The pager_play
208b0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 77  back() routine w
208c0 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74 68 61  ill discover tha
208d0 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  t the.** journal
208e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
208f0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c  lly hot and will
20900 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
20910 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
20920 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
20930 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
20940 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
20950 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
20960 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
20970 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
20980 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
20990 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
209a0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
209b0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
209c0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
209d0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
209e0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
209f0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
20a00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
20a10 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
20a20 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
20a30 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
20a40 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
20a50 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
20a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
20a70 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
20a80 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
20a90 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
20aa0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
20ab0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
20ac0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
20ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ae0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
20af0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
20b00 69 73 74 73 20 3d 20 30 3b 20 20 20 20 20 20 20  ists = 0;       
20b10 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20b20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
20b30 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
20b40 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
20b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20b60 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
20b70 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
20b80 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
20b90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
20ba0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
20bb0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
20bc0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
20bd0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
20be0 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 2a 70 45 78  ->fd) );..  *pEx
20bf0 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  ists = 0;.  rc =
20c00 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
20c10 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
20c20 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
20c30 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26  ACCESS_EXISTS, &
20c40 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20 72  exists);.  if( r
20c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20c60 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 72 63  exists ){.    rc
20c70 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63   = sqlite3OsChec
20c80 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
20c90 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65  ager->fd, &locke
20ca0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
20cb0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 6c 6f  SQLITE_OK && !lo
20cc0 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  cked ){.      in
20cd0 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  t nPage;.      r
20ce0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20cf0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
20d00 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
20d10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20d20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 69 66 28  OK ){.       if(
20d30 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
20d40 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
20d50 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
20d60 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
20d70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
20d80 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 45 78  {.          *pEx
20d90 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  ists = 1;.      
20da0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20db0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
20dc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
20dd0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72   the content for
20de0 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66   page pPg out of
20df0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20e00 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a 20  le and into .** 
20e10 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73 68  pPg->pData. A sh
20e20 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ared lock or gre
20e30 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65 6c  ater must be hel
20e40 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
20e50 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65  e.** file before
20e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20e70 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
20e80 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65 61  If page 1 is rea
20e90 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  d, then the valu
20ea0 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c  e of Pager.dbFil
20eb0 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20 74  eVers[] is set t
20ec0 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 72  o.** the value r
20ed0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
20ee0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
20ef0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
20f00 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
20f10 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72 65  e IO error is re
20f20 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
20f30 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77 69  ller..** Otherwi
20f40 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
20f50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
20f60 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
20f70 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
20f80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20f90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 20   = pPg->pPager; 
20fa0 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  /* Pager object 
20fb0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20fc0 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50 67  page pPg */.  Pg
20fd0 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  no pgno = pPg->p
20fe0 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50 61  gno;       /* Pa
20ff0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65 61  ge number to rea
21000 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
21030 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66  de */.  i64 iOff
21040 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
21050 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
21060 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f 20 72  set of file to r
21070 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20 20 61  ead from */..  a
21080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21090 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
210a0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  ED && !MEMDB );.
210b0 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
210c0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
210d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
210e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
210f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21100 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
21110 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74 20  ;.  }.  iOffset 
21120 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
21130 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21140 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
21150 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
21160 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  d, pPg->pData, p
21170 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
21180 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28   iOffset);.  if(
21190 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
211a0 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d  u8 *dbFileVers =
211b0 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61   &((u8*)pPg->pDa
211c0 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d  ta)[24];.    mem
211d0 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
211e0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
211f0 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  ers, sizeof(pPag
21200 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
21210 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
21220 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74  Pager, pPg->pDat
21230 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20 20  a, pgno, 3);..  
21240 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
21250 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
21260 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
21270 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
21280 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
21290 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
212a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
212b0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46    PAGERTRACE(("F
212c0 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20  ETCH %d page %d 
212d0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
212f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
21300 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
21310 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72  ash(pPg)));..  r
21320 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21330 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
21340 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
21350 76 65 72 20 74 68 65 20 75 70 70 65 72 20 6c 61  ver the upper la
21360 79 65 72 20 72 65 71 75 65 73 74 73 20 61 20 64  yer requests a d
21370 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65 20  atabase.** page 
21380 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 62 65  is requested, be
21390 66 6f 72 65 20 74 68 65 20 63 61 63 68 65 20 69  fore the cache i
213a0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
213b0 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a 2a 2a  suitable page.**
213c0 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69 73 20   or any data is 
213d0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
213e0 74 61 62 61 73 65 2e 20 49 74 20 70 65 72 66 6f  tabase. It perfo
213f0 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  rms the followin
21400 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74 69 6f  g.** two functio
21410 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ns:.**.**   1) I
21420 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63  f the pager is c
21430 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45  urrently in PAGE
21440 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28  R_UNLOCK state (
21450 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20  no lock held.** 
21460 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61       on the data
21470 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e  base file), then
21480 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
21490 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a  ade to obtain a.
214a0 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c  **      SHARED l
214b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
214c0 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69  ase file. Immedi
214d0 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
214e0 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  ining.**      th
214f0 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
21500 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69  he file-system i
21510 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20  s checked for a 
21520 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  hot-journal,.** 
21530 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c       which is pl
21540 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65  ayed back if pre
21550 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  sent. Following 
21560 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  any hot-journal 
21570 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63  .**      rollbac
21580 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  k, the contents 
21590 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65  of the cache are
215a0 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68   validated by ch
215b0 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  ecking.**      t
215c0 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74  he 'change-count
215d0 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65  er' field of the
215e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
215f0 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20  eader and.**    
21600 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74    discarded if t
21610 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f  hey are found to
21620 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a   be invalid..**.
21630 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70  **   2) If the p
21640 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
21650 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64  in exclusive-mod
21660 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
21670 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
21680 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e     no outstandin
21690 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
216a0 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69  any pages, and i
216b0 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73  s in the error s
216c0 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68  tate,.**      th
216d0 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
216e0 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74   made to clear t
216f0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62  he error state b
21700 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20  y discarding.** 
21710 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74       the content
21720 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61  s of the page ca
21730 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20  che and rolling 
21740 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f  back any open jo
21750 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69  urnal.**      fi
21760 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
21770 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72   operation descr
21780 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76  ibed by (2) abov
21790 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  e is not attempt
217a0 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a  ed, and if the.*
217b0 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  * pager is in an
217c0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
217d0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
217e0 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73  ULL when this is
217f0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20   called,.** the 
21800 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
21810 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
21820 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74  ed. It is permit
21830 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a  ted to read the.
21840 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e  ** database when
21850 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   in SQLITE_FULL 
21860 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
21870 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
21880 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
21890 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
218a0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
218b0 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72  . If an.** IO er
218c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
218d0 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74   locking the dat
218e0 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20  abase, checking 
218f0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
21900 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c  l.** file or rol
21910 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
21920 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f  nal file, the IO
21930 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
21940 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
21950 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
21960 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
21970 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
21980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
21990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
219a0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
219b0 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74  int isErrorReset
219c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
219d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
219e0 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72  covering from er
219f0 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20  ror state */..  
21a00 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
21a10 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f  ase is opened fo
21a20 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  r exclusive acce
21a30 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74  ss, has no outst
21a40 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67  anding .  ** pag
21a50 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64  e references and
21a60 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d   is in an error-
21a70 73 74 61 74 65 2c 20 74 68 69 73 20 69 73 20 61  state, this is a
21a80 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
21a90 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
21aa0 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
21ab0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
21ac0 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
21ad0 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
21ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
21af0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
21b00 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
21b10 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
21b20 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
21b30 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
21b40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
21b50 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70  pPCache)==0 && p
21b60 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a  Pager->errCode .
21b70 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f    ){.    if( isO
21b80 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
21b90 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f   ){.      isErro
21ba0 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20  rReset = 1;.    
21bb0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
21bc0 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
21bd0 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
21be0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
21bf0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
21c00 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61  er is still in a
21c10 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
21c20 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54  o not proceed. T
21c30 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73  he error .  ** s
21c40 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65  tate will be cle
21c50 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69  ared at some poi
21c60 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
21c70 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a   when all page .
21c80 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
21c90 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20  are dropped and 
21ca0 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65  the cache can be
21cb0 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f   discarded..  */
21cc0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
21cd0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
21ce0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
21cf0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
21d00 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
21d10 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Code;.  }..  if(
21d20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
21d30 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
21d40 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
21d50 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
21d60 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
21d70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20  Pager->pVfs;.   
21d80 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61   int isHotJourna
21d90 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
21da0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
21db0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21dc0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
21dd0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
21de0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  =0 );.    if( !p
21df0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
21e00 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
21e10 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
21e20 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
21e30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
21e40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
21e50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
21e60 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21e70 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
21e80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
21e90 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
21ea0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
21eb0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
21ec0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
21ed0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
21ee0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
21ef0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
21f00 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ED;.    }.    as
21f10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21f20 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
21f30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
21f40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
21f50 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
21f60 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
21f70 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
21f80 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
21f90 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
21fa0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
21fb0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
21fc0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
21fd0 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
21fe0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
21ff0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
22000 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e  ger, &isHotJourn
22010 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
22020 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22030 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
22040 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
22050 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72   }.    if( isErr
22060 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74  orReset || isHot
22070 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
22080 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
22090 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
220a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
220b0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
220c0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
220d0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
220e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
220f0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
22100 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
22110 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
22120 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
22130 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
22140 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
22150 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
22160 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
22170 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
22180 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
22190 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
221a0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
221b0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
221c0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
221d0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
221e0 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f  the .      ** ho
221f0 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a  t-journal back..
22200 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
22210 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
22220 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
22230 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
22240 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a   requested, any.
22250 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70        ** other p
22260 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e  rocess attemptin
22270 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  g to access the 
22280 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
22290 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20  ll get to .     
222a0 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69   ** this point i
222b0 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
222c0 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74  ail to obtain it
222d0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
222e0 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f  lock .      ** o
222f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22300 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
22310 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22320 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f  state<EXCLUSIVE_
22330 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
22340 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
22350 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
22360 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
22370 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
22380 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22390 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
223a0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
223b0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
223c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
223d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
223e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
223f0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
22400 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
22410 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
22420 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
22430 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
22440 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
22450 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
22460 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
22470 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
22480 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
22490 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  en and.      ** 
224a0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
224b0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
224c0 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
224d0 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
224e0 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
224f0 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
22500 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
22510 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
22520 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  uires.      ** a
22530 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
22540 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a   handle..      *
22550 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4f  /.      if( !isO
22560 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
22570 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
22580 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  res;.        rc 
22590 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
225a0 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a  s(pVfs,pPager->z
225b0 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41  Journal,SQLITE_A
225c0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65  CCESS_EXISTS,&re
225d0 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  s);.        if( 
225e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
225f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22600 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  es ){.          
22610 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a    int fout = 0;.
22620 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
22630 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  f = SQLITE_OPEN_
22640 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
22650 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
22660 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL;.            
22670 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22680 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20  >tempFile );.   
22690 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
226a0 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
226b0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
226c0 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
226d0 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20   f, &fout);.    
226e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
226f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22700 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
22710 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20  jfd) );.        
22720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
22730 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51  TE_OK && fout&SQ
22740 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
22750 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
22760 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22770 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20  CANTOPEN;.      
22780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
22790 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
227a0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  fd);.           
227b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
227c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
227d0 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
227e0 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
227f0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d  , that means som
22800 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
22810 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
22820 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65  as already rolle
22830 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20  d it back */.   
22840 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
22850 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
22860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
22870 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22880 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22890 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
228a0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
228b0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ..      /* TODO:
228c0 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20 63   Why are these c
228d0 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73 20  leared here? Is 
228e0 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f  it necessary? */
228f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
22900 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
22910 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
22920 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
22930 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
22940 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
22950 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
22960 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
22970 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
22980 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
22990 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
229a0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
229b0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
229c0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
229d0 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67   read lock. Purg
229e0 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66 6f  e the cache befo
229f0 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  re.      ** play
22a00 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74  ing back the hot
22a10 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74  -journal so that
22a20 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70   we don't end up
22a30 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61   with.      ** a
22a40 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
22a50 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ache..      */. 
22a60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22a70 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
22a80 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
22a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22aa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22ab0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22ac0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
22ad0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
22ae0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
22af0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d   (pPager->state=
22b00 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
22b10 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50            || (pP
22b20 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
22b30 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
22b40 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
22b50 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D).      );.    
22b60 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  }..    if( sqlit
22b70 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e  e3PcachePagecoun
22b80 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22b90 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  e)>0 ){.      /*
22ba0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
22bb0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
22bc0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
22bd0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
22be0 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
22bf0 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
22c00 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
22c10 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
22c20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
22c30 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
22c40 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
22c50 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
22c60 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20  se.      ** has 
22c70 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
22c80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
22c90 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
22ca0 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  sh the.      ** 
22cb0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  cache..      **.
22cc0 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73        ** Databas
22cd0 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74  e changes is det
22ce0 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67  ected by looking
22cf0 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67   at 15 bytes beg
22d00 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  inning.      ** 
22d10 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74  at offset 24 int
22d20 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65  o the file.  The
22d30 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73   first 4 of thes
22d40 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20  e 16 bytes are. 
22d50 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
22d60 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
22d70 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
22d80 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
22d90 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68  The.      ** oth
22da0 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
22db0 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
22dc0 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
22dd0 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  hen.      ** a c
22de0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
22df0 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
22e00 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
22e10 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
22e20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
22e30 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
22e40 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63   .      ** detec
22e50 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65  ted.  The chance
22e60 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65   of an undetecte
22e70 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73  d change is so s
22e80 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20  mall that.      
22e90 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67  ** it can be neg
22ea0 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  lected..      */
22eb0 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69  .      char dbFi
22ec0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
22ed0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
22ee0 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  )];.      sqlite
22ef0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
22f00 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20  pPager, 0);..   
22f10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
22f20 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
22f30 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
22f40 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
22f50 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
22f60 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
22f70 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
22f80 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
22f90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
22fa0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
22fb0 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52   IOTRACE(("CKVER
22fc0 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  S %p %d\n", pPag
22fd0 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  er, sizeof(dbFil
22fe0 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20  eVers)));.      
22ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
23000 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
23010 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69   &dbFileVers, si
23020 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
23030 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69  , 24);.        i
23040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
23060 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
23070 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
23080 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
23090 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20  (dbFileVers, 0, 
230a0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
230b0 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  s));.      }..  
230c0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
230d0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
230e0 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
230f0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
23100 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
23110 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
23120 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
23130 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
23140 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
23150 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
23160 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
23170 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61  ARED );.  }.. fa
23180 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  iled:.  if( rc!=
23190 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
231a0 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b   /* pager_unlock
231b0 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f  () is a no-op fo
231c0 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  r exclusive mode
231d0 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   and in-memory d
231e0 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20  atabases. */.   
231f0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
23200 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
23210 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23220 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
23230 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
23240 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61  hed zero, rollba
23250 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a  ck any active.**
23260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
23270 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
23280 72 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  r..*/ .static vo
23290 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  id pagerUnlockIf
232a0 55 6e 75 73 65 64 28 50 61 67 65 72 20 2a 70 50  Unused(Pager *pP
232b0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 73 71 6c  ager){.  if( sql
232c0 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
232d0 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
232e0 68 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 61  he)==0 ){.    pa
232f0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
23300 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
23310 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f 70 20  }.}../*.** Drop 
23320 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
23330 63 61 63 68 65 20 75 73 69 6e 67 20 73 71 6c 69  cache using sqli
23340 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 29 2e  te3PcacheDrop().
23350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 6d  .**.** If this m
23360 65 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 6e  eans there are n
23370 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69 74 68  ow no pages with
23380 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
23390 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 0a  hem, a rollback.
233a0 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ** occurs and th
233b0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
233c0 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f 76 65  tabase is remove
233d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
233e0 64 20 70 61 67 65 72 44 72 6f 70 50 61 67 65 28  d pagerDropPage(
233f0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
23400 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
23410 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73  pPg->pPager;.  s
23420 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
23430 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 55 6e  (pPg);.  pagerUn
23440 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
23450 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ger);.}../*.** A
23460 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
23470 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
23480 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
23490 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
234a0 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
234b0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
234c0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
234d0 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
234e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
234f0 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
23500 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
23510 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
23520 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
23530 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
23540 73 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  s pagerSharedLoc
23550 6b 28 29 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  k() to obtain a 
23560 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 0a 2a  SHARED lock on.*
23570 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
23580 69 6c 65 20 69 66 20 73 75 63 68 20 61 20 6c 6f  ile if such a lo
23590 63 6b 20 6f 72 20 67 72 65 61 74 65 72 20 69 73  ck or greater is
235a0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 68 65 6c   not already hel
235b0 64 2e 0a 2a 2a 20 54 68 69 73 20 6d 61 79 20 63  d..** This may c
235c0 61 75 73 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ause hot-journal
235d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 63   rollback or a c
235e0 61 63 68 65 20 70 75 72 67 65 2e 20 53 65 65 20  ache purge. See 
235f0 63 6f 6d 6d 65 6e 74 73 0a 2a 2a 20 61 62 6f 76  comments.** abov
23600 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65 72  e function pager
23610 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 66 6f 72  SharedLock() for
23620 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
23630 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
23640 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
23650 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69   in the cache, i
23660 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  t is returned. .
23670 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  ** Otherwise, a 
23680 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20  new page object 
23690 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
236a0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
236b0 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f  data.** read fro
236c0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
236d0 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73  ile. In some cas
236e0 65 73 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d  es, the pcache m
236f0 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f  odule may.** cho
23700 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63  ose not to alloc
23710 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f  ate a new page o
23720 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65  bject and may re
23730 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
23740 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e  ** object with n
23750 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
23760 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  ferences..**.** 
23770 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
23780 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
23790 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
237a0 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
237b0 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74   the .** first t
237c0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
237d0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
237e0 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 72 65  . If the page re
237f0 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61  quested is .** a
23800 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 61  lready in the ca
23810 63 68 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  che when this fu
23820 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
23830 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74 72 61  , then the extra
23840 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74  .** data is left
23850 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
23860 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20  the page object 
23870 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a  was last used..*
23880 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
23890 62 61 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d  base image is sm
238a0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
238b0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 6f 72  equested page or
238c0 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65   if a .** non-ze
238d0 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61 73 73  ro value is pass
238e0 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74  ed as the noCont
238f0 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e  ent parameter an
23900 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  d the .** reques
23910 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
23920 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64 20 69  already stored i
23930 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74 68 65  n the cache, the
23940 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20  n no .** actual 
23950 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73  disk read occurs
23960 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
23970 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
23980 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  of the .** page 
23990 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
239a0 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a  o all zeros. .**
239b0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
239c0 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
239d0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
239e0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
239f0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
23a00 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f  the page. This o
23a10 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70  ccurs in two sep
23a20 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a  erate scenarios:
23a30 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e  .**.**   a) When
23a40 20 72 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d   reading a free-
23a50 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 66  list leaf page f
23a60 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
23a70 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29  , and.**.**   b)
23a80 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
23a90 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  t is being rolle
23aa0 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65  d back and we ne
23ab0 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20  ed to load.**   
23ac0 20 20 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e     a new page in
23ad0 74 6f 20 74 68 65 20 63 61 63 68 65 20 74 6f 20  to the cache to 
23ae0 70 6f 70 75 6c 61 74 65 20 77 69 74 68 20 74 68  populate with th
23af0 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20  e data read.**  
23b00 20 20 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76      from the sav
23b10 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  epoint journal..
23b20 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
23b30 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
23b40 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 6e   the data return
23b50 65 64 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73  ed is zeroed ins
23b60 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67  tead of.** being
23b70 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
23b80 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
23b90 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20  nally, the bits 
23ba0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
23bb0 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65   to pgno in Page
23bc0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69  r.pInJournal (bi
23bd0 74 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c  tvec of pages al
23be0 72 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f  ready written to
23bf0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
23c00 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61  file) and the Pa
23c10 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
23c20 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
23c30 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a  s of any open.**
23c40 20 73 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20   savepoints are 
23c50 73 65 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  set. This means 
23c60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  if the page is m
23c70 61 64 65 20 77 72 69 74 61 62 6c 65 20 61 74 20  ade writable at 
23c80 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20  any.** point in 
23c90 74 68 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e  the future, usin
23ca0 67 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  g a call to sqli
23cb0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2c  te3PagerWrite(),
23cc0 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
23cd0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75   will not be jou
23ce0 72 6e 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76  rnaled. This sav
23cf0 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  es IO..**.** The
23d00 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
23d10 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
23d20 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
23d30 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
23d40 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
23d50 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
23d60 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
23d70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23d80 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
23d90 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
23da0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
23db0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
23dc0 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
23dd0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
23de0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
23df0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
23e00 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
23e10 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
23e20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
23e30 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
23e40 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
23e50 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
23e60 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
23e70 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
23e80 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
23e90 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
23ea0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
23eb0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
23ec0 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
23ed0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
23ee0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
23ef0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
23f00 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
23f10 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
23f20 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
23f30 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
23f40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
23f50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23f60 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
23f70 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
23f80 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
23f90 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
23fa0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
23fb0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
23fc0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
23fd0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
23fe0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
23ff0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
24000 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
24010 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
24020 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
24030 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
24040 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
24050 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
24060 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
24070 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  *pPg = 0;.  int 
24080 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61  rc;..  assert( a
24090 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74  ssert_pager_stat
240a0 65 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61  e(pPager) );.  a
240b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
240c0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
240d0 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c 20 73 71  CK .       || sq
240e0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
240f0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
24100 63 68 65 29 3e 30 20 0a 20 20 20 20 20 20 20 7c  che)>0 .       |
24110 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a  | pgno==1.  );..
24120 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
24130 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
24140 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
24150 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
24160 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
24170 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
24180 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
24190 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
241a0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
241b0 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
241c0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
241d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
241e0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
241f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
24200 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
24210 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
24220 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
24230 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
24240 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
24250 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
24260 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  *ppPage = 0;..  
24270 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
24280 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63  e first page acc
24290 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20  essed, then get 
242a0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20  a SHARED lock.  
242b0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
242c0 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68  se file. pagerSh
242d0 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20  aredLock() is a 
242e0 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61  no-op if .  ** a
242f0 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69   database lock i
24300 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a  s already held..
24310 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
24320 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67  rSharedLock(pPag
24330 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
24340 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
24360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24370 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
24380 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63 20 3d 20  LOCK );..  rc = 
24390 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
243a0 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
243b0 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20 26 70 50  he, pgno, 1, &pP
243c0 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  g);.  if( rc!=SQ
243d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
243e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
243f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
24400 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
24410 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
24420 3d 3d 70 50 61 67 65 72 20 7c 7c 20 70 50 67 2d  ==pPager || pPg-
24430 3e 70 50 61 67 65 72 3d 3d 30 20 29 3b 0a 20 20  >pPager==0 );.  
24440 69 66 28 20 70 50 67 2d 3e 70 50 61 67 65 72 3d  if( pPg->pPager=
24450 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
24460 20 70 61 67 65 72 20 63 61 63 68 65 20 68 61 73   pager cache has
24470 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 70   created a new p
24480 61 67 65 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  age. Its content
24490 20 6e 65 65 64 73 20 74 6f 20 0a 20 20 20 20 2a   needs to .    *
244a0 2a 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  * be initialized
244b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
244c0 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41 47 45 52   nMax;.    PAGER
244d0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
244e0 69 73 73 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  iss);.    pPg->p
244f0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
24500 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24510 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
24520 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
24530 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
24550 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24560 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74  (pPg);.      ret
24570 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
24580 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
24590 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
245a0 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
245b0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
245c0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
245d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
245e0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
245f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
24600 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
24610 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f    }.      if( no
24620 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
24630 20 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f     /* Failure to
24640 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e   set the bits in
24650 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62   the InJournal b
24660 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65  it-vectors is be
24670 6e 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a  nign..        **
24680 20 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73   It merely means
24690 20 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64   that we might d
246a0 6f 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72  o some extra wor
246b0 6b 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a  k to journal a .
246c0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
246d0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
246e0 65 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c  ed to be journal
246f0 65 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  ed.  Nevertheles
24700 73 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20  s, be sure .    
24710 20 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74      ** to test t
24720 68 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20  he case where a 
24730 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63  malloc error occ
24740 75 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67  urs while trying
24750 20 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20   to set .       
24760 20 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62   ** a bit in a b
24770 69 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20  it vector..     
24780 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
24790 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
247a0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
247b0 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67    if( pgno<=pPag
247c0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
247d0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54  {.          TEST
247e0 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c  ONLY( rc = ) sql
247f0 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
24800 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
24810 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
24820 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
24830 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
24840 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24850 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
24860 3d 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69  = ) addToSavepoi
24870 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
24880 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
24890 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
248a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
248b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
248c0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
248d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
248e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
248f0 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
24900 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
24910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
24920 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
24930 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
24940 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
24950 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24960 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
24970 65 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er );.      rc =
24980 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29   readDbPage(pPg)
24990 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
249a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
249b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
249c0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
249d0 20 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67      pagerDropPag
249e0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
249f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
24a00 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
24a10 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
24a20 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
24a30 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
24a40 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
24a50 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
24a60 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24a70 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
24a80 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
24a90 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
24aa0 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 7d  ager->nHit);.  }
24ab0 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  ..  *ppPage = pP
24ac0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
24ad0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
24ae0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
24af0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
24b00 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
24b10 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
24b20 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
24b30 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
24b40 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24b50 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
24b60 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
24b70 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20  s not in cache. 
24b80 41 6c 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69  Also, return 0 i
24b90 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20  f the .** pager 
24ba0 69 73 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  is in PAGER_UNLO
24bb0 43 4b 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  CK state when th
24bc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
24bd0 61 6c 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20  alled,.** or if 
24be0 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
24bf0 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
24c00 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
24c10 5f 46 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  _FULL..**.** See
24c20 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
24c30 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
24c40 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
24c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
24c60 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
24c70 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
24c80 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
24c90 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
24ca0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
24cb0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
24cc0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
24cd0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
24ce0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
24cf0 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
24d00 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
24d10 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
24d20 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
24d30 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
24d40 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
24d50 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
24d60 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
24d70 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
24d80 2a 70 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65  *pPg = 0;.  asse
24d90 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
24da0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
24db0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50  =0 );..  if( (pP
24dc0 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
24dd0 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26  ER_UNLOCK).   &&
24de0 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
24df0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  e==SQLITE_OK || 
24e00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
24e10 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20  =SQLITE_FULL).  
24e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
24e30 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
24e40 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
24e50 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a   0, &pPg);.  }..
24e60 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
24e70 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
24e80 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
24e90 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
24ea0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
24eb0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
24ec0 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
24ed0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
24ee0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
24ef0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
24f00 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
24f10 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
24f20 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
24f30 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
24f40 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
24f50 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
24f60 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64  removed..*/.void
24f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
24f80 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
24f90 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
24fa0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
24fb0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
24fc0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
24fd0 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
24fe0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
24ff0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
25000 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74   }.}../*.** If t
25010 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
25020 66 69 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  file has already
25030 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e   been opened, en
25040 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a  sure that the.**
25050 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   sub-journal fil
25060 65 20 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49  e is open too. I
25070 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
25080 61 6c 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a  al is not open,.
25090 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
250a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
250b0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
250c0 72 65 74 75 72 6e 65 64 20 69 66 20 65 76 65 72  returned if ever
250d0 79 74 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f  ything goes acco
250e0 72 64 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a  rding to plan. .
250f0 2a 2a 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45  ** An SQLITE_IOE
25100 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
25110 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
25120 20 61 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73   a call to .** s
25130 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66  qlite3OsOpen() f
25140 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ails..*/.static 
25150 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  int openSubJourn
25160 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
25170 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
25180 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
25190 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
251a0 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50  d) && !isOpen(pP
251b0 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20  ager->sjfd) ){. 
251c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
251d0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
251e0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
251f0 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71  MORY ){.      sq
25200 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
25210 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
25220 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25230 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
25240 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
25250 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
25260 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
25270 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
25280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25290 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
252a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
252b0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
252c0 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
252d0 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
252e0 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
252f0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
25300 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
25310 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25320 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
25330 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25340 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
25350 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
25360 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
25370 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
25380 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
25390 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
253a0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
253b0 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
253c0 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
253d0 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
253e0 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
253f0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
25400 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25410 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
25420 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
25430 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
25440 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
25450 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
25460 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
25470 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
25480 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
25490 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
254a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
254b0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
254c0 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
254d0 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
254e0 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
254f0 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
25500 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
25510 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
25520 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
25530 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
25540 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
25550 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
25560 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
25570 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25580 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
25590 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
255a0 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
255b0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
255c0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
255d0 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
255e0 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
255f0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
25600 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
25610 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
25620 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
25630 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
25640 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
25650 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
25660 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
25670 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
25680 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
25690 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
256a0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
256b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
256c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
256f0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
25700 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
25710 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
25720 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
25730 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
25740 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
25750 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25760 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
25770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25780 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
25790 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
257a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
257b0 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
257c0 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
257d0 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
257e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
257f0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
25800 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
25820 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
25830 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20    }..  /* TODO: 
25840 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
25850 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
25860 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
25870 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
25880 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
25890 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
258a0 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
258b0 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
258c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
258d0 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
258e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
258f0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
25900 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
25910 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
25920 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
25930 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
25940 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
25950 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
25960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25970 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
25980 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
25990 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
259a0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
259b0 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
259c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
259d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
259e0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
259f0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
25a00 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
25a10 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
25a20 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
25a30 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
25a40 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
25a50 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
25a60 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
25a70 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
25a80 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
25a90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
25aa0 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
25ab0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
25ac0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
25ad0 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
25ae0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
25af0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
25b00 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
25b10 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
25b20 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
25b30 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
25b40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
25b50 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
25b60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
25b70 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
25b80 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
25b90 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
25ba0 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
25bb0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
25bc0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
25bd0 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
25be0 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
25bf0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
25c00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25c10 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
25c20 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
25c30 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
25c40 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
25c50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
25c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25c70 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
25c80 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
25c90 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
25ca0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
25cb0 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
25cc0 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
25cd0 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
25ce0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
25cf0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
25d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
25d10 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
25d20 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
25d30 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
25d40 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
25d50 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
25d60 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
25d70 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
25d80 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
25d90 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25da0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
25db0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
25dc0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
25dd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
25de0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
25df0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
25e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
25e10 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
25e20 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
25e30 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
25e40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25e50 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  K && pPager->nSa
25e60 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72  vepoint ){.    r
25e70 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
25e80 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
25e90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25ea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
25eb0 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
25ec0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
25ed0 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
25ee0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
25ef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
25f00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
25f10 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
25f20 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
25f30 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
25f40 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
25f50 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
25f60 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25f70 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
25f80 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
25f90 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
25fa0 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
25fb0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
25fc0 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
25fd0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
25fe0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25ff0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
26000 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
26010 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
26020 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
26030 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
26040 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
26050 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
26060 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
26070 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
26080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
26090 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
260a0 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
260b0 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
260c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
260d0 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
260e0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
260f0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
26100 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
26110 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
26120 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
26130 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
26140 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
26150 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
26160 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
26170 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
26180 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
26190 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
261a0 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
261b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
261c0 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
261d0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
261e0 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
261f0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
26200 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
26210 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2f 0a 69 6e  art of it..*/.in
26220 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
26230 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
26240 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a  r, int exFlag){.
26250 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26260 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
26270 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
26280 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
26290 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
262a0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
262b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
262c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
262d0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
262e0 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21  ert( !MEMDB && !
262f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
26300 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74 61   );..    /* Obta
26310 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
26320 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26330 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
26340 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72  exFlag parameter
26350 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 2c  .    ** is true,
26360 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65 6c   then immediatel
26370 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20 74  y upgrade this t
26380 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  o an EXCLUSIVE l
26390 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20  ock. The.    ** 
263a0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
263b0 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73 65  lback can be use
263c0 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  d when upgrading
263d0 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49 56   to the EXCLUSIV
263e0 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62  E.    ** lock, b
263f0 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61  ut not when obta
26400 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52 56  ining the RESERV
26410 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ED lock..    */.
26420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26430 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
26440 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
26450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
26460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26470 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
26480 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
26490 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c  ;.      if( exFl
264a0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ag ){.        rc
264b0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
264c0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
264d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
264e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
264f0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
26500 69 72 65 64 20 6c 6f 63 6b 73 20 77 65 72 65 20  ired locks were 
26510 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62 74  successfully obt
26520 61 69 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65 20  ained, open the 
26530 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
26540 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 74 68  ile and write th
26550 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
26560 68 65 61 64 65 72 20 74 6f 20 69 74 2e 0a 20 20  header to it..  
26570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
26580 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
26590 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
265a0 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d  .     && pPager-
265b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
265c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
265d0 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  OFF .    ){.    
265e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
265f0 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
26600 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
26610 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
26620 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
26630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
26640 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
26650 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
26660 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
26670 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
26680 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20  mode the last.  
26690 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
266a0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
266b0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
266c0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
266d0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
266e0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
266f0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
26700 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
26710 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
26720 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
26730 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63  either was trunc
26740 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20  ated to 0 bytes 
26750 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61  or its header wa
26760 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69  s.    ** overwri
26770 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tten with zeros.
26780 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
26790 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
267a0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
267b0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  t( pPager->dbOri
267c0 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  gSize==0 );.    
267d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
267e0 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  pInJournal==0 );
267f0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
26800 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
26810 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  ger);.  }..  PAG
26820 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41  ERTRACE(("TRANSA
26830 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
26840 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
26850 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
26860 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
26870 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
26880 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
26890 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
268a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
268b0 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
268c0 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
268d0 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
268e0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
268f0 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
26900 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
26910 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
26920 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
26930 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
26940 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
26950 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
26960 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
26970 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
26980 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
26990 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
269a0 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
269b0 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
269c0 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
269d0 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
269e0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
269f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
26a00 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
26a10 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
26a20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
26a30 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26a40 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
26a50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
26a60 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
26a70 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
26a80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
26a90 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
26aa0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26ab0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
26ac0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
26ad0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26ae0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
26af0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
26b00 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
26b10 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
26b20 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
26b30 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
26b40 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
26b50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26b60 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
26b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
26b80 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
26b90 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
26ba0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
26bb0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
26bc0 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
26bd0 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
26be0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26bf0 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
26c00 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
26c10 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
26c20 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
26c30 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
26c40 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
26c50 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
26c60 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
26c70 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
26c80 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
26c90 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
26ca0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
26cb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
26cc0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
26cd0 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
26ce0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
26cf0 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
26d00 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
26d10 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
26d20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26d30 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
26d40 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
26d50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
26d60 67 69 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  gin(pPager, 0);.
26d70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26d80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26d90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
26da0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
26db0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
26dc0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
26dd0 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
26de0 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
26df0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
26e00 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
26e10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
26e20 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
26e30 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
26e40 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
26e50 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
26e60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
26e70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
26e80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26e90 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
26ea0 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  ied = 1;.  .    
26eb0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
26ec0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
26ed0 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
26ee0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
26ef0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
26f00 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
26f10 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
26f20 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
26f30 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
26f40 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
26f50 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
26f60 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
26f70 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
26f80 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e  .    if( !pageIn
26f90 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
26fa0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26fb0 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  fd) ){.      if(
26fc0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67   pPg->pgno<=pPag
26fd0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
26fe0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6b  {.        u32 ck
26ff0 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61  sum;.        cha
27000 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20  r *pData2;..    
27010 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
27020 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
27030 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
27040 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
27050 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
27060 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
27070 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
27080 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
27090 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  ifies.        **
270a0 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
270b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
270c0 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50  rt( pPg->pgno!=P
270d0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
270e0 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ger) );.        
270f0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
27100 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
27110 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
27120 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
27130 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
27140 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
27150 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
27160 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
27170 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
27180 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70  urnalOff, pPg->p
27190 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
271a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
271b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
271c0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
271d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
271e0 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
271f0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
27220 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20  urnalOff + 4);. 
27230 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
27240 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
27250 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
27260 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
27270 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27290 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
272a0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
272b0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
272c0 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  lOff, cksum);.  
272d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
272e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b  journalOff += 4;
272f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27300 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
27310 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
27320 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
27330 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
27340 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
27350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61  >journalOff, pPa
27360 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b  ger->pageSize));
27370 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49  .        PAGER_I
27380 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
27390 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
273a0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
273b0 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE(("JOURNAL %d
273c0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
273d0 63 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  c=%d hash(%08x)\
273e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
273f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
27400 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
27410 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67             ((pPg
27420 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
27430 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70  ED_SYNC)?1:0), p
27440 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
27450 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  g)));..        /
27460 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20  * Even if an IO 
27470 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f  or diskfull erro
27480 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  r occurred while
27490 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65   journalling the
274a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
274b0 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62   in the block ab
274c0 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65  ove, set the nee
274d0 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20  d-sync flag for 
274e0 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20  the page..      
274f0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
27500 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63  when the transac
27510 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
27520 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69  ack, the logic i
27530 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61  n.        ** pla
27540 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
27550 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74   will think that
27560 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
27570 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20  to be restored. 
27580 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65         ** in the
27590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
275a0 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72  And if an IO err
275b0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
275c0 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20  doing so,.      
275d0 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70    ** then corrup
275e0 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e  tion may follow.
275f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27600 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
27610 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
27620 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
27630 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
27640 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
27650 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
27660 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   1;.        }.. 
27670 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
27680 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
27690 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
276a0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
276b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
276c0 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
276d0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
276e0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
276f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27700 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
27730 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
27740 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
27750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27760 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
27770 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
27780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
27790 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
277a0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
277b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
277c0 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
277d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
277e0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
277f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
27800 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
27810 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
27820 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
27830 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
27840 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
27850 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27860 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
27870 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
27880 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
27890 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
278a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
278b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
278c0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
278d0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
278e0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
278f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
27900 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
27910 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
27920 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
27930 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
27940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
27950 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
27960 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
27970 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
27980 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
27990 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
279a0 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
279b0 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
279c0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
279d0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
279e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
279f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
27a00 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
27a10 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
27a20 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
27a30 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
27a40 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
27a50 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
27a60 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
27a70 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
27a80 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
27a90 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
27aa0 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
27ab0 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
27ac0 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
27ad0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
27ae0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
27af0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
27b00 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
27b10 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
27b20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
27b30 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
27b40 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
27b50 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
27b60 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
27b70 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
27b80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27b90 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
27ba0 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
27bb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
27bc0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
27bd0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
27be0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
27bf0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
27c00 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ==(PAGER_MJ_PGNO
27c10 28 70 50 61 67 65 72 29 2d 31 29 20 29 7b 0a 20  (pPager)-1) ){. 
27c20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
27c30 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ize++;.    }.  }
27c40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27c50 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
27c60 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
27c70 61 62 6c 65 2e 20 54 68 69 73 20 72 6f 75 74 69  able. This routi
27c80 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
27c90 64 20 62 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b  d before .** mak
27ca0 69 6e 67 20 63 68 61 6e 67 65 73 20 74 6f 20 61  ing changes to a
27cb0 20 70 61 67 65 2e 20 54 68 65 20 63 61 6c 6c 65   page. The calle
27cc0 72 20 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65  r must check the
27cd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a   return value .*
27ce0 2a 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  * of this functi
27cf0 6f 6e 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  on and be carefu
27d00 6c 20 6e 6f 74 20 74 6f 20 63 68 61 6e 67 65 20  l not to change 
27d10 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
27d20 6c 65 73 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f  less .** this ro
27d30 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
27d40 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
27d50 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
27d60 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
27d70 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
27d80 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
27d90 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
27da0 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
27db0 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
27dc0 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
27dd0 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
27de0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
27df0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
27e00 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
27e10 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
27e20 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
27e30 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
27e40 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
27e50 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
27e60 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
27e70 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
27e80 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
27e90 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ode is returned.
27ea0 2a 2a 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ** as appropriat
27eb0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
27ec0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
27ed0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27ee0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
27ef0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
27f00 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
27f10 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
27f20 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
27f30 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27f40 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
27f50 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
27f60 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
27f70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
27f80 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
27f90 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
27fa0 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
27fb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
27fc0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
27fd0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
27fe0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
27ff0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
28000 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
28010 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
28020 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
28030 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
28040 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
28050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28060 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
28070 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
28080 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
28090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
280a0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
280b0 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ter */.    int n
280c0 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 20 20 20  eedSync = 0;    
280d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
280e0 61 6e 79 20 70 61 67 65 20 68 61 73 20 50 47 48  any page has PGH
280f0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a  DR_NEED_SYNC */.
28100 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
28110 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
28120 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
28130 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
28140 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
28150 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
28160 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
28170 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
28180 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
28190 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
281a0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
281b0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
281c0 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
281d0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
281e0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
281f0 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
28200 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
28210 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
28220 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
28230 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
28240 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
28250 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
28260 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
28270 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
28280 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
28290 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
282a0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
282b0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
282c0 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
282d0 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
282e0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
282f0 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69  ) + 1;..    sqli
28300 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
28310 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
28320 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
28330 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
28340 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
28350 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
28360 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
28370 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28380 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
28390 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
283a0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
283b0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
283c0 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
283d0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
283e0 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
283f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
28400 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
28410 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
28420 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
28430 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
28440 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
28450 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
28460 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
28470 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
28480 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
28490 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
284a0 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
284b0 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
284c0 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
284d0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
284e0 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
284f0 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
28500 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
28510 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
28520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28530 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
28540 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
28550 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28560 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28570 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
28580 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
28590 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
285a0 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
285b0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
285d0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
285e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
285f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
28600 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
28610 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
28620 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
28630 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28640 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
28660 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
28670 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
28680 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
28690 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
286a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
286b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
286c0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
286d0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
286e0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
286f0 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
28700 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
28710 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
28720 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20 66  NC flag is set f
28730 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50  or any of the nP
28740 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a  age pages .    *
28750 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  * starting at pg
28760 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73  1, then it needs
28770 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61   to be set for a
28780 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61  ll of them. Beca
28790 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69  use.    ** writi
287a0 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ng to any of the
287b0 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d  se nPage pages m
287c0 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74  ay damage the ot
287d0 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a  hers, the.    **
287e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
287f0 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28  st contain sync(
28800 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c  )ed copies of al
28810 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a  l of them.    **
28820 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74   before any of t
28830 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74  hem can be writt
28840 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61  en out to the da
28850 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
28860 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
28870 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
28880 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
28890 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
288a0 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  0 );.      for(i
288b0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
288c0 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29   needSync; ii++)
288d0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
288e0 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
288f0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
28900 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
28910 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
28920 20 20 20 20 20 20 70 50 61 67 65 2d 3e 66 6c 61        pPage->fla
28930 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
28940 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
28950 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28960 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
28970 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
28980 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
28990 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
289a0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
289b0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
289c0 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
289d0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
289e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
289f0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
28a00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
28a10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28a20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
28a30 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
28a40 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
28a50 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
28a60 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
28a70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28a80 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
28a90 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
28aa0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
28ab0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
28ac0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
28ad0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
28ae0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
28af0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28b00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
28b10 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
28b20 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
28b30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
28b40 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
28b50 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
28b60 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
28b70 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
28b80 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
28b90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
28ba0 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
28bb0 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
28bc0 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
28bd0 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
28be0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
28bf0 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
28c00 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
28c10 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
28c20 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
28c30 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
28c40 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
28c50 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
28c60 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
28c70 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
28c80 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
28c90 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
28ca0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
28cb0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
28cc0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
28cd0 6e 75 73 65 64 2e 20 54 68 65 20 70 61 67 65 72  nused. The pager
28ce0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
28cf0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
28d00 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
28d10 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
28d20 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
28d30 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
28d40 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
28d50 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
28d60 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a  peed of large .*
28d70 2a 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  * DELETE operati
28d80 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ons..*/.void sql
28d90 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
28da0 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
28db0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
28dc0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
28dd0 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73   if( (pPg->flags
28de0 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
28df0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
28e00 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41  int==0 ){.    PA
28e10 47 45 52 54 52 41 43 45 28 28 22 44 4f 4e 54 5f  GERTRACE(("DONT_
28e20 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
28e30 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
28e40 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
28e50 72 29 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  r)));.    IOTRAC
28e60 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
28e70 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
28e80 3e 70 67 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d  >pgno)).    pPg-
28e90 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
28ea0 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64  DONT_WRITE;.#ifd
28eb0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
28ec0 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70  PAGES.    pPg->p
28ed0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
28ee0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
28ef0 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  endif.  }.}../*.
28f00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
28f10 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
28f20 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
28f30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28f40 20 66 69 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65   file .** change
28f50 2d 63 6f 75 6e 74 65 72 2c 20 73 74 6f 72 65 64  -counter, stored
28f60 20 61 73 20 61 20 34 2d 62 79 74 65 20 62 69 67   as a 4-byte big
28f70 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
28f80 73 74 61 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20  starting at .** 
28f90 62 79 74 65 20 6f 66 66 73 65 74 20 32 34 20 6f  byte offset 24 o
28fa0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
28fb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
28fc0 73 44 69 72 65 63 74 20 66 6c 61 67 20 69 73 20  sDirect flag is 
28fd0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
28fe0 69 73 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69  is done by calli
28ff0 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ng .** sqlite3Pa
29000 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 70 61  gerWrite() on pa
29010 67 65 20 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66  ge 1, then modif
29020 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
29030 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  s of the.** page
29040 20 64 61 74 61 2e 20 49 6e 20 74 68 69 73 20 63   data. In this c
29050 61 73 65 20 74 68 65 20 66 69 6c 65 20 77 69 6c  ase the file wil
29060 6c 20 62 65 20 75 70 64 61 74 65 64 20 77 68 65  l be updated whe
29070 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  n the current.**
29080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
29090 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
290a0 20 54 68 65 20 69 73 44 69 72 65 63 74 20 66 6c   The isDirect fl
290b0 61 67 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e  ag may only be n
290c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c  on-zero if the l
290d0 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
290e0 6c 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  led.** with the 
290f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
29100 4f 4d 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f  OMIC_WRITE macro
29110 20 64 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69   defined. In thi
29120 73 20 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73  s case,.** if is
29130 44 69 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65  Direct is non-ze
29140 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ro, then the dat
29150 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 70  abase file is up
29160 64 61 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a  dated directly.*
29170 2a 20 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20  * by writing an 
29180 75 70 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20  updated version 
29190 6f 66 20 70 61 67 65 20 31 20 75 73 69 6e 67 20  of page 1 using 
291a0 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a  a call to the .*
291b0 2a 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  * sqlite3OsWrite
291c0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
291d0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
291e0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
291f0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
29200 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d  r, int isDirectM
29210 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ode){.  int rc =
29220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
29230 2a 20 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e  * Declare and in
29240 69 74 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e  itialize constan
29250 74 20 69 6e 74 65 67 65 72 20 27 69 73 44 69 72  t integer 'isDir
29260 65 63 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a  ect'. If the.  *
29270 2a 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  * atomic-write o
29280 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65  ptimization is e
29290 6e 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62  nabled in this b
292a0 75 69 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72  uild, then isDir
292b0 65 63 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74  ect.  ** is init
292c0 69 61 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76  ialized to the v
292d0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
292e0 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20  he isDirectMode 
292f0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74  parameter.  ** t
29300 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
29310 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 69   Otherwise, it i
29320 73 20 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20  s always set to 
29330 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  zero..  **.  ** 
29340 54 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74  The idea is that
29350 20 69 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77   if the atomic-w
29360 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
29370 6e 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e  n is not.  ** en
29380 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
29390 20 74 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69   time, the compi
293a0 6c 65 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65  ler can omit the
293b0 20 74 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27   tests of.  ** '
293c0 69 73 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c  isDirect' below,
293d0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
293e0 62 6c 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69  block enclosed i
293f0 6e 20 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20  n the.  ** "if( 
29400 69 73 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64  isDirect )" cond
29410 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ition..  */.#ifn
29420 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
29430 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
29440 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72   const int isDir
29450 65 63 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ect = 0;.  asser
29460 74 28 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3d  t( isDirectMode=
29470 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  =0 );.  UNUSED_P
29480 41 52 41 4d 45 54 45 52 28 69 73 44 69 72 65 63  ARAMETER(isDirec
29490 74 4d 6f 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20  tMode);.#else.  
294a0 63 6f 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65  const int isDire
294b0 63 74 20 3d 20 69 73 44 69 72 65 63 74 4d 6f 64  ct = isDirectMod
294c0 65 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  e;.#endif..  ass
294d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
294e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
294f0 45 44 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ED );.  if( !pPa
29500 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
29510 44 6f 6e 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Done && pPager->
29520 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
29530 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 20 20  PgHdr *pPgHdr;  
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29550 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   Reference to pa
29560 67 65 20 31 20 2a 2f 0a 20 20 20 20 75 33 32 20  ge 1 */.    u32 
29570 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20  change_counter; 
29580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
29590 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 63 68  tial value of ch
295a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65  ange-counter fie
295b0 6c 64 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ld */..    asser
295c0 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  t( !pPager->temp
295d0 46 69 6c 65 20 26 26 20 69 73 4f 70 65 6e 28 70  File && isOpen(p
295e0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20  Pager->fd) );.. 
295f0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
29600 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
29610 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
29620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29630 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
29640 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
29650 61 73 73 65 72 74 28 20 70 50 67 48 64 72 3d 3d  assert( pPgHdr==
29660 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
29670 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  OK );..    /* If
29680 20 70 61 67 65 20 6f 6e 65 20 77 61 73 20 66 65   page one was fe
29690 74 63 68 65 64 20 73 75 63 63 65 73 73 66 75 6c  tched successful
296a0 6c 79 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e  ly, and this fun
296b0 63 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20  ction is not.   
296c0 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 69 6e   ** operating in
296d0 20 64 69 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61   direct-mode, ma
296e0 6b 65 20 70 61 67 65 20 31 20 77 72 69 74 61 62  ke page 1 writab
296f0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
29700 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29710 20 26 26 20 21 69 73 44 69 72 65 63 74 20 29 7b   && !isDirect ){
29720 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
29730 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
29740 67 48 64 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  gHdr);.    }..  
29750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
29770 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
29780 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
29790 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
297a0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
297b0 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e       change_coun
297c0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
297d0 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
297e0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
297f0 20 20 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75        change_cou
29800 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75  nter++;.      pu
29810 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
29820 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29 2b 32  pPgHdr->pData)+2
29830 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
29840 72 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  r);..      /* If
29850 20 72 75 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65   running in dire
29860 63 74 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 74  ct mode, write t
29870 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
29880 61 67 65 20 31 20 74 6f 20 74 68 65 20 66 69 6c  age 1 to the fil
29890 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
298a0 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
298b0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
298c0 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70  zBuf = pPgHdr->p
298d0 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 61 73  Data;.        as
298e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
298f0 46 69 6c 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20  FileSize>0 );.  
29900 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29910 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
29920 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67  ->fd, zBuf, pPag
29930 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29  er->pageSize, 0)
29940 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
29950 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e   /* If everythin
29960 67 20 77 6f 72 6b 65 64 2c 20 73 65 74 20 74 68  g worked, set th
29970 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
29980 65 20 66 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20  e flag. */.     
29990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
299a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
299b0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
299c0 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  tDone = 1;.     
299d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
299e0 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
299f0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
29a00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29a10 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
29a20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29a30 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
29a40 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20  e pager file to 
29a50 64 69 73 6b 2e 20 54 68 69 73 20 69 73 20 61 20  disk. This is a 
29a60 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d  no-op for in-mem
29a70 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20  ory files.** or 
29a80 70 61 67 65 73 20 77 69 74 68 20 74 68 65 20 50  pages with the P
29a90 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67  ager.noSync flag
29aa0 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73   set..**.** If s
29ab0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 63 61  uccessful, or ca
29ac0 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 72 20  lled on a pager 
29ad0 66 6f 72 20 77 68 69 63 68 20 69 74 20 69 73 20  for which it is 
29ae0 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a  a no-op, this.**
29af0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
29b00 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68  s SQLITE_OK. Oth
29b10 65 72 77 69 73 65 2c 20 61 6e 20 49 4f 20 65 72  erwise, an IO er
29b20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
29b30 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
29b40 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61  ite3PagerSync(Pa
29b50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29b60 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29b90 6f 64 65 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d  ode */.  if( MEM
29ba0 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f  DB || pPager->no
29bb0 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
29bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
29bd0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
29be0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
29bf0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
29c00 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d  sync_flags);.  }
29c10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29c20 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
29c30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
29c40 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
29c50 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
29c60 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
29c70 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
29c80 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
29c90 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
29ca0 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
29cb0 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
29cc0 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
29cd0 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
29ce0 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
29cf0 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
29d00 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
29d10 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
29d20 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
29d30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
29d40 75 72 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a  ures that:.**.**
29d50 20 20 20 2a 20 54 68 65 20 64 61 74 61 62 61 73     * The databas
29d60 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
29d70 75 6e 74 65 72 20 69 73 20 75 70 64 61 74 65 64  unter is updated
29d80 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75  ,.**   * the jou
29d90 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28  rnal is synced (
29da0 75 6e 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69  unless the atomi
29db0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
29dc0 74 69 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a  tion is used),.*
29dd0 2a 20 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20  *   * all dirty 
29de0 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65  pages are writte
29df0 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
29e00 65 20 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20  e file, .**   * 
29e10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29e20 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 28  e is truncated (
29e30 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e  if required), an
29e40 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  d.**   * the dat
29e50 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
29e60 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e  d. .**.** The on
29e70 6c 79 20 74 68 69 6e 67 20 74 68 61 74 20 72 65  ly thing that re
29e80 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
29e90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
29ea0 69 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a  is to finalize .
29eb0 2a 2a 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e  ** (delete, trun
29ec0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
29ed0 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 29 20   first part of) 
29ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
29ef0 20 28 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20   (or .** delete 
29f00 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
29f10 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
29f20 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
29f30 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
29f40 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
29f50 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
29f60 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
29f70 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
29f80 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
29f90 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
29fa0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  all..**.** If th
29fb0 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
29fc0 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
29fd0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
29fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
29ff0 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
2a000 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
2a010 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
2a020 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
2a030 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
2a040 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
2a050 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
2a060 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
2a070 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
2a080 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
2a090 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
2a0a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a0b0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2a0c0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
2a0d0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2a0e0 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62       /* Pager ob
2a0f0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2a100 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20  char *zMaster,  
2a110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2a120 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61  not NULL, the ma
2a130 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
2a140 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e  e */.  int noSyn
2a150 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
2a160 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2a170 6f 20 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63  o omit the xSync
2a180 20 6f 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20   on the db file 
2a190 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2a1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2a1b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2a1c0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
2a1d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2a1e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2a1f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2a200 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
2a210 45 28 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E(("DATABASE SYN
2a220 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
2a230 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e  er=%s nSize=%d\n
2a240 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  ", .      pPager
2a250 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61  ->zFilename, zMa
2a260 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 64 62  ster, pPager->db
2a270 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Size));..  /* If
2a280 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2a290 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
2a2a0 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
2a2b0 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
2a2c0 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2a2d0 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
2a2e0 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
2a2f0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
2a300 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
2a310 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2a320 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
2a330 61 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61  ackupRestart(pPa
2a340 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20  ger->pBackup);. 
2a350 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
2a360 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
2a370 53 59 4e 43 45 44 20 26 26 20 70 50 61 67 65 72  SYNCED && pPager
2a380 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
2a390 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
2a3a0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61  owing block upda
2a3b0 74 65 73 20 74 68 65 20 63 68 61 6e 67 65 2d 63  tes the change-c
2a3c0 6f 75 6e 74 65 72 2e 20 45 78 61 63 74 6c 79 20  ounter. Exactly 
2a3d0 68 6f 77 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  how it.    ** do
2a3e0 65 73 20 74 68 69 73 20 64 65 70 65 6e 64 73 20  es this depends 
2a3f0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
2a400 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64  t the atomic-upd
2a410 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ate optimization
2a420 0a 20 20 20 20 2a 2a 20 77 61 73 20 65 6e 61 62  .    ** was enab
2a430 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2a440 69 6d 65 2c 20 61 6e 64 20 69 66 20 74 68 69 73  ime, and if this
2a450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65   transaction mee
2a460 74 73 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  ts the .    ** r
2a470 75 6e 74 69 6d 65 20 63 72 69 74 65 72 69 61 20  untime criteria 
2a480 74 6f 20 75 73 65 20 74 68 65 20 6f 70 65 72 61  to use the opera
2a490 74 69 6f 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20  tion: .    **.  
2a4a0 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66 69    **    * The fi
2a4b0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2a4c0 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
2a4d0 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
2a4e0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
2a4f0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
2a500 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20  -size, and .    
2a510 2a 2a 20 20 20 20 2a 20 54 68 69 73 20 63 6f 6d  **    * This com
2a520 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20  mit is not part 
2a530 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
2a540 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64  transaction, and
2a550 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 45 78 61  .    **    * Exa
2a560 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61  ctly one page ha
2a570 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
2a580 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65  and store in the
2a590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
2a5a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2a5b0 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2a5c0 20 77 61 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64   was not enabled
2a5d0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2a5e0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
2a5f0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2a600 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 66 75 6e  ngecounter() fun
2a610 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2a620 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68  to update the ch
2a630 61 6e 67 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e  ange.    ** coun
2a640 74 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74  ter in 'indirect
2a650 2d 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f  -mode'. If the o
2a660 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63  ptimization is c
2a670 6f 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20  ompiled in but. 
2a680 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70     ** is not app
2a690 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73 20  licable to this 
2a6a0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c  transaction, cal
2a6b0 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  l sqlite3Journal
2a6c0 43 72 65 61 74 65 28 29 0a 20 20 20 20 2a 2a 20  Create().    ** 
2a6d0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
2a6e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
2a6f0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 65 6e 20  s actually been 
2a700 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 61  created, then ca
2a710 6c 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  ll.    ** pager_
2a720 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2a730 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2a740 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2a750 72 20 69 6e 20 69 6e 64 69 72 65 63 74 0a 20 20  r in indirect.  
2a760 20 20 2a 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20    ** mode. .    
2a770 2a 2a 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  **.    ** Otherw
2a780 69 73 65 2c 20 69 66 20 74 68 65 20 6f 70 74 69  ise, if the opti
2a790 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 6f 74 68  mization is both
2a7a0 20 65 6e 61 62 6c 65 64 20 61 6e 64 20 61 70 70   enabled and app
2a7b0 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  licable,.    ** 
2a7c0 74 68 65 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f  then call pager_
2a7d0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2a7e0 65 72 28 29 20 74 6f 20 75 70 64 61 74 65 20 74  er() to update t
2a7f0 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2a800 72 0a 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72  r.    ** in 'dir
2a810 65 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68  ect' mode. In th
2a820 69 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72  is case the jour
2a830 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65  nal file will ne
2a840 76 65 72 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  ver be.    ** cr
2a850 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 74  eated for this t
2a860 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
2a870 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2a880 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
2a890 52 49 54 45 0a 20 20 20 20 50 67 48 64 72 20 2a  RITE.    PgHdr *
2a8a0 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
2a8b0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a8c0 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  jfd) || pPager->
2a8d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
2a8e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
2a8f0 46 46 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  FF );.    if( !z
2a900 4d 61 73 74 65 72 20 26 26 20 69 73 4f 70 65 6e  Master && isOpen
2a910 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20  (pPager->jfd) . 
2a920 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
2a930 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
2a940 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
2a950 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  ) .     && pPage
2a960 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65  r->dbSize>=pPage
2a970 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20  r->dbFileSize.  
2a980 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20 3d     && (0==(pPg =
2a990 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
2a9a0 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2a9b0 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d  pPCache)) || 0==
2a9c0 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20 20  pPg->pDirty).   
2a9d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
2a9e0 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
2a9f0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 76  change counter v
2aa00 69 61 20 74 68 65 20 64 69 72 65 63 74 2d 77 72  ia the direct-wr
2aa10 69 74 65 20 6d 65 74 68 6f 64 2e 20 54 68 65 20  ite method. The 
2aa20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  .      ** follow
2aa30 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
2aa40 64 69 66 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  dify the in-memo
2aa50 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
2aa60 6e 20 6f 66 20 70 61 67 65 20 31 20 0a 20 20 20  n of page 1 .   
2aa70 20 20 20 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65     ** to include
2aa80 20 74 68 65 20 75 70 64 61 74 65 64 20 63 68 61   the updated cha
2aa90 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20  nge counter and 
2aaa0 74 68 65 6e 20 77 72 69 74 65 20 70 61 67 65 20  then write page 
2aab0 31 20 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  1 .      ** dire
2aac0 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61  ctly to the data
2aad0 62 61 73 65 20 66 69 6c 65 2e 20 42 65 63 61 75  base file. Becau
2aae0 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69 63  se of the atomic
2aaf0 2d 77 72 69 74 65 20 0a 20 20 20 20 20 20 2a 2a  -write .      **
2ab00 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
2ab10 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
2ab20 6d 2c 20 74 68 69 73 20 69 73 20 73 61 66 65 2e  m, this is safe.
2ab30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2ab40 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
2ab50 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
2ab60 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65  ager, 1);.    }e
2ab70 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2ab80 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
2ab90 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
2aba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2abb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2abc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2abd0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2abe0 74 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ter(pPager, 0);.
2abf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2ac00 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 70 61 67  lse.    rc = pag
2ac10 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
2ac20 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
2ac30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
2ac40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ac50 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2ac60 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20  se_one_exit;..  
2ac70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61    /* If this tra
2ac80 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64  nsaction has mad
2ac90 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
2aca0 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c  maller, then all
2acb0 20 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 62 65   pages.    ** be
2acc0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
2acd0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
2ace0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
2acf0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
2ad00 20 20 20 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73     ** file. This
2ad10 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2ad20 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2ad30 6d 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  mode..    **.   
2ad40 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64 69   ** Before readi
2ad50 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69 74  ng the pages wit
2ad60 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 6c  h page numbers l
2ad70 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 0a  arger than the .
2ad80 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 76      ** current v
2ad90 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
2ada0 53 69 7a 65 2c 20 73 65 74 20 64 62 53 69 7a 65  Size, set dbSize
2adb0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c   back to the val
2adc0 75 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  ue.    ** that i
2add0 74 20 74 6f 6f 6b 20 61 74 20 74 68 65 20 73 74  t took at the st
2ade0 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
2adf0 61 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  action. Otherwis
2ae00 65 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  e, the.    ** ca
2ae10 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
2ae20 67 65 72 47 65 74 28 29 20 72 65 74 75 72 6e 20  gerGet() return 
2ae30 7a 65 72 6f 65 64 20 70 61 67 65 73 20 69 6e 73  zeroed pages ins
2ae40 74 65 61 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20  tead of .    ** 
2ae50 72 65 61 64 69 6e 67 20 64 61 74 61 20 66 72 6f  reading data fro
2ae60 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2ae70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  ile..    */.#ifn
2ae80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2ae90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2aea0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2aeb0 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  e<pPager->dbOrig
2aec0 53 69 7a 65 0a 20 20 20 20 20 26 26 20 70 50 61  Size.     && pPa
2aed0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2aee0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
2aef0 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a  ODE_OFF .    ){.
2af00 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 20 20 20        Pgno i;   
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af30 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
2af40 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  able */.      co
2af50 6e 73 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d  nst Pgno iSkip =
2af60 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
2af70 50 61 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69  Pager); /* Pendi
2af80 6e 67 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a  ng lock page */.
2af90 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
2afa0 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
2afb0 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  ->dbSize;       
2afc0 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67  /* Database imag
2afd0 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20  e size */ .     
2afe0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2aff0 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
2b000 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  Size;.      for(
2b010 20 69 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d   i=dbSize+1; i<=
2b020 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
2b030 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
2b040 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
2b050 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
2b060 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
2b070 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
2b080 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72 20            PgHdr 
2b090 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
2b0a0 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a      /* Page to j
2b0b0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20  ournal */.      
2b0c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b0d0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
2b0e0 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
2b0f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2b100 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2b110 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2b120 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
2b130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b140 65 72 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a  erWrite(pPage);.
2b150 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b160 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2b170 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2b180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b190 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2b1a0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2b1b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
2b1c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
2b1d0 62 53 69 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a  bSize = dbSize;.
2b1e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
2b1f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
2b200 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
2b210 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
2b220 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d  nal file. If a m
2b230 61 73 74 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f  aster .    ** jo
2b240 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2b250 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2b260 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2b270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20  journal file, . 
2b280 20 20 20 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73     ** or if zMas
2b290 74 65 72 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20  ter is NULL (no 
2b2a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c  master journal),
2b2b0 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
2b2c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20  is a no-op..    
2b2d0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
2b2e0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
2b2f0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
2b300 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2b310 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2b320 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2b330 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  xit;..    /* Syn
2b340 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
2b350 6c 65 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69  le. If the atomi
2b360 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2b370 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20  ation is being. 
2b380 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73     ** used, this
2b390 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63   call will not c
2b3a0 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  reate the journa
2b3b0 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72  l file or perfor
2b3c0 6d 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61  m any.    ** rea
2b3d0 6c 20 49 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  l IO..    */.   
2b3e0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
2b3f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
2b400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b410 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
2b420 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a  hase_one_exit;..
2b430 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
2b440 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
2b450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b460 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  e. */.    rc = p
2b470 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
2b480 69 73 74 28 73 71 6c 69 74 65 33 50 63 61 63 68  ist(sqlite3Pcach
2b490 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
2b4a0 72 2d 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20  r->pPCache));.  
2b4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2b4d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2b4e0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
2b4f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d  .      goto comm
2b500 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2b510 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
2b520 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
2b530 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
2b540 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  he);..    /* If 
2b550 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
2b560 20 69 73 20 6e 6f 74 20 74 68 65 20 73 61 6d 65   is not the same
2b570 20 73 69 7a 65 20 61 73 20 74 68 65 20 64 61 74   size as the dat
2b580 61 62 61 73 65 20 69 6d 61 67 65 2c 0a 20 20 20  abase image,.   
2b590 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67   ** then use pag
2b5a0 65 72 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67  er_truncate to g
2b5b0 72 6f 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68  row or shrink th
2b5c0 65 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  e file here..   
2b5d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
2b5e0 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50 61 67  er->dbSize!=pPag
2b5f0 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29  er->dbFileSize )
2b600 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65  {.      Pgno nNe
2b610 77 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  w = pPager->dbSi
2b620 7a 65 20 2d 20 28 70 50 61 67 65 72 2d 3e 64 62  ze - (pPager->db
2b630 53 69 7a 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  Size==PAGER_MJ_P
2b640 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
2b650 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2b660 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
2b670 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2b680 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
2b690 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
2b6a0 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20 69 66 28  nNew);.      if(
2b6b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b6c0 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61   goto commit_pha
2b6d0 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20  se_one_exit;.   
2b6e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c   }..    /* Final
2b6f0 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  ly, sync the dat
2b700 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2b710 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
2b720 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
2b730 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
2b740 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
2b750 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
2b760 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
2b770 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
2b780 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
2b790 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
2b7a0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
2b7b0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
2b7c0 0a 0a 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f  ..commit_phase_o
2b7d0 6e 65 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  ne_exit:.  if( r
2b7e0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
2b7f0 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
2b800 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
2b810 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
2b820 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
2b830 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
2b840 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73      ** lock to s
2b850 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
2b860 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
2b870 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
2b880 63 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  ce .    ** there
2b890 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
2b8a0 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
2b8b0 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
2b8c0 20 20 20 2a 2a 20 62 65 74 74 65 72 20 74 6f 20     ** better to 
2b8d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
2b8e0 53 59 2e 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20  SY..    **/.    
2b8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
2b900 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b910 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  c;.}.../*.** Whe
2b920 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
2b930 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 64  is called, the d
2b940 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
2b950 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79   been completely
2b960 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20 72  .** updated to r
2b970 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e 67  eflect the chang
2b980 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 63  es made by the c
2b990 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2b9a0 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64  on and.** synced
2b9b0 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f   to disk. The jo
2b9c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c  urnal file still
2b9d0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 66   exists in the f
2b9e0 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74  ile-system .** t
2b9f0 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61 20  hough, and if a 
2ba00 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 61  failure occurs a
2ba10 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
2ba20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a  will eventually.
2ba30 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61 20  ** be used as a 
2ba40 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
2ba50 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2ba60 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62  saction rolled b
2ba70 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
2ba80 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a  function finaliz
2ba90 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  es the journal f
2baa0 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20 64  ile, either by d
2bab0 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75  eleting, .** tru
2bac0 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74 69  ncating or parti
2bad0 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c  ally zeroing it,
2bae0 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 6e   so that it cann
2baf0 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 66  ot be used .** f
2bb00 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72  or hot-journal r
2bb10 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68  ollback. Once th
2bb20 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20 74  is is done the t
2bb30 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a  ransaction is.**
2bb40 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d   irrevocably com
2bb50 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  mitted..**.** If
2bb60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2bb70 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  , an IO error co
2bb80 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
2bb90 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  nd the pager.** 
2bba0 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20 65  moves into the e
2bbb0 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68 65  rror state. Othe
2bbc0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
2bbd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2bbe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2bbf0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
2bc00 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2bc10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2bc20 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2bc30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2bc40 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44   code */..  /* D
2bc50 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 69 66  o not proceed if
2bc60 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
2bc70 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
2bc80 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
2bc90 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
2bca0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
2bcb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2bcc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
2bcd0 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
2bce0 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 69   not be called i
2bcf0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
2bd00 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74 0a 20  ot in at least. 
2bd10 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56   ** PAGER_RESERV
2bd20 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20 69 6e  ED state. And in
2bd30 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65 76 65  deed SQLite neve
2bd40 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42 75 74  r does this. But
2bd50 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65   it is.  ** nice
2bd60 20 74 6f 20 68 61 76 65 20 74 68 69 73 20 64 65   to have this de
2bd70 66 65 6e 73 69 76 65 20 62 6c 6f 63 6b 20 68 65  fensive block he
2bd80 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a  re anyway..  */.
2bd90 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
2bda0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
2bdb0 52 45 53 45 52 56 45 44 29 20 29 7b 0a 20 20 20  RESERVED) ){.   
2bdc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2bdd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
2bde0 41 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  An optimization.
2bdf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2be00 20 77 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   was not actuall
2be10 79 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69 6e  y modified durin
2be20 67 0a 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e  g.  ** this tran
2be30 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 70 61 67  saction, the pag
2be40 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
2be50 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20   exclusive-mode 
2be60 61 6e 64 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e  and is.  ** usin
2be70 67 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  g persistent jou
2be80 72 6e 61 6c 73 2c 20 74 68 65 6e 20 74 68 69 73  rnals, then this
2be90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2bea0 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o-op..  **.  ** 
2beb0 54 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  The start of the
2bec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
2bed0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
2bee0 20 61 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61   a single journa
2bef0 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  l .  ** header w
2bf00 69 74 68 20 74 68 65 20 6e 52 65 63 20 66 69 65  ith the nRec fie
2bf10 6c 64 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20  ld set to 0. If 
2bf20 73 75 63 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69  such a journal i
2bf30 73 20 75 73 65 64 20 61 73 0a 20 20 2a 2a 20 61  s used as.  ** a
2bf40 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72   hot-journal dur
2bf50 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  ing hot-journal 
2bf60 72 6f 6c 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e  rollback, 0 chan
2bf70 67 65 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  ges will be made
2bf80 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  .  ** to the dat
2bf90 61 62 61 73 65 20 66 69 6c 65 2e 20 53 6f 20 74  abase file. So t
2bfa0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
2bfb0 74 6f 20 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72  to zero the jour
2bfc0 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61 64 65 72  nal .  ** header
2bfd0 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
2bfe0 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
2bff0 65 20 6d 6f 64 65 2c 20 74 68 65 72 65 20 69 73  e mode, there is
2c000 20 6e 6f 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f   no need.  ** to
2c010 20 64 72 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20   drop any locks 
2c020 65 69 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  either..  */.  i
2c030 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
2c040 69 66 69 65 64 3d 3d 30 20 26 26 20 70 50 61 67  ified==0 && pPag
2c050 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2c060 65 20 0a 20 20 20 26 26 20 70 50 61 67 65 72 2d  e .   && pPager-
2c070 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2c080 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2c090 50 45 52 53 49 53 54 0a 20 20 29 7b 0a 20 20 20  PERSIST.  ){.   
2c0a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2c0b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
2c0c0 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
2c0d0 65 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  er) );.    retur
2c0e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c0f0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2c100 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
2c110 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2c120 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2c130 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
2c140 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42  _SYNCED || MEMDB
2c150 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 62 4d   || !pPager->dbM
2c160 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 72 63 20  odified );.  rc 
2c170 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
2c180 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2c190 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
2c1a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  r);.  return pag
2c1b0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2c1c0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
2c1d0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
2c1e0 67 65 73 2e 20 54 68 65 20 64 61 74 61 62 61 73  ges. The databas
2c1f0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
2c200 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
2c210 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
2c220 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20  nction performs 
2c230 74 77 6f 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a  two tasks:.**.**
2c240 20 20 20 31 29 20 49 74 20 72 6f 6c 6c 73 20 62     1) It rolls b
2c250 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
2c260 66 69 6c 65 2c 20 72 65 73 74 6f 72 69 6e 67 20  file, restoring 
2c270 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
2c280 65 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69  e and .**      i
2c290 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
2c2a0 61 67 65 73 20 74 6f 20 74 68 65 20 73 74 61 74  ages to the stat
2c2b0 65 20 74 68 65 79 20 77 65 72 65 20 69 6e 20 77  e they were in w
2c2c0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
2c2d0 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 77 61 73 20  ion.**      was 
2c2e0 6f 70 65 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20  opened, and.**  
2c2f0 20 32 29 20 49 74 20 66 69 6e 61 6c 69 7a 65 73   2) It finalizes
2c300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c310 65 2c 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  e, so that it is
2c320 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 68 6f   not used for ho
2c330 74 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61  t.**      rollba
2c340 63 6b 20 61 74 20 61 6e 79 20 70 6f 69 6e 74 20  ck at any point 
2c350 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a  in the future..*
2c360 2a 0a 2a 2a 20 73 75 62 6a 65 63 74 20 74 6f 20  *.** subject to 
2c370 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75  the following qu
2c380 61 6c 69 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a  alifications:.**
2c390 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20 6a 6f 75  .** * If the jou
2c3a0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
2c3b0 20 79 65 74 20 6f 70 65 6e 20 77 68 65 6e 20 74   yet open when t
2c3c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2c3d0 63 61 6c 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65  called,.**   the
2c3e0 6e 20 6f 6e 6c 79 20 28 32 29 20 69 73 20 70 65  n only (2) is pe
2c3f0 72 66 6f 72 6d 65 64 2e 20 49 6e 20 74 68 69 73  rformed. In this
2c400 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e   case there is n
2c410 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  o journal file.*
2c420 2a 20 20 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  *   to roll back
2c430 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20  ..**.** * If in 
2c440 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f  an error state o
2c450 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2c460 5f 46 55 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b  _FULL, then task
2c470 20 28 31 29 20 69 73 20 0a 2a 2a 20 20 20 70 65   (1) is .**   pe
2c480 72 66 6f 72 6d 65 64 2e 20 49 66 20 73 75 63 63  rformed. If succ
2c490 65 73 73 66 75 6c 2c 20 74 61 73 6b 20 28 32 29  essful, task (2)
2c4a0 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  . Regardless of 
2c4b0 74 68 65 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20  the outcome.**  
2c4c0 20 6f 66 20 65 69 74 68 65 72 2c 20 74 68 65 20   of either, the 
2c4d0 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f  error state erro
2c4e0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
2c4f0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
2c500 0a 2a 2a 20 20 20 28 69 2e 65 2e 20 65 69 74 68  .**   (i.e. eith
2c510 65 72 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  er SQLITE_IOERR 
2c520 6f 72 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  or SQLITE_CORRUP
2c530 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74  T)..**.** * If t
2c540 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 50  he pager is in P
2c550 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 73 74  AGER_RESERVED st
2c560 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  ate, then attemp
2c570 74 20 28 31 29 2e 20 57 68 65 74 68 65 72 0a 2a  t (1). Whether.*
2c580 2a 20 20 20 6f 72 20 6e 6f 74 20 28 31 29 20 69  *   or not (1) i
2c590 73 20 73 75 63 63 75 73 73 66 75 6c 2c 20 61 6c  s succussful, al
2c5a0 73 6f 20 61 74 74 65 6d 70 74 20 28 32 29 2e 20  so attempt (2). 
2c5b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
2c5c0 65 74 75 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54  eturn.**   SQLIT
2c5d0 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2c5e0 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
2c5f0 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
2c600 6e 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  n the first .** 
2c610 20 20 65 72 72 6f 72 20 63 6f 64 65 20 65 6e 63    error code enc
2c620 6f 75 6e 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a  ountered. .**.**
2c630 20 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20     In this case 
2c640 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
2c650 63 65 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ce that the data
2c660 62 61 73 65 20 77 61 73 20 77 72 69 74 74 65 6e  base was written
2c670 20 74 6f 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73   to. .**   So is
2c680 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a   safe to finaliz
2c690 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2c6a0 6c 65 20 65 76 65 6e 20 69 66 20 74 68 65 20 70  le even if the p
2c6b0 6c 61 79 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f  layback .**   (o
2c6c0 70 65 72 61 74 69 6f 6e 20 31 29 20 66 61 69 6c  peration 1) fail
2c6d0 65 64 2e 20 48 6f 77 65 76 65 72 20 74 68 65 20  ed. However the 
2c6e0 70 61 67 65 72 20 6d 75 73 74 20 65 6e 74 65 72  pager must enter
2c6f0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2c700 0a 2a 2a 20 20 20 61 73 20 74 68 65 20 63 6f 6e  .**   as the con
2c710 74 65 6e 74 73 20 6f 66 20 74 68 65 20 69 6e 2d  tents of the in-
2c720 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 61 72 65  memory cache are
2c730 20 6e 6f 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a   now suspect..**
2c740 0a 2a 2a 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69  .** * Finally, i
2c750 66 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55  f in PAGER_EXCLU
2c760 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
2c770 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e   attempt (1). On
2c780 6c 79 0a 2a 2a 20 20 20 61 74 74 65 6d 70 74 20  ly.**   attempt 
2c790 28 32 29 20 69 66 20 28 31 29 20 69 73 20 73 75  (2) if (1) is su
2c7a0 63 63 65 73 73 66 75 6c 2e 20 52 65 74 75 72 6e  ccessful. Return
2c7b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
2c7c0 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f  ccessful,.**   o
2c7d0 74 68 65 72 77 69 73 65 20 65 6e 74 65 72 20 74  therwise enter t
2c7e0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
2c7f0 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  nd return the er
2c800 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ror code from th
2c810 65 20 0a 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20  e .**   failing 
2c820 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
2c830 20 20 20 49 6e 20 74 68 69 73 20 63 61 73 65 20     In this case 
2c840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c850 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
2c860 77 72 69 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69  written to. So i
2c870 66 20 74 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62  f the.**   playb
2c880 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 64 69  ack operation di
2c890 64 20 6e 6f 74 20 73 75 63 63 65 65 64 20 69 74  d not succeed it
2c8a0 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 61   would not be sa
2c8b0 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a  fe to finalize.*
2c8c0 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  *   the journal 
2c8d0 66 69 6c 65 2e 20 49 74 20 6e 65 65 64 73 20 74  file. It needs t
2c8e0 6f 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  o be left in the
2c8f0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20   file-system so 
2c900 74 68 61 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f  that.**   some o
2c910 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 61 6e  ther process can
2c920 20 75 73 65 20 69 74 20 74 6f 20 72 65 73 74 6f   use it to resto
2c930 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2c940 73 74 61 74 65 20 28 62 79 0a 2a 2a 20 20 20 68  state (by.**   h
2c950 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
2c960 61 63 6b 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ack)..*/.int sql
2c970 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
2c980 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
2c990 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2c9a0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2c9b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2c9c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47  rn code */.  PAG
2c9d0 45 52 54 52 41 43 45 28 28 22 52 4f 4c 4c 42 41  ERTRACE(("ROLLBA
2c9e0 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
2c9f0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 69  D(pPager)));.  i
2ca00 66 28 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f  f( !pPager->dbMo
2ca10 64 69 66 69 65 64 20 7c 7c 20 21 69 73 4f 70 65  dified || !isOpe
2ca20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
2ca30 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2ca40 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2ca50 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2ca60 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d  >setMaster);.  }
2ca70 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
2ca80 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
2ca90 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
2caa0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
2cab0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2cac0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
2cad0 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
2cae0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2caf0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
2cb00 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
2cb10 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
2cb20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2cb30 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
2cb40 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69  ERVED ){.      i
2cb50 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63  nt rc2;.      rc
2cb60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
2cb70 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2cb80 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
2cb90 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
2cba0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
2cbb0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
2cbc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cbd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2cbe0 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
2cbf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2cc00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
2cc10 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
2cc20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
2cc30 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
2cc40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2cc50 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  alid = 0;.    }.
2cc60 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  .    /* If an er
2cc70 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
2cc80 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
2cc90 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
2cca0 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
2ccb0 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20     ** cache. So 
2ccc0 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
2ccd0 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
2cce0 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
2ccf0 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70 65 72 73  ror .    ** pers
2cd00 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20  istent..    */. 
2cd10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
2cd20 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
2cd30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2cd40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2cd50 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
2cd60 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
2cd70 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
2cd80 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
2cd90 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
2cda0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
2cdb0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38   writable..*/.u8
2cdc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
2cdd0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
2cde0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2cdf0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
2ce00 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
2ce10 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
2ce20 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
2ce30 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
2ce40 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2ce50 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
2ce60 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ger){.  return s
2ce70 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
2ce80 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
2ce90 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ache);.}../*.** 
2cea0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
2ceb0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2cec0 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64  to the specified
2ced0 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
2cee0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2cef0 66 63 6f 75 6e 74 28 44 62 50 61 67 65 20 2a 70  fcount(DbPage *p
2cf00 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
2cf10 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67  sqlite3PcachePag
2cf20 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 29  eRefcount(pPage)
2cf30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2cf40 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
2cf50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
2cf60 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
2cf70 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
2cf80 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
2cf90 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
2cfa0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
2cfb0 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
2cfc0 20 20 61 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33    a[0] = sqlite3
2cfd0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
2cfe0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2cff0 0a 20 20 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65  .  a[1] = sqlite
2d000 33 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74  3PcachePagecount
2d010 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2d020 29 3b 0a 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69  );.  a[2] = sqli
2d030 74 65 33 50 63 61 63 68 65 47 65 74 43 61 63 68  te3PcacheGetCach
2d040 65 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  esize(pPager->pP
2d050 43 61 63 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d  Cache);.  a[3] =
2d060 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2d070 61 6c 69 64 20 3f 20 28 69 6e 74 29 20 70 50 61  alid ? (int) pPa
2d080 67 65 72 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31  ger->dbSize : -1
2d090 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
2d0a0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
2d0b0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2d0c0 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
2d0d0 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
2d0e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
2d0f0 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
2d100 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
2d110 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
2d120 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
2d130 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
2d140 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
2d150 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
2d160 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
2d170 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69 73  urn true if this
2d180 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
2d190 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pager..*/.int s
2d1a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
2d1b0 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
2d1c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
2d1d0 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  B;.}../*.** Chec
2d1e0 6b 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65  k that there are
2d1f0 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65 70   at least nSavep
2d200 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73 20  oint savepoints 
2d210 6f 70 65 6e 2e 20 49 66 20 74 68 65 72 65 20 61  open. If there a
2d220 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
2d230 6c 65 73 73 20 74 68 61 6e 20 6e 53 61 76 65 70  less than nSavep
2d240 6f 69 6e 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e  oints open, then
2d250 20 6f 70 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   open one or mor
2d260 65 20 73 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20  e savepoints.** 
2d270 74 6f 20 6d 61 6b 65 20 75 70 20 74 68 65 20 64  to make up the d
2d280 69 66 66 65 72 65 6e 63 65 2e 20 49 66 20 74 68  ifference. If th
2d290 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  e number of save
2d2a0 70 6f 69 6e 74 73 20 69 73 20 61 6c 72 65 61 64  points is alread
2d2b0 79 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53  y.** equal to nS
2d2c0 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74  avepoint, then t
2d2d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d2e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
2d2f0 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2d300 61 74 69 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c  ation fails, SQL
2d310 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74  ITE_NOMEM is ret
2d320 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
2d330 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68  or .** occurs wh
2d340 69 6c 65 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ile opening the 
2d350 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
2d360 2c 20 74 68 65 6e 20 61 6e 20 49 4f 20 65 72 72  , then an IO err
2d370 6f 72 20 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65  or code is.** re
2d380 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
2d390 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
2d3a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2d3b0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 50  rOpenSavepoint(P
2d3c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2d3d0 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t nSavepoint){. 
2d3e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d3f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2d400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2d410 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2d420 6e 74 20 6e 43 75 72 72 65 6e 74 20 3d 20 70 50  nt nCurrent = pP
2d430 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2d440 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72  ;        /* Curr
2d450 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  ent number of sa
2d460 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69  vepoints */..  i
2d470 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43  f( nSavepoint>nC
2d480 75 72 72 65 6e 74 20 26 26 20 70 50 61 67 65 72  urrent && pPager
2d490 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
2d4a0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2d4d0 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
2d4e0 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76   */.    PagerSav
2d4f0 65 70 6f 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20  epoint *aNew;   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 2f 2a 20 4e 65 77 20 50 61 67 65 72 2e 61 53 61  /* New Pager.aSa
2d520 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f  vepoint array */
2d530 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  ..    /* Either 
2d540 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74 69  there is no acti
2d550 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  ve journal or th
2d560 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
2d570 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a   open or .    **
2d580 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2d590 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69 6e  always stored in
2d5a0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61   memory */.    a
2d5b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2d5c0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20  Savepoint==0 || 
2d5d0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
2d5e0 6a 66 64 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  jfd) ||.        
2d5f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
2d600 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2d610 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2d620 59 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f  Y );..    /* Gro
2d630 77 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76  w the Pager.aSav
2d640 65 70 6f 69 6e 74 20 61 72 72 61 79 20 75 73 69  epoint array usi
2d650 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65  ng realloc(). Re
2d660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2d670 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65 20  M.    ** if the 
2d680 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2d690 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 7a 65 72  . Otherwise, zer
2d6a0 6f 20 74 68 65 20 6e 65 77 20 70 6f 72 74 69 6f  o the new portio
2d6b0 6e 20 69 6e 20 63 61 73 65 20 61 20 0a 20 20 20  n in case a .   
2d6c0 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   ** malloc failu
2d6d0 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  re occurs while 
2d6e0 70 6f 70 75 6c 61 74 69 6e 67 20 69 74 20 69 6e  populating it in
2d6f0 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f   the for(...) lo
2d700 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f  op below..    */
2d710 0a 20 20 20 20 61 4e 65 77 20 3d 20 28 50 61 67  .    aNew = (Pag
2d720 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 29 73 71  erSavepoint *)sq
2d730 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
2d740 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
2d750 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66  avepoint, sizeof
2d760 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29  (PagerSavepoint)
2d770 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20 20 20 20  *nSavepoint.    
2d780 29 3b 0a 20 20 20 20 69 66 28 20 21 61 4e 65 77  );.    if( !aNew
2d790 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d7a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2d7b0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2d7c0 26 61 4e 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c  &aNew[nCurrent],
2d7d0 20 30 2c 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d   0, (nSavepoint-
2d7e0 6e 43 75 72 72 65 6e 74 29 20 2a 20 73 69 7a 65  nCurrent) * size
2d7f0 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e  of(PagerSavepoin
2d800 74 29 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t));.    pPager-
2d810 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e  >aSavepoint = aN
2d820 65 77 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ew;.    pPager->
2d830 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61  nSavepoint = nSa
2d840 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a  vepoint;..    /*
2d850 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
2d860 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
2d870 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
2d880 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
2d890 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
2d8a0 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
2d8b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2d8c0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
2d8d0 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20  zeValid );.     
2d8e0 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20   aNew[ii].nOrig 
2d8f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
2d900 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4f 70  ;.      if( isOp
2d910 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
2d920 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
2d930 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  alOff>0 ){.     
2d940 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66     aNew[ii].iOff
2d950 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
2d960 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20  urnalOff;.      
2d970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
2d980 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
2d990 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
2d9a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2d9b0 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  }.      aNew[ii]
2d9c0 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65  .iSubRec = pPage
2d9d0 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20 20 20  r->nSubRec;.    
2d9e0 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61    aNew[ii].pInSa
2d9f0 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65  vepoint = sqlite
2da00 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
2da10 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
2da20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b 69       if( !aNew[i
2da30 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  i].pInSavepoint 
2da40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2da50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2da60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2da70 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73     /* Open the s
2da80 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  ub-journal, if i
2da90 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
2daa0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20   opened. */.    
2dab0 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72  rc = openSubJour
2dac0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
2dad0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2dae0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
2daf0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
2db00 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
2db10 65 6c 65 61 73 65 20 28 63 6f 6d 6d 69 74 29 20  elease (commit) 
2db20 61 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20  a savepoint..** 
2db30 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f  The savepoint to
2db40 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
2db50 62 61 63 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65  back need not be
2db60 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
2db70 6c 79 20 0a 2a 2a 20 63 72 65 61 74 65 64 20 73  ly .** created s
2db80 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  avepoint..**.** 
2db90 50 61 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20  Parameter op is 
2dba0 61 6c 77 61 79 73 20 65 69 74 68 65 72 20 53 41  always either SA
2dbb0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
2dbc0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
2dbd0 4c 45 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20  LEASE..** If it 
2dbe0 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  is SAVEPOINT_REL
2dbf0 45 41 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61  EASE, then relea
2dc00 73 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74  se and destroy t
2dc10 68 65 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74  he savepoint wit
2dc20 68 0a 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65  h.** index iSave
2dc30 70 6f 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20  point. If it is 
2dc40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2dc50 43 4b 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63  CK, then rollbac
2dc60 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a  k all changes.**
2dc70 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
2dc80 65 64 20 73 69 6e 63 65 20 74 68 65 20 73 70 65  ed since the spe
2dc90 63 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74  cified savepoint
2dca0 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a   was created..**
2dcb0 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e  .** The savepoin
2dcc0 74 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  t to rollback or
2dcd0 20 72 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e   release is iden
2dce0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
2dcf0 74 65 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69  ter .** iSavepoi
2dd00 6e 74 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  nt. A value of 0
2dd10 20 6d 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74   means to operat
2dd20 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f  e on the outermo
2dd30 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  st savepoint.** 
2dd40 28 74 68 65 20 66 69 72 73 74 20 63 72 65 61 74  (the first creat
2dd50 65 64 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  ed). A value of 
2dd60 28 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e  (Pager.nSavepoin
2dd70 74 2d 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61  t-1) means opera
2dd80 74 65 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73  te.** on the mos
2dd90 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74  t recently creat
2dda0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ed savepoint. If
2ddb0 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
2ddc0 72 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28  reater than.** (
2ddd0 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74  Pager.nSavepoint
2dde0 2d 31 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66  -1), then this f
2ddf0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
2de00 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e  op..**.** If a n
2de10 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 69 73  egative value is
2de20 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
2de30 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74  function, then t
2de40 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2de50 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2de60 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
2de70 73 20 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63  s different to c
2de80 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74  alling .** sqlit
2de90 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
2dea0 29 20 62 65 63 61 75 73 65 20 74 68 69 73 20 66  ) because this f
2deb0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2dec0 20 74 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68   terminate.** th
2ded0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  e transaction or
2dee0 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
2def0 62 61 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65  base, it just re
2df00 73 74 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63  stores the .** c
2df10 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
2df20 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
2df30 72 69 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a  riginal state. .
2df40 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73  **.** In any cas
2df50 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  e, all savepoint
2df60 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  s with an index 
2df70 67 72 65 61 74 65 72 20 74 68 61 6e 20 69 53 61  greater than iSa
2df80 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20  vepoint .** are 
2df90 64 65 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68  destroyed. If th
2dfa0 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20  is is a release 
2dfb0 6f 70 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53  operation (op==S
2dfc0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2dfd0 29 2c 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70  ),.** then savep
2dfe0 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20  oint iSavepoint 
2dff0 69 73 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65  is also destroye
2e000 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
2e010 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
2e020 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  n SQLITE_NOMEM i
2e030 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
2e040 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
2e050 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  or an IO error c
2e060 6f 64 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ode if an IO err
2e070 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
2e080 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a  rolling back a .
2e090 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66  ** savepoint. If
2e0a0 20 6e 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72   no errors occur
2e0b0 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2e0c0 65 74 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74  eturned..*/ .int
2e0d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
2e0e0 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
2e0f0 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  ager, int op, in
2e100 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
2e110 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2e120 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
2e130 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
2e140 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
2e150 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2e160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 61  );.  assert( iSa
2e170 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70  vepoint>=0 || op
2e180 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2e190 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69  BACK );..  if( i
2e1a0 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72  Savepoint<pPager
2e1b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->nSavepoint ){.
2e1c0 20 20 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20      int ii;     
2e1d0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2e1e0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2e1f0 20 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20     int nNew;    
2e200 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e210 6f 66 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76  of remaining sav
2e220 65 70 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68  epoints after th
2e230 69 73 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f  is op. */..    /
2e240 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
2e250 20 6d 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73   many savepoints
2e260 20 77 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61   will still be a
2e270 63 74 69 76 65 20 61 66 74 65 72 20 74 68 69 73  ctive after this
2e280 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2e290 6e 2e 20 53 74 6f 72 65 20 74 68 69 73 20 76 61  n. Store this va
2e2a0 6c 75 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65  lue in nNew. The
2e2b0 6e 20 66 72 65 65 20 72 65 73 6f 75 72 63 65 73  n free resources
2e2c0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20   associated .   
2e2d0 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76   ** with any sav
2e2e0 65 70 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65  epoints that are
2e2f0 20 64 65 73 74 72 6f 79 65 64 20 62 79 20 74 68   destroyed by th
2e300 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  is operation..  
2e310 20 20 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20    */.    nNew = 
2e320 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70  iSavepoint + (op
2e330 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
2e340 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69  BACK);.    for(i
2e350 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
2e360 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
2e370 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
2e380 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
2e390 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
2e3a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
2e3b0 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
2e3c0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2e3d0 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
2e3e0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2e3f0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
2e400 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
2e410 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
2e420 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
2e430 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
2e440 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
2e450 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
2e460 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
2e470 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
2e480 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
2e490 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
2e4a0 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
2e4b0 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
2e4c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2e4d0 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
2e4e0 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
2e4f0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
2e500 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56  .    if( op==SAV
2e510 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
2e520 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2e530 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  ->jfd) ){.      
2e540 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
2e550 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e  pSavepoint = (nN
2e560 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72  ew==0)?0:&pPager
2e570 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65  ->aSavepoint[nNe
2e580 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  w-1];.      rc =
2e590 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
2e5a0 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
2e5b0 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
2e5c0 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51     assert(rc!=SQ
2e5d0 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20  LITE_DONE);.    
2e5e0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
2e5f0 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
2e600 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
2e610 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
2e620 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
2e630 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f  e sub-journal to
2e640 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
2e650 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ize. */.    if( 
2e660 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53  nNew==0 && op==S
2e670 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
2e680 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65   && isOpen(pPage
2e690 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20  r->sjfd) ){.    
2e6a0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
2e6b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
2e6c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
2e6d0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
2e6e0 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  sjfd, 0);.      
2e6f0 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20  pPager->nSubRec 
2e700 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
2e710 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e730 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
2e740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e750 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2e760 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  r *sqlite3PagerF
2e770 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
2e780 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e790 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2e7a0 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
2e7b0 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75  urn the VFS stru
2e7c0 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61  cture for the pa
2e7d0 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71  ger..*/.const sq
2e7e0 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74  lite3_vfs *sqlit
2e7f0 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72  e3PagerVfs(Pager
2e800 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e810 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73  urn pPager->pVfs
2e820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2e830 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  n the file handl
2e840 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  e for the databa
2e850 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  se file associat
2e860 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70  ed.** with the p
2e870 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  ager.  This migh
2e880 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  t return NULL if
2e890 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a   the file has.**
2e8a0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70   not yet been op
2e8b0 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  ened..*/.sqlite3
2e8c0 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61  _file *sqlite3Pa
2e8d0 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70  gerFile(Pager *p
2e8e0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2e8f0 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a   pPager->fd;.}..
2e900 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2e910 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
2e920 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2e930 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
2e940 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
2e950 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
2e960 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2e970 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
2e980 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
2e990 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
2e9a0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
2e9b0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
2e9c0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
2e9d0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
2e9e0 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
2e9f0 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
2ea00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ea10 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
2ea20 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2ea30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
2ea40 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
2ea50 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
2ea60 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
2ea70 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
2ea80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2ea90 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
2eaa0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
2eab0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
2eac0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
2ead0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
2eae0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
2eaf0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
2eb00 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
2eb10 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
2eb20 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
2eb30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2eb40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2eb50 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
2eb60 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
2eb70 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
2eb80 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
2eb90 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
2eba0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2ebb0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
2ebc0 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
2ebd0 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
2ebe0 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
2ebf0 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
2ec00 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
2ec10 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
2ec20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
2ec30 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
2ec40 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
2ec50 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
2ec60 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
2ec70 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
2ec80 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
2ec90 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
2eca0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
2ecb0 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
2ecc0 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
2ecd0 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
2ece0 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
2ecf0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
2ed00 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
2ed10 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
2ed20 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
2ed30 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
2ed40 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
2ed50 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
2ed60 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
2ed70 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
2ed80 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
2ed90 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
2eda0 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
2edb0 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
2edc0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
2edd0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
2ede0 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
2edf0 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
2ee00 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
2ee10 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
2ee20 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
2ee30 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
2ee40 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2ee50 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a  is active)..**.*
2ee60 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20  * If the fourth 
2ee70 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d  argument, isComm
2ee80 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  it, is non-zero,
2ee90 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2eea0 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65  is being.** move
2eeb0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64  d as part of a d
2eec0 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69  atabase reorgani
2eed0 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  zation just befo
2eee0 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
2eef0 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  on .** is being 
2ef00 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68  committed. In th
2ef10 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67  is case, it is g
2ef20 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
2ef30 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
2ef40 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20   .** pPg refers 
2ef50 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77  to will not be w
2ef60 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20  ritten to again 
2ef70 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
2ef80 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
2ef90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2efa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2efb0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
2efc0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
2efd0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
2efe0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65  Otherwise, it re
2eff0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
2f000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2f010 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
2f020 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
2f030 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
2f040 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  no, int isCommit
2f050 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
2f060 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2f070 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
2f080 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
2f090 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
2f0a0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20  yncPgno = 0;    
2f0b0 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20     /* Old value 
2f0c0 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66  of pPg->pgno, if
2f0d0 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
2f0e0 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  d */.  int rc;  
2f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f100 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2f110 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  de */..  assert(
2f120 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
2f130 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
2f140 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73  e being moved is
2f150 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e   dirty and has n
2f160 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79  ot been saved by
2f170 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a   the latest.  **
2f180 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
2f190 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
2f1a0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
2f1b0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2f1c0 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
2f1d0 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72  l now. This is r
2f1e0 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c  equired to handl
2f1f0 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
2f200 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20  scenario:.  **. 
2f210 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a   **   BEGIN;.  *
2f220 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
2f230 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69  age X, then modi
2f240 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e  fy it in memory>
2f250 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
2f260 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20  INT one;.  **   
2f270 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58      <Move page X
2f280 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a   to location Y>.
2f290 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
2f2a0 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  K TO one;.  **. 
2f2b0 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65   ** If page X we
2f2c0 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  re not written t
2f2d0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
2f2e0 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64  l here, it would
2f2f0 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73   not.  ** be pos
2f300 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65  sible to restore
2f310 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68   its contents wh
2f320 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
2f330 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74   TO one".  ** st
2f340 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20  atement were is 
2f350 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a  processed..  **.
2f360 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50    ** subjournalP
2f370 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74  age() may need t
2f380 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
2f390 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70   to store pPg->p
2f3a0 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e  gno into.  ** on
2f3b0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
2f3c0 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69  int bitvecs. Thi
2f3d0 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20  s is the reason 
2f3e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
2f3f0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
2f400 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f  LITE_NOMEM..  */
2f410 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
2f420 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20  s&PGHDR_DIRTY . 
2f430 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65    && subjRequire
2f440 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26  sPage(pPg).   &&
2f450 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2f460 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
2f470 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20  (pPg)).  ){.    
2f480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2f490 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d    PAGERTRACE(("M
2f4a0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
2f4b0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
2f4c0 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
2f4d0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2f4e0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
2f4f0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2f500 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2f510 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52  , pgno));.  IOTR
2f520 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
2f530 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
2f540 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
2f550 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  )..  /* If the j
2f560 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
2f570 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
2f580 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  re page pPg->pgn
2f590 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72  o can.  ** be wr
2f5a0 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20  itten to, store 
2f5b0 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63  pPg->pgno in loc
2f5c0 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64  al variable need
2f5d0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20  SyncPgno..  **. 
2f5e0 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d   ** If the isCom
2f5f0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  mit flag is set,
2f600 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2f610 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
2f620 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  at.  ** the jour
2f630 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
2f640 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
2f650 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50  database page pP
2f660 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61  g->pgno .  ** ca
2f670 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
2f680 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
2f690 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
2f6a0 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
2f6b0 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
2f6c0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2f6d0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20  R_NEED_SYNC) && 
2f6e0 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20  !isCommit ){.   
2f6f0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
2f700 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
2f710 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75  ssert( pageInJou
2f720 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67  rnal(pPg) || pPg
2f730 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
2f740 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20  bOrigSize );.   
2f750 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
2f760 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
2f770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2f780 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2f790 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
2f7a0 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
2f7b0 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
2f7c0 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
2f7d0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
2f7e0 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68  from its hash ch
2f7f0 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
2f800 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
2f810 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
2f820 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
2f830 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
2f840 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
2f850 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
2f860 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
2f870 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
2f880 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c  ..  */.  pPg->fl
2f890 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
2f8a0 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c  ED_SYNC;.  pPgOl
2f8b0 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
2f8c0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
2f8d0 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c    assert( !pPgOl
2f8e0 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  d || pPgOld->nRe
2f8f0 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50  f==1 );.  if( pP
2f900 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d  gOld ){.    pPg-
2f910 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c  >flags |= (pPgOl
2f920 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  d->flags&PGHDR_N
2f930 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a  EED_SYNC);.  }..
2f940 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
2f950 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  ove(pPg, pgno);.
2f960 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
2f970 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2f980 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20  eDrop(pPgOld);. 
2f990 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61   }..  sqlite3Pca
2f9a0 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
2f9b0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
2f9c0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
2f9d0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
2f9e0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
2f9f0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
2fa00 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
2fa10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
2fa20 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
2fa30 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
2fa40 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
2fa50 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
2fa60 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
2fa70 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
2fa80 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
2fa90 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
2faa0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
2fab0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
2fac0 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
2fad0 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
2fae0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
2faf0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
2fb00 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
2fb10 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
2fb20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
2fb30 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
2fb40 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2fb50 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
2fb60 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2fb70 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
2fb80 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
2fb90 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
2fba0 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
2fbb0 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
2fbc0 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
2fbd0 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
2fbe0 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
2fbf0 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
2fc00 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
2fc10 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
2fc20 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
2fc30 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
2fc40 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
2fc50 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
2fc60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
2fc70 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2fc80 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
2fc90 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
2fca0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
2fcb0 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
2fcc0 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
2fcd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2fce0 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
2fcf0 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
2fd00 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2fd10 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
2fd20 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
2fd30 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
2fd40 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
2fd50 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
2fd60 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
2fd70 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
2fd80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
2fd90 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
2fda0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
2fdb0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
2fdc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fdd0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
2fde0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
2fdf0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
2fe00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe10 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2fe20 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65  pInJournal && ne
2fe30 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67  edSyncPgno<=pPag
2fe40 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29  er->dbOrigSize )
2fe50 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fe60 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
2fe70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
2fe80 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a   needSyncPgno);.
2fe90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
2fea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2feb0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
2fec0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73  ync = 1;.    ass
2fed0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ert( pPager->noS
2fee0 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42  ync==0 && !MEMDB
2fef0 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   );.    pPgHdr->
2ff00 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2ff10 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71  EED_SYNC;.    sq
2ff20 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44  lite3PcacheMakeD
2ff30 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
2ff40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
2ff50 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
2ff60 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2ff70 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
2ff80 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
2ff90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
2ffa0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
2ffb0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2ffc0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2ffd0 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
2ffe0 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pPg){.  assert( 
2fff0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  pPg->nRef>0 || p
30000 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44  Pg->pPager->memD
30010 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  b );.  return pP
30020 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a  g->pData;.}../*.
30030 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
30040 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
30050 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
30060 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
30070 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
30080 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
30090 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
300a0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
300b0 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
300c0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
300d0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
300e0 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
300f0 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78  (pPager?pPg->pEx
30100 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tra:0);.}../*.**
30110 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
30120 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
30130 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
30140 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
30150 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
30160 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
30170 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
30180 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
30190 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
301a0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
301b0 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
301c0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
301d0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
301e0 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
301f0 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
30200 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
30210 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
30220 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
30230 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
30240 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
30250 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30260 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
30270 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
30280 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
30290 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
302a0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
302b0 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
302c0 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
302d0 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
302e0 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
302f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30300 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
30310 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
30320 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
30330 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
30340 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
30350 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30360 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
30370 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
30380 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
30390 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
303a0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
303b0 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
303c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
303d0 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
303e0 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
303f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
30400 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
30410 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
30420 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  (u8)eMode;.  }. 
30430 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
30440 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
30450 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
30460 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
30470 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
30480 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
30490 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
304a0 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
304b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
304c0 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
304d0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
304e0 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
304f0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
30500 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
30510 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
30520 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
30530 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
30540 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  FF.**    PAGER_J
30550 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
30560 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  Y.**.** If the p
30570 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
30580 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
30590 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
305a0 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
305b0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
305c0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
305d0 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
305e0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
305f0 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72 6e  y updated) journ
30600 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
30610 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
30620 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
30630 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
30640 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  ){.  if( !MEMDB 
30650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
30660 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
30670 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
30680 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
30690 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
306a0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
306c0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
306d0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
306e0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
306f0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
30700 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
30710 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  IST.            
30720 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
30730 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
30740 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  F .             
30750 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
30760 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
30770 4f 52 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ORY );.    asser
30780 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
30790 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
307a0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30      if( eMode>=0
307b0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
307c0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
307d0 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d  (u8)eMode;.    }
307e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
307f0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
30800 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
30810 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RY );.    }.  }.
30820 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
30830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
30840 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
30850 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
30860 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
30870 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
30880 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  iles..*/.i64 sql
30890 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
308a0 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
308b0 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
308c0 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
308d0 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
308e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
308f0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
30900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
30910 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
30920 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLimit;.}../*.**
30930 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
30940 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72 2d  r to the pPager-
30950 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62 6c  >pBackup variabl
30960 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d 6f  e. The backup mo
30970 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b 75  dule.** in backu
30980 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74 68  p.c maintains th
30990 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
309a0 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  s variable. This
309b0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73 20   module.** uses 
309c0 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20 61  it opaquely as a
309d0 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  n argument to sq
309e0 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61  lite3BackupResta
309f0 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c 69  rt() and.** sqli
30a00 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
30a10 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69 74  ) only..*/.sqlit
30a20 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c 69  e3_backup **sqli
30a30 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50 74  te3PagerBackupPt
30a40 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
30a50 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61 67  {.  return &pPag
30a60 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a 0a  er->pBackup;.}..
30a70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30a80 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.