/ Hex Artifact Content
Login

Artifact e8e2ae1ef6a20464a627d29fd4ba29461b7632a5:


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 35  : pager.c,v 1.55
0350: 34 20 32 30 30 39 2f 30 31 2f 31 36 20 31 36 3a  4 2009/01/16 16:
0360: 34 30 3a 31 34 20 64 61 6e 69 65 6c 6b 31 39 37  40:14 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 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
18d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
18f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1900: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
1910: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
1920: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
1930: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
1940: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
1950: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
1960: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
1970: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
1980: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
1990: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
19a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
19b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
19c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
19d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
19e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
19f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
1a00: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
1a10: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
1a20: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1a30: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
1a40: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1a50: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
1a60: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
1a70: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
1a80: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
1a90: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a  successfully..**
1aa0: 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  .** Managing the
1ab0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ac0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1ad0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ae0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1af0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b00: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
1b10: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1b20: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
1b30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6d 61 67  database.** imag
1b40: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
1b50: 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64 61 74  ains. As the dat
1b60: 61 62 61 73 65 20 69 6d 61 67 65 20 67 72 6f 77  abase image grow
1b70: 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74 68 69  s or shrinks thi
1b80: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73  s.** variable is
1b90: 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61   updated. The va
1ba0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46  riable Pager.dbF
1bb0: 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73  ileSize contains
1bc0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1bd0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1be0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bf0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1c00: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1c10: 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73 6f 6d 65  bSize.** if some
1c20: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1c30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1c40: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1c50: 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74  but not yet writ
1c60: 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72 6f 6d 20  ten.** out from 
1c70: 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c80: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20   actual file on 
1c90: 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65 20  disk. Or if the 
1ca0: 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a  image has been.*
1cb0: 2a 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61  * truncated by a
1cc0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1cd0: 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cuum operation. 
1ce0: 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67  The Pager.dbOrig
1cf0: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1d00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d30: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d40: 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
1d50: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
1d60: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
1d70: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
1d80: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
1d90: 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  ** only guarante
1da0: 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74  ed to be correct
1db0: 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   if the boolean 
1dc0: 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61 6c 69  Pager.dbSizeVali
1dd0: 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  d is true..*/.st
1de0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
1df0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
1e10: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
1e20: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
1e30: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
1e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e50: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
1e60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
1e70: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
1e80: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
1e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea0: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
1eb0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
1ec0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
1ed0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ee0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
1ef0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
1f00: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
1f10: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1f30: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
1f40: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
1f50: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f70: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
1f80: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
1f90: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
1fa0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fb0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
1fc0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
1fd0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
1fe0: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
1ff0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2000: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
2010: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
2020: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
2030: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2040: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2050: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2060: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2070: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2090: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
20a0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
20b0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
20c0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
20d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20e0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
20f0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2100: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2110: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2120: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2130: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2140: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2150: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2160: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2170: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2180: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2190: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
21c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
21d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2200: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2210: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2220: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2240: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2250: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2260: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2270: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2280: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2290: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
22a0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
22b0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
22c0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20   journalMode;   
22d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20            /* On 
22e0: 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55  of the PAGER_JOU
22f0: 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65  RNALMODE_* value
2300: 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69  s */.  u8 dbModi
2310: 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  fied;           
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2330: 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61 6e  ere are any chan
2340: 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a 2f  ges to the Db */
2350: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
2360: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
2370: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
2380: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
2390: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
23a0: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c0: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
23d0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
23e0: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2400: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2420: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
2430: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2440: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
2450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2460: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
2470: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2490: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24b0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
24c0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
24d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
24e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
24f0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  n() */.  int err
2500: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
2510: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2520: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2530: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
2540: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2560: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2570: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2580: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2590: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
25a0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
25b0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
25c0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
25d0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
25e0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
25f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2600: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2610: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2620: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2640: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2650: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2660: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2670: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2690: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
26a0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
26b0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
26c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
26d0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
26e0: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
26f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2710: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2720: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
2730: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
2740: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
2750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2760: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
2770: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2780: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
2790: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
27a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
27b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
27c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c  */.  Bitvec *pAl
27e0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
27f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
2800: 65 61 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64  each page marked
2810: 20 61 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b   always-rollback
2820: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
2830: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2860: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
2870: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
2890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
28a0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
28b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
28c0: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
28d0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
28e0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73  nal files */.  s
28f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
2900: 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69   *jfd;     /* Fi
2910: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
2920: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
2930: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
2940: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2960: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2970: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2a  the sub-journal*
2980: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
2990: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
29a0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
29b0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
29c0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
29d0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
29e0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
29f0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
2a00: 6c 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ler */.  i64 jou
2a10: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
2a20: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a30: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
2a40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a50: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2a60: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2a70: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
2a80: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
2a90: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
2aa0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2ac0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
2ad0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
2ae0: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
2af0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
2b00: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
2b10: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
2b20: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
2b40: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
2b50: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
2b60: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
2b70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
2b80: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
2b90: 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c  bPage*); /* Call
2ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2bb0: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
2bc0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
2bd0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
2be0: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
2bf0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2c00: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2c10: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2c20: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2c30: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2c50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2c60: 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  dec() */.#endif.
2c70: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
2c80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2c90: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2ca0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2cb0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
2cc0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
2cd0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
2ce0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2d00: 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a  anges */.  i64 j
2d10: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
2d20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c         /* Size l
2d30: 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74  imit for persist
2d40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2d50: 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  s */.  PCache *p
2d60: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
2d70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d80: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
2d90: 63 74 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  ct */.  PagerSav
2da0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
2db0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
2dc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
2dd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
2de0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
2df0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
2e10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  epoint[] */.};..
2e20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2e30: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
2e40: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
2e50: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
2e60: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
2e70: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
2e80: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
2e90: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
2ea0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
2eb0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
2ec0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
2ed0: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
2ee0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2ef0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
2f00: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
2f10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
2f20: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
2f30: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
2f40: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2f50: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
2f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
2f70: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
2f80: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
2f90: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2fa0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
2fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2fc0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
2fd0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
2fe0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
2ff0: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
3000: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3010: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
3020: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
3030: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
3040: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
3050: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
3060: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
3070: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
3080: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
3090: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
30a0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
30b0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
30c0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
30d0: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
30e0: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
30f0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
3100: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
3110: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
3120: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
3130: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
3140: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
3150: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
3160: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
3170: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
3180: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
3190: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
31a0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
31b0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
31c0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
31d0: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
31e0: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
31f0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3200: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3210: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3220: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3230: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
3240: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
3250: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
3260: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
3270: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
3280: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
3290: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
32a0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
32b0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
32c0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
32d0: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
32e0: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
32f0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3300: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3310: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3320: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
3330: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
3340: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
3350: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
3360: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
3370: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
3380: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3390: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
33a0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
33b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
33c0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
33d0: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
33e0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
33f0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3400: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3410: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3420: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3430: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
3440: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
3450: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
3460: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
3470: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
3480: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
3490: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
34a0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
34b0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
34c0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
34d0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
34e0: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
34f0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3500: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3510: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3520: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3530: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
3550: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
3560: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
3570: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
3580: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
3590: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
35a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
35b0: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
35c0: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
35d0: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
35e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
35f0: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
3600: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3610: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
3620: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
3630: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
3640: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
3650: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
3660: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
3670: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
3680: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
3690: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
36a0: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
36b0: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
36c0: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
36d0: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
36e0: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
36f0: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
3700: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
3710: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
3720: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
3730: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
3740: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
3750: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
3760: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
3770: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
3780: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
3790: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
37a0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
37b0: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
37c0: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
37d0: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
37e0: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
37f0: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
3800: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
3810: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
3820: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
3830: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
3840: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
3850: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3860: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
3870: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
3880: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
3890: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
38a0: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
38b0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
38c0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
38d0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
38e0: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
38f0: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
3900: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
3910: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
3920: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
3930: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
3940: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
3950: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
3960: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
3970: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
3980: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
3990: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
39a0: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
39b0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
39c0: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
39d0: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
39e0: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
39f0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
3a00: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
3a10: 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50  .*/./* #define P
3a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3a30: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
3a40: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a  x)->pageSize)) *
3a50: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3a60: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 67 6e  MJ_PGNO(x) ((Pgn
3a70: 6f 29 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  o)((PENDING_BYTE
3a80: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3a90: 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  )+1))../*.** The
3aa0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
3ab0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
3ac0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
3ad0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
3ae0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
3af0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3b00: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
3b10: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
3b20: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
3b30: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
3b40: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
3b50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
3b60: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
3b70: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
3b80: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
3b90: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
3ba0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
3bb0: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
3bc0: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
3bd0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
3be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
3bf0: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
3c00: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
3c10: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
3c20: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
3c30: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
3c40: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
3c50: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
3c60: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
3c70: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
3c80: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
3c90: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
3ca0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
3cb0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
3cc0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3cd0: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
3ce0: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
3cf0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
3d00: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
3d10: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
3d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
3d30: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
3d40: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
3d50: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
3d60: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
3d70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3d80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3d90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3da0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
3db0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
3dc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
3dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3de0: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
3df0: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
3e00: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
3e10: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
3e20: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
3e30: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
3e40: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
3e50: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
3e60: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
3e70: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
3e80: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
3e90: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
3ea0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3eb0: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
3ec0: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
3ed0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
3ee0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
3ef0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
3f00: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
3f10: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
3f20: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
3f30: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
3f40: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
3f50: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
3f60: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3f70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3f80: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
3f90: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3fa0: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
3fb0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
3fc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3fd0: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
3fe0: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
3ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4000: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4010: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4020: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4030: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4040: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4050: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
4060: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
4070: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
4080: 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57  8*)A,B)../*.** W
4090: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
40a0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
40b0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
40c0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
40d0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
40e0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
40f0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4100: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4120: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
4130: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
4140: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
4150: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
4160: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
4170: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
4180: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
4190: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
41a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ;.}../*.** If fi
41b0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
41c0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
41d0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
41e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
41f0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
4200: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
4210: 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e  k){.  if( !pFd->
4220: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
4230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
4250: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
4260: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
4270: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4280: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
4290: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
42a0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
42b0: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
42c0: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
42d0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
42e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
42f0: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
4300: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
4310: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
4320: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
4330: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
4340: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
4350: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
4360: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
4370: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
4380: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
4390: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
43a0: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
43b0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
43c0: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
43d0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
43e0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
43f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
4400: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
4410: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
4420: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
4430: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
4440: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
4450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4460: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
4470: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
4480: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
4490: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
44a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
44b0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
44c0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
44d0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
44e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63  Pager){.  int dc
44f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
4500: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
4510: 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  stics */.  int n
4520: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20  Sector;      /* 
4530: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
4540: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
4550: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
4560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4570: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
4580: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
4590: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
45a0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
45b0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
45c0: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
45d0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
45e0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
45f0: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
4600: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
4610: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
4620: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
4630: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
4640: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
4650: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
4660: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
4670: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
4680: 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28   .       (dc & (
4690: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
46a0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
46b0: 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50   && nSector<=szP
46c0: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
46d0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
46e0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
46f0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4710: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
4720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4730: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4740: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4750: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4760: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4770: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4780: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
4790: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
47a0: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
47b0: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
47c0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
47d0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
47e0: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
47f0: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4800: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4810: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4820: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4850: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4860: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4870: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
4880: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
4890: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
48a0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
48b0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
48c0: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
48d0: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
48e0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
48f0: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
4900: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4910: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
4920: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
4930: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
4940: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
4950: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
4960: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4970: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
4980: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
4990: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
49a0: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
49b0: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
49c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
49d0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
49e0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
49f0: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
4a00: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
4a10: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
4a20: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
4a30: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
4a40: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
4a50: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
4a60: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
4a70: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4a80: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
4a90: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
4aa0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
4ab0: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
4ac0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
4ad0: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
4ae0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4af0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4b00: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4b10: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
4b20: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
4b30: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
4b40: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
4b50: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
4b60: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4b70: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4b80: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4b90: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4ba0: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
4bb0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4bc0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
4bd0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
4be0: 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73  NLOCK .     && s
4bf0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
4c00: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
4c10: 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b  ache)==0 .    ){
4c20: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4c30: 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
4c40: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c  y unlocked, call
4c50: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
4c60: 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  now to.      ** 
4c70: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
4c80: 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65  state and ensure
4c90: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d   that the pager-
4ca0: 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20  cache is .      
4cb0: 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  ** completely em
4cc0: 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  pty..      */.  
4cd0: 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
4ce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
4cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
4d10: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
4d20: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
4d30: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
4d40: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
4d50: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
4d60: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
4d70: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4d80: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
4d90: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4da0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
4db0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4dc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
4dd0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
4de0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
4df0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
4e00: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
4e10: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
4e20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4e30: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
4e40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4e70: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
4e80: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
4e90: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
4ea0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4eb0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
4ec0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
4ed0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
4ee0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
4ef0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
4f00: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
4f10: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
4f20: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
4f30: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
4f40: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
4f50: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
4f60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
4f70: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
4f80: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
4f90: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
4fa0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
4fb0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
4fc0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
4fd0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
4fe0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
4ff0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5000: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
5010: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
5020: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
5030: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
5040: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
5050: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
5060: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5070: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5080: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5090: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
50a0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
50b0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
50c0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
50d0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
50e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
50f0: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
5100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
5110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
5120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
5130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
5140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
5150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
5160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5180: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5190: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
51a0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
51b0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
51c0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
51d0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
51e0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
51f0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
5200: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
5210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5220: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
5230: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5240: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5250: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
5260: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
5270: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
5280: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
5290: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
52a0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
52b0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
52c0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
52d0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
52e0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
52f0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
5300: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
5310: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
5320: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
5330: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
5340: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
5350: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
5360: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
5370: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
5380: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
5390: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
53a0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
53b0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
53c0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
53d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
53e0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
53f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
5400: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
5410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5420: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
5430: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5440: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5450: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5470: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5480: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5490: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
54a0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
54b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
54c0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
54d0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
54e0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
54f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5500: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5510: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5520: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5530: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5540: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5550: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5560: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5570: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5580: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
5590: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
55a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
55b0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
55c0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
55d0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
55e0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
55f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5600: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5610: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5620: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5640: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5650: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5660: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5690: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
56a0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
56b0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
56c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
56d0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
56e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
56f0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5710: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5720: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5730: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5760: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
5770: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
5780: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5790: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
57a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
57b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
57c0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
57d0: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
57e0: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
57f0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5800: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5810: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5820: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5830: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5840: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5850: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5860: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5870: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5880: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5890: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
58a0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
58b0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
58c0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
58d0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
58e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
58f0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5900: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5910: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5940: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5950: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5960: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5970: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5980: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5990: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
59a0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
59b0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
59c0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
59d0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
59e0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
59f0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5a00: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5a10: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5a20: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5a30: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5a60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5a70: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5a80: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5a90: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5aa0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5ab0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5ac0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5ae0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
5af0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
5b00: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
5b10: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5b20: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5b30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b40: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5b50: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5b60: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5b70: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5b80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5b90: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5ba0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5bb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5bc0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5bd0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5bf0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5c00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5c10: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
5c20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5c30: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5c40: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
5c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a  }../*.** Write z
5c90: 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65  eros over the he
5ca0: 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
5cb0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
5cc0: 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63  has the.** effec
5cd0: 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e  t of invalidatin
5ce0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
5cf0: 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e  le and committin
5d00: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  g the.** transac
5d10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5d20: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
5d30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5d40: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
5d50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5d60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
5d70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
5d80: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
5d90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
5da0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
5db0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
5dc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
5dd0: 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54  eLimit;..    IOT
5de0: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
5df0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
5e00: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
5e10: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
5e20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5e30: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
5e40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
5e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5e70: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
5e80: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
5e90: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
5ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
5eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5ec0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
5ed0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5ee0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
5ef0: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
5f00: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
5f10: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
5f20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5f30: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
5f40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5f50: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
5f60: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
5f70: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
5f80: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
5f90: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
5fa0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
5fb0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
5fc0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
5fd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
5fe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
5ff0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
6000: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
6010: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
6020: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
6030: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
6040: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
6050: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
6060: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
6070: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
6080: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
6090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
60a0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
60b0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
60c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
60d0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
60e0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
60f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6100: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
6110: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
6120: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
6130: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
6140: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
6150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6160: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6170: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6180: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6190: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
61a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
61b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
61c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
61d0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
61e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
61f0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
6200: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
6210: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
6220: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
6230: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
6240: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6250: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
6260: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
6270: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
6280: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
6290: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
62a0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
62b0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
62c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
62d0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
62e0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
62f0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6300: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
6310: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6320: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6330: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6340: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6350: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6360: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
6370: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
6380: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
6390: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
63a0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
63b0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
63c0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
63d0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
63e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
63f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
6400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
6410: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
6420: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
6430: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
6440: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
6450: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 20  .  u32 nWrite;. 
6460: 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20   int ii;..  if( 
6470: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
6480: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
6490: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
64a0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
64b0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
64c0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
64d0: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
64e0: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
64f0: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 73 69   were created si
6500: 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 73  nce the.  ** mos
6510: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
6520: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
6530: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
6540: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
6550: 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65 6c  HdrOff.  ** fiel
6560: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
6570: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
6580: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
6590: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
65a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
65b0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
65c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
65d0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
65e0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
65f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6600: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
6610: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
6620: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
6630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
6640: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6650: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
6660: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6670: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6680: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
6690: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
66a0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
66b0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
66c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
66d0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
66e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
66f0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
6700: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
6710: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
6720: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
6730: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
6740: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
6750: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
6760: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
6770: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
6780: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
6790: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
67a0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
67b0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
67c0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
67d0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
67e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
67f0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
6800: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
6810: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
6820: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
6830: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
6840: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
6850: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
6860: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
6870: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
6880: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6890: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
68a0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
68b0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
68c0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
68d0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
68e0: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
68f0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
6900: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
6910: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
6920: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
6930: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
6940: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
6950: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
6960: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
6970: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
6980: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
6990: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
69a0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
69b0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
69c0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
69d0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
69e0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
69f0: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
6a00: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
6a10: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
6a20: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
6a30: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
6a40: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
6a50: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
6a60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6a70: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
6a80: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
6a90: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
6aa0: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
6ab0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
6ac0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
6ad0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
6ae0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
6af0: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
6b00: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
6b10: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
6b20: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
6b30: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
6b40: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
6b50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6b70: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
6b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
6b90: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6ba0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6bb0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
6bc0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
6bd0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6be0: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6bf0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
6c00: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
6c10: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
6c20: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6c30: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
6c40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6c50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
6c60: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6c70: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
6c80: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
6c90: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
6ca0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6cb0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6cc0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
6cd0: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
6ce0: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6cf0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6d00: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6d10: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6d20: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6d30: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6d40: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6d50: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
6d60: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
6d70: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
6d80: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
6d90: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
6da0: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
6db0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
6dc0: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
6dd0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
6de0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
6df0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
6e00: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
6e10: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
6e20: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
6e30: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
6e40: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
6e50: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
6e60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6e70: 61 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20  agic)+16], 0,.  
6e80: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
6e90: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6ea0: 61 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69  agic)+16));..  i
6eb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6ec0: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
6ed0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
6ee0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
6ef0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6f00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6f10: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
6f20: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
6f30: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
6f40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
6f50: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
6f60: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
6f70: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
6f80: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
6f90: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
6fa0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
6fb0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
6fc0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
6fd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6fe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6ff0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
7000: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
7010: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7020: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
7030: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
7040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7050: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7060: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7070: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
7080: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
7090: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
70a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
70b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
70c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
70d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
70e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
70f0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
7100: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
7110: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
7120: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
7130: 72 6e 61 6c 4f 66 66 2e 20 20 53 65 65 20 63 6f  rnalOff.  See co
7140: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
7150: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
7160: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
7170: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
7190: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
71a0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
71b0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
71c0: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
71d0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
71e0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
71f0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
7200: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
7210: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
7220: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
7230: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
7240: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7250: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
7260: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
7270: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
7280: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
7290: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
72a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
72c0: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
72d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
72e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
72f0: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
7300: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
7310: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
7320: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
7330: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
7340: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
7350: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
7360: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
7370: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
7380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7390: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
73a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
73b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
73c0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
73d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
73e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
73f0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
7400: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
7410: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
7420: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7430: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7440: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7450: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7460: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
7470: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  32 iPageSize;.  
7480: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
7490: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
74a0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
74b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
74c0: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
74e0: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
74f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
7500: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  ONE;.  }.  jrnlO
7510: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
7520: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d  rnalOff;..  rc =
7530: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7540: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
7550: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7560: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
7570: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7580: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7590: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b   sizeof(aMagic);
75a0: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
75b0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
75c0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
75d0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
75e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
75f0: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
7600: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7610: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
7620: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
7630: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7640: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7650: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
7660: 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65  rnlOff+4, &pPage
7670: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7680: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7690: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
76a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
76b0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20  jfd, jrnlOff+8, 
76c0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
76d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
76e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
76f0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
7700: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
7710: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7720: 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 26 69 50   jrnlOff+16, &iP
7730: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
7740: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7750: 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
7760: 53 69 7a 65 3c 35 31 32 20 0a 20 20 20 20 20 7c  Size<512 .     |
7770: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
7780: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
7790: 20 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67   .     || ((iPag
77a0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
77b0: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
77c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
77d0: 61 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  age-size in the 
77e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
77f0: 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  s invalid, then 
7800: 74 68 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  the process.    
7810: 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
7820: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
7830: 65 72 20 6d 75 73 74 20 68 61 76 65 20 63 72 61  er must have cra
7840: 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  shed before the 
7850: 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
7860: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
7870: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
7880: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7890: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
78a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
78b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
78c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
78d0: 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 28 75  16 pagesize = (u
78e0: 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  16)iPageSize;.  
78f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7900: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
7910: 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69  (pPager, &pagesi
7920: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
7930: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
7940: 20 7c 7c 20 70 61 67 65 73 69 7a 65 3d 3d 28 75   || pagesize==(u
7950: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
7960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7970: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7980: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
7990: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
79a0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
79b0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
79c0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
79d0: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
79e0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
79f0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
7a00: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
7a10: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7a20: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7a30: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7a40: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
7a50: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7a60: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7a70: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7a80: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
7a90: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
7aa0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
7ab0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
7ac0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
7ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
7ae0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7af0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7b00: 31 32 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  12, &iSectorSize
7b10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7b20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
7b30: 66 28 20 28 69 53 65 63 74 6f 72 53 69 7a 65 26  f( (iSectorSize&
7b40: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 29  (iSectorSize-1))
7b50: 0a 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f  .      || iSecto
7b60: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 20  rSize<512.      
7b70: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
7b80: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
7b90: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
7ba0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7bb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7bc0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
7bd0: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
7be0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7bf0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
7c00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
7c10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c20: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  _OK;.}.../*.** W
7c30: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
7c40: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
7c50: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
7c60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
7c70: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
7c80: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
7c90: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
7ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7cb0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
7cc0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
7cd0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
7ce0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
7cf0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
7d00: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
7d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
7d20: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
7d30: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
7d40: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7d50: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7d60: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7d70: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7d80: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7d90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7da0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7db0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7dc0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7dd0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7de0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
7df0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
7e00: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
7e10: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
7e20: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
7e30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7e40: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7e50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7e60: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7e70: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7e80: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7e90: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7ea0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7eb0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7ec0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7ed0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7ee0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
7f10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
7f20: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
7f30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7f40: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7f50: 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  ; .  i64 jrnlOff
7f60: 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  ;.  i64 jrnlSize
7f70: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  ;.  u32 cksum = 
7f80: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73  0;.  char zBuf[s
7f90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7fa0: 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66  gic)+2*4];..  if
7fb0: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
7fc0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
7fd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7fe0: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
7ff0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
8000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
8010: 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e  _MEMORY ) return
8020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
8030: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8040: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  = 1;..  len = sq
8050: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
8060: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
8070: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8080: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
8090: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
80a0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
80b0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
80c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
80d0: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
80e0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
80f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8100: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
8110: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
8120: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
8130: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
8140: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
8150: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
8160: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
8170: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
8180: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
8190: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72  Pager);.  }.  jr
81a0: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
81b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
81c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
81d0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
81e0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
81f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
8200: 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  rnlOff, PAGER_MJ
8210: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
8220: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8230: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8240: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b  .  jrnlOff += 4;
8250: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8260: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8270: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
8280: 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  n, jrnlOff);.  i
8290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
82b0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a  jrnlOff += len;.
82c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
82d0: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
82e0: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
82f0: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
8300: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
8310: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
8320: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
8330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8340: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
8350: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
8360: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8370: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a  ), jrnlOff);.  j
8380: 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65  rnlOff += 8+size
8390: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
83a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
83b0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
83c0: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
83d0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
83e0: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
83f0: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
8400: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
8410: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
8420: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
8430: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
8440: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
8450: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
8460: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
8470: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
8480: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
8490: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
84a0: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
84b0: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
84c0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
84d0: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
84e0: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
84f0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
8500: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
8510: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
8520: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
8530: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
8540: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
8550: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
8560: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
8570: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
8580: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
8590: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
85a0: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
85b0: 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49  .  if( (rc==SQLI
85c0: 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63  TE_OK).   && (rc
85d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
85e0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
85f0: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53  , &jrnlSize))==S
8600: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a  QLITE_OK.   && j
8610: 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a  rnlSize>jrnlOff.
8620: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
8630: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8640: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
8650: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
8660: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8670: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
8680: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
8690: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
86a0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
86b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
86c0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
86d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
86e0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
86f0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
8700: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
8710: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
8720: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
8730: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
8740: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
8750: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
8770: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
8780: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
8790: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
87a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
87b0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
87c0: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
87d0: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
87e0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
87f0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
8800: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
8810: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
8820: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
8830: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
8840: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
8850: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
8860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8870: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
8880: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
8890: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
88a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
88b0: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
88c0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
88d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
88e0: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
88f0: 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
8900: 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
8910: 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
8920: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
8930: 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
8940: 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
8950: 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
8960: 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
8970: 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
8980: 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
8990: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
89a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
89b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50 61  eAllSavepoint(Pa
89c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
89d0: 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69  int ii;.  for(ii
89e0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
89f0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
8a00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
8a10: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
8a20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8a30: 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
8a40: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
8a50: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8a60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
8a70: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8a80: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
8a90: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
8aa0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
8ab0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8ac0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
8ad0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
8ae0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
8af0: 74 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tNRec = 0;.}../*
8b00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
8b10: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
8b20: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
8b30: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
8b40: 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c 6c  itvecs of.** all
8b50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
8b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8b70: 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
8b80: 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
8b90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
8ba0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bc0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8bd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8be0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
8bf0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
8c00: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
8c10: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8c20: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
8c30: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
8c40: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
8c50: 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
8c60: 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
8c70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
8c80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
8c90: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
8ca0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  , pgno);.      a
8cb0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8cc0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
8cd0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
8ce0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
8d00: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
8d10: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
8d20: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
8d30: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
8d40: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
8d50: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
8d60: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
8d70: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
8d80: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
8d90: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
8da0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
8db0: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
8dc0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
8dd0: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
8de0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
8df0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
8e00: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
8e10: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
8e20: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
8e30: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
8e40: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
8e50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
8e60: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
8e70: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
8e80: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
8e90: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8ea0: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
8eb0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ;..    /* Always
8ec0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
8ed0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
8ee0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
8ef0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
8f00: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
8f10: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
8f20: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
8f30: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
8f40: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
8f50: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
8f60: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
8f70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8f80: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8f90: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8fa0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
8fb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8fc0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
8fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
8fe0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
8ff0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
9000: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
9010: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
9020: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
9030: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
9040: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
9050: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9060: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  pAlwaysRollback 
9070: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
9080: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
9090: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
90a0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  K);.    if( rc )
90b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
90c0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
90d0: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
90e0: 20 30 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   0;.    IOTRACE(
90f0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
9100: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
9110: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
9120: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
9130: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
9140: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
9150: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
9160: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
9170: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
9180: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
9190: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
91a0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
91b0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
91c0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
91d0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
91e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
91f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
9200: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9210: 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72  LITE_OK ) pPager
9220: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
9230: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61 67  TE_OK;.      pag
9240: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
9250: 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 41  ;.      releaseA
9260: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
9270: 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
9280: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9290: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
92a0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
92b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
92c0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
92d0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  0;.    }..    pP
92e0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
92f0: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
9300: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
9310: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
9320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
9330: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
9340: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9350: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
9360: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
9370: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
9380: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
9390: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
93a0: 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20  rror state, .** 
93b0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
93c0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he rollback..*/.
93d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
93e0: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
93f0: 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ck(Pager *p){.  
9400: 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d  if( p->errCode==
9410: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
9420: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
9430: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
9440: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9450: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
9460: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
9470: 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k(p);.    sqlite
9480: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
9490: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
94a0: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a  unlock(p);.}../*
94b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
94c0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
94d0: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
94e0: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
94f0: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
9500: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
9510: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
9520: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9530: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
9540: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
9550: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
9560: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
9570: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
9580: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
9590: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
95a0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
95b0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
95c0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
95d0: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
95e0: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
95f0: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
9600: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
9610: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
9620: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
9630: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
9640: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
9650: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
9660: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
9670: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
9680: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
9690: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
96a0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
96b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
96c0: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
96d0: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
96e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
96f0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
9700: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9710: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
9720: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
9730: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
9740: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
9750: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
9760: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
9770: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
9780: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
9790: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
97a0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
97b0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
97c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
97d0: 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
97e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
97f0: 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  K;.  int rc2 = S
9800: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
9810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
9820: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
9830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9840: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  E_OK;.  }.  rele
9850: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28  aseAllSavepoint(
9860: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
9870: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9880: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
9890: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
98a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
98b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
98c0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
98d0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
98e0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
98f0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
9900: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9910: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
9920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9930: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
9940: 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f       if( !isMemo
9950: 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  ryJournal ){.   
9960: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9970: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
9980: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
9990: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
99a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
99b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
99c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
99d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
99e0: 41 54 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  ATE.         && 
99f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  (rc = sqlite3OsT
9a00: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9a10: 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45  jfd, 0))==SQLITE
9a20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
9a30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9a40: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9a50: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9a60: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9a70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
9a80: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
9a90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9aa0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ab0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
9ac0: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
9ad0: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
9ae0: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
9af0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
9b00: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
9b10: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
9b20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9b30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9b40: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9b50: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9b60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9b70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9b80: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9b90: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
9ba0: 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c   rc );.      sql
9bb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
9bc0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
9bd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9be0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
9bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c00: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
9c10: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
9c20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
9c30: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
9c40: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
9c50: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
9c60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9c70: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
9c80: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
9c90: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
9ca0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
9cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ;.    sqlite3Bit
9cc0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
9cd0: 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
9ce0: 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ck);.    pPager-
9cf0: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
9d00: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
9d10: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9d20: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
9d30: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
9d40: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
9d50: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
9d60: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  h);.#endif.    s
9d70: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
9d80: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
9d90: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
9da0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
9db0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
9dc0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
9dd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
9de0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
9df0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
9e00: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
9e10: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
9e20: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
9e30: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
9e40: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
9e50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
9e60: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
9e70: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9e80: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
9e90: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
9ea0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
9eb0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
9ec0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9ed0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
9ee0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
9ef0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
9f00: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9f10: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
9f20: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20  dSync = 0;.  /* 
9f30: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
9f40: 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a  ynced(pPager); *
9f50: 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
9f60: 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
9f70: 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
9f80: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
9f90: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
9fa0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
9fb0: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
9fc0: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
9fd0: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
9fe0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9ff0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
a000: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
a010: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
a020: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
a030: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
a040: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
a050: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
a060: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
a070: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
a080: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
a090: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
a0a0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
a0b0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
a0c0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
a0d0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
a0e0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
a0f0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
a100: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
a110: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
a120: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
a130: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
a140: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
a150: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
a160: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
a170: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
a180: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
a190: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
a1a0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
a1b0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
a1c0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
a1d0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
a1e0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
a1f0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
a200: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
a210: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
a220: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
a230: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
a240: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
a250: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
a260: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
a270: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
a280: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
a290: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
a2a0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
a2b0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
a2c0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
a2d0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
a2e0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
a2f0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
a300: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
a310: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
a320: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
a330: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
a340: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
a350: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
a360: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
a370: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
a380: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
a390: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
a3a0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
a3b0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
a3c0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
a3d0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
a3e0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
a3f0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
a400: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
a410: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
a420: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
a430: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
a440: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
a450: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
a460: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
a470: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a480: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
a490: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
a4a0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
a4b0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
a4c0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
a4d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
a4e0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
a4f0: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
a500: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
a510: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
a520: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
a530: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
a540: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
a550: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
a560: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
a570: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
a580: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
a590: 20 66 69 6c 65 2e 20 20 54 68 65 20 20 2a 70 4f   file.  The  *pO
a5a0: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
a5b0: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
a5c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a5d0: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
a5e0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
a5f0: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
a600: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
a610: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
a620: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
a630: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
a640: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
a650: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
a660: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
a670: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
a680: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
a690: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
a6a0: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
a6b0: 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
a6c0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
a6d0: 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
a6e0: 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
a6f0: 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
a700: 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
a710: 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
a720: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a730: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
a740: 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
a750: 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
a760: 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
a770: 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
a780: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
a790: 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
a7a0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a7b0: 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
a7c0: 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
a7d0: 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  o returning..*/.
a7e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a7f0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
a800: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
a810: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
a820: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
a830: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
a840: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
a850: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
a860: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
a870: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
a880: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
a890: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
a8c0: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
a8d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
a8e0: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
a8f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
a900: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
a910: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
a920: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
a930: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
a940: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
a950: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
a960: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a970: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a990: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
a9a0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
a9b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
a9e0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
a9f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
aa00: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa20: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
aa30: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
aa40: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
aa50: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
aa60: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
aa70: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
aa80: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
aa90: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aab0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
aac0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
aad0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
aae0: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
aaf0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
ab00: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
ab10: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
ab20: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
ab30: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
ab40: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
ab50: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
ab60: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
ab70: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
ab80: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
ab90: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
aba0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
abb0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
abc0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
abd0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
abe0: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
abf0: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
ac00: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
ac10: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
ac20: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
ac30: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
ac40: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
ac50: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ac60: 65 64 20 2a 2f 0a 0a 20 20 6a 66 64 20 3d 20 69  ed */..  jfd = i
ac70: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
ac80: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
ac90: 2d 3e 73 6a 66 64 3b 0a 0a 20 20 72 63 20 3d 20  ->sjfd;..  rc = 
aca0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
acb0: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
acc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
acd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ace0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
acf0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
ad00: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
ad10: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
ad20: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
ad30: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ad40: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
ad50: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
ad60: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
ad70: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
ad80: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
ad90: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
ada0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
adb0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
adc0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
add0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
ade0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
adf0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
ae00: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
ae10: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
ae20: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
ae30: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
ae40: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
ae50: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
ae60: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
ae70: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
ae80: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
ae90: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
aea0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
aeb0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
aec0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
aed0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
aee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
aef0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
af00: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
af10: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
af20: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
af30: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
af50: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
af60: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
af70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
af80: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
af90: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
afa0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
afb0: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
afc0: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
afd0: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
afe0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
aff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b000: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
b010: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
b020: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
b030: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
b040: 6f 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  o)) ){.    retur
b050: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
b060: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
b070: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
b080: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
b090: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
b0a0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
b0b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b0c0: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
b0d0: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
b0e0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
b0f0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
b100: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
b110: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
b120: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
b130: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
b140: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
b150: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
b160: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
b170: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
b180: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
b190: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
b1a0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
b1b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
b1c0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
b1d0: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
b1e0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
b1f0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
b200: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
b210: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
b220: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
b230: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
b240: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
b250: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
b260: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
b270: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
b280: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
b290: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
b2a0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
b2b0: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
b2c0: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
b2d0: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
b2e0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
b2f0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
b300: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
b310: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
b320: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
b330: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
b340: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
b350: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
b360: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
b370: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
b380: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
b390: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
b3a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b3b0: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
b3c0: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
b3d0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
b3e0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b3f0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
b400: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
b410: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b420: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
b430: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
b440: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
b450: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
b460: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
b470: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
b480: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
b490: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
b4a0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
b4b0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
b4c0: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
b4d0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
b4e0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
b4f0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
b500: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
b510: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
b520: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
b530: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
b540: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
b550: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
b560: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
b570: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
b580: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
b590: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
b5a0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
b5b0: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
b5c0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
b5d0: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
b5e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
b5f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
b600: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
b610: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
b620: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
b630: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
b640: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
b650: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
b660: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
b670: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
b680: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
b690: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
b6a0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
b6b0: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
b6c0: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
b6d0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
b6e0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
b6f0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
b700: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
b710: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
b720: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
b730: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
b740: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
b750: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
b760: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
b770: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b780: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
b790: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
b7a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
b7b0: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
b7c0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
b7d0: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
b7e0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
b7f0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
b800: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
b810: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
b820: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
b830: 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
b840: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
b850: 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
b860: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
b870: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
b880: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
b890: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b8a0: 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  , aData),.      
b8b0: 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
b8c0: 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
b8d0: 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
b8e0: 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 28  ").  ));.  if( (
b8f0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b900: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
b910: 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c     && (pPg==0 ||
b920: 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26   0==(pPg->flags&
b930: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
b940: 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
b950: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
b960: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
b970: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
b980: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
b990: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
b9a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b9b0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
b9c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b9d0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
b9e0: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
b9f0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
ba00: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
ba10: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
ba20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
ba30: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
ba40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
ba50: 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
ba60: 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
ba70: 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
ba80: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
ba90: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
baa0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
bab0: 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
bac0: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
bad0: 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
bae0: 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
baf0: 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
bb00: 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
bb10: 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
bb20: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
bb30: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
bb40: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
bb50: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
bb60: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
bb70: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
bb80: 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
bb90: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
bba0: 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
bbb0: 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
bbc0: 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
bbd0: 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
bbe0: 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
bbf0: 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
bc00: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
bc10: 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
bc20: 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
bc30: 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
bc40: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
bc50: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
bc60: 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
bc70: 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
bc80: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
bc90: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
bca0: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
bcb0: 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
bcc0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
bcd0: 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
bce0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
bcf0: 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
bd00: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
bd10: 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
bd20: 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
bd30: 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
bd40: 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
bd50: 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
bd60: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
bd70: 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
bd80: 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
bd90: 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
bda0: 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
bdb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
bdc0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
bdd0: 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
bde0: 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
bdf0: 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
be00: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  1)) ){.      ret
be10: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
be20: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
be30: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
be40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
be50: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
be60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
be70: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
be80: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
be90: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
bea0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
beb0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
bec0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
bed0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
bee0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
bef0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
bf00: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
bf10: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
bf20: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
bf30: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
bf40: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
bf50: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
bf60: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
bf70: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
bf80: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
bf90: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
bfa0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
bfb0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
bfc0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
bfd0: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
bfe0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
bff0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
c000: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
c010: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
c020: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
c030: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
c040: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
c050: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
c060: 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
c070: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
c080: 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lOff<=pPager->jo
c090: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
c0a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
c0b0: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
c0c0: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
c0d0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
c0e0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
c0f0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
c100: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
c110: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
c120: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
c130: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
c140: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
c150: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
c160: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
c170: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
c180: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
c190: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
c1a0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
c1b0: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
c1c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
c1d0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
c1e0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
c1f0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
c200: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
c210: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
c220: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
c230: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
c240: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
c250: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
c260: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
c270: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
c280: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
c290: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
c2a0: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
c2b0: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
c2c0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
c2d0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
c2e0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
c2f0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
c300: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
c310: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
c320: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
c330: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
c340: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c350: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
c360: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
c370: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
c380: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
c390: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
c3a0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
c3b0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
c3c0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
c3d0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
c3e0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
c3f0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
c400: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
c410: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
c420: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
c430: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
c440: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
c450: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
c460: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
c470: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
c480: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
c490: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
c4a0: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
c4b0: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
c4c0: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
c4d0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
c4e0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c4f0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
c500: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
c510: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
c520: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
c530: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
c540: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c550: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
c560: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c570: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
c580: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
c590: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
c5a0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
c5b0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
c5c0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
c5d0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
c5e0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
c5f0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
c600: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c610: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
c620: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
c630: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
c640: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
c650: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
c660: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
c670: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
c680: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
c690: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
c6a0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
c6b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
c6c0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
c6d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c6e0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
c6f0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
c700: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
c710: 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
c720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
c730: 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74  oks ahead into t
c740: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
c750: 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69  file and determi
c760: 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
c770: 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72  r not the next r
c780: 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72  ecord (the recor
c790: 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74  d that begins at
c7a0: 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20   file.** offset 
c7b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c7c0: 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  ff) is a well-fo
c7d0: 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64  rmed page record
c7e0: 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f   consisting.** o
c7f0: 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e  f a valid page n
c800: 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61  umber, pPage->pa
c810: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
c820: 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65  content, followe
c830: 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20  d.** by a valid 
c840: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  checksum..**.** 
c850: 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20  The pager never 
c860: 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68  needs to know th
c870: 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  is in order to d
c880: 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69  o its job.   Thi
c890: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
c8a0: 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77  only used from w
c8b0: 69 74 68 20 61 73 73 65 72 74 28 29 20 61 6e 64  ith assert() and
c8c0: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
c8d0: 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  os..*/.static in
c8e0: 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  t pagerNextJourn
c8f0: 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50 61  alPageIsValid(Pa
c900: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c910: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
c920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
c930: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
c940: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  age */.  u32 cks
c950: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  um;           /*
c960: 20 54 68 65 20 70 61 67 65 20 63 68 65 63 6b 73   The page checks
c970: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  um */.  int rc; 
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
c9a0: 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73   read operations
c9b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
c9c0: 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68  le *fd;    /* Th
c9d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c9e0: 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  r from which we 
c9f0: 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20  are reading */. 
ca00: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
ca10: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
ca20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
ca30: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
ca40: 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65  age number heade
ca50: 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67  r */.  fd = pPag
ca60: 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20  er->jfd;.  rc = 
ca70: 72 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70  read32bits(fd, p
ca80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca90: 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  f, &pgno);.  if(
caa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cab0: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cae0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
caf0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
cb00: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
cb10: 70 50 61 67 65 72 29 20 29 7b 20 72 65 74 75 72  pPager) ){ retur
cb20: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f  n 0; }         /
cb30: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
cb40: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
cb50: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65  er->dbSize ){ re
cb60: 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb80: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a  *NO_TEST*/..  /*
cb90: 20 52 65 61 64 20 74 68 65 20 63 68 65 63 6b 73   Read the checks
cba0: 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  um */.  rc = rea
cbb0: 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67  d32bits(fd, pPag
cbc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70  er->journalOff+p
cbd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cbe0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  4, &cksum);.  if
cbf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cc00: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
cc40: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 20  * Read the data 
cc50: 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 63  and verify the c
cc60: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61  hecksum */.  aDa
cc70: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
cc80: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
cc90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
cca0: 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  d(fd, aData, pPa
ccb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
ccc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ccd0: 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
ccf0: 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
cd20: 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  EST*/.  if( page
cd30: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
cd40: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
cd50: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
cd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
cd70: 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63  EST*/..  /* Reac
cd80: 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c  h this point onl
cd90: 79 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  y if the page is
cda0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75   valid */.  retu
cdb0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
cdc0: 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  * !defined(NDEBU
cdd0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
cde0: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
cdf0: 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61  ST) */../*.** Pa
ce00: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
ce10: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
ce20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce30: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
ce40: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
ce50: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
ce60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ce70: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
ce80: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ce90: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
cea0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
ceb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
cec0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ced0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
cee0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
cef0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
cf00: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
cf10: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
cf20: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
cf30: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
cf40: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
cf50: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
cf60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
cf70: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
cf80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cf90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
cfa0: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
cfb0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
cfc0: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
cfd0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
cfe0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
cff0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
d000: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
d010: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
d020: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
d030: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
d040: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
d050: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
d060: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
d070: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
d080: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
d090: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
d0a0: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
d0b0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
d0c0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
d0d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d0e0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
d0f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
d100: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
d110: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
d120: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
d130: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
d140: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
d150: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
d160: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
d170: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d180: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
d190: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
d1a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
d1b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d1c0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
d1d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1e0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
d1f0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
d200: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
d210: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
d220: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
d230: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
d240: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
d250: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
d260: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
d270: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
d280: 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  3Malloc(pVfs->sz
d290: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
d2a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
d2b0: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
d2c0: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
d2d0: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
d2e0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
d2f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d300: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
d310: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
d320: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
d330: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
d340: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
d350: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d360: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
d370: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
d380: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
d390: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d3a0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
d3b0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
d3c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
d3d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
d3e0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
d3f0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
d400: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d410: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
d420: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
d430: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
d440: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
d450: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
d460: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
d470: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
d480: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
d490: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
d4a0: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
d4b0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
d4c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d4d0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
d4e0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
d4f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
d500: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
d510: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
d520: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
d530: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
d540: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
d550: 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
d560: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
d570: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
d580: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
d590: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
d5a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
d5b0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
d5c0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
d5d0: 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
d5e0: 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
d5f0: 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
d600: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d610: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
d620: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
d630: 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
d640: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69  urnal, 0);.    i
d650: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d660: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
d670: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
d680: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
d690: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
d6a0: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
d6b0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
d6c0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
d6d0: 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
d6e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d6f0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
d700: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
d710: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
d720: 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
d730: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d740: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d750: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
d760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d770: 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
d780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
d790: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
d7a0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
d7b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
d7c0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
d7d0: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
d7e0: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
d7f0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
d800: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
d810: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
d820: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
d830: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d840: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
d850: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
d860: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
d870: 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
d880: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
d890: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
d8a0: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
d8b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
d8c0: 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
d8d0: 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
d8e0: 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
d8f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d900: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
d910: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
d920: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
d930: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
d940: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
d950: 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
d960: 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
d970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d980: 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
d990: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d9a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d9b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
d9c0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
d9d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
d9e0: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
d9f0: 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
da00: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
da10: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
da20: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
da30: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
da40: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
da50: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da70: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
da80: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
da90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
daa0: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
dab0: 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
dac0: 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
dad0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
dae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
daf0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
db00: 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
db10: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
db20: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
db30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
db40: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
db50: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
db60: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
db70: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
db80: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
db90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dba0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
dbb0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
dbc0: 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
dbd0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
dbe0: 6e 20 61 6e 64 20 61 6e 20 65 78 63 6c 75 73 69  n and an exclusi
dbf0: 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  ve lock is held,
dc00: 20 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68   .** truncate th
dc10: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
dc20: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
dc30: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
dc40: 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 70 61  number .** of pa
dc50: 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ges..**.** It mi
dc60: 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
dc70: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
dc80: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
dc90: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67  maller than nPag
dca0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68  e..** This can h
dcb0: 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
dcc0: 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e  le, if we are in
dcd0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61   the middle of a
dce0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
dcf0: 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e 64  which has extend
dd00: 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ed the file size
dd10: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67   and the new pag
dd20: 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c  es are still all
dd30: 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68   held.** in cach
dd40: 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52  e, then an INSER
dd50: 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73  T or UPDATE does
dd60: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
dd70: 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20  lback.  Some.** 
dd80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
dd90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
dda0: 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
ddb0: 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a  d if you try to.
ddc0: 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  ** truncate a fi
ddd0: 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
dde0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
ddf0: 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79  han it currently
de00: 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63   is,.** so detec
de10: 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
de20: 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
de30: 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65 20  ero byte to the 
de40: 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a  end of the new.*
de50: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  * file instead..
de60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
de70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
de80: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
de90: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
dea0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
deb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
dec0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
ded0: 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66  IVE && pPager->f
dee0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
def0: 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
df00: 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
df10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
df20: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
df30: 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
df40: 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
df50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
df60: 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
df70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
df80: 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
df90: 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
dfa0: 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
dfb0: 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
dfc0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dfd0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
dfe0: 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
dff0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
e000: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e010: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
e020: 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c  ager->fd, "", 1,
e030: 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20   newSize-1);.   
e040: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
e050: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e060: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e070: 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
e080: 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
e090: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e0a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
e0b0: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
e0c0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e0d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
e0e0: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20  ctor size is at 
e0f0: 6c 65 61 73 74 20 61 73 20 62 69 67 20 61 73 20  least as big as 
e100: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
e110: 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73  reported.** by s
e120: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
e130: 7a 65 28 29 2e 20 54 68 65 20 6d 69 6e 69 6d 75  ze(). The minimu
e140: 6d 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  m sector size is
e150: 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
e160: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
e170: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
e180: 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  ){.  assert(pPag
e190: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
e1a0: 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
e1b0: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
e1c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
e1d0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
e1e0: 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
e1f0: 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
e200: 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
e210: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
e220: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
e230: 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
e240: 63 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  cih case the OsS
e250: 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
e260: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
e270: 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
e280: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
e290: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
e2a0: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
e2b0: 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
e2c0: 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
e2d0: 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
e2e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e2f0: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
e300: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
e310: 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
e320: 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 70 50  R_SIZE ){.    pP
e330: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e340: 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
e350: 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
e360: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
e370: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
e380: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
e390: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
e3a0: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
e3b0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
e3c0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
e3d0: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
e3e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e3f0: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
e400: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
e410: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
e420: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
e430: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
e440: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
e450: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
e460: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
e470: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
e480: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
e490: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
e4a0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
e4b0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
e4c0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
e4d0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
e4e0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
e4f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
e500: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
e510: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
e520: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
e530: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
e540: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
e550: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
e560: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
e570: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
e580: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
e590: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
e5a0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
e5b0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
e5c0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
e5d0: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
e5e0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
e5f0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
e600: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
e610: 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
e620: 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
e630: 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
e640: 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
e650: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
e660: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
e670: 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
e680: 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
e690: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
e6a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
e6b0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
e6c0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
e6d0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
e6e0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
e6f0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
e700: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
e710: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
e720: 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
e730: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
e740: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
e750: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
e760: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
e770: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
e780: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
e790: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
e7a0: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
e7b0: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
e7c0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
e7d0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
e7e0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
e7f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
e800: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
e810: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
e820: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
e830: 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
e840: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
e850: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
e860: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
e870: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
e880: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
e890: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
e8a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e8b0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
e8c0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
e8d0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
e8e0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
e8f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e900: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
e910: 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
e920: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
e930: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
e940: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
e950: 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
e960: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
e970: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
e980: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
e990: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
e9a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
e9b0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
e9c0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
e9d0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
e9e0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
e9f0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
ea00: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
ea10: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
ea20: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
ea30: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
ea40: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
ea50: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
ea60: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
ea70: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
ea80: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
ea90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
eaa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
eab0: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
eac0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
ead0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
eae0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
eaf0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
eb00: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
eb10: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
eb20: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
eb30: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
eb40: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
eb50: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
eb60: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
eb70: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
eb80: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
eb90: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
eba0: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
ebb0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
ebc0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
ebd0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
ebe0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
ebf0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
ec00: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
ec10: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
ec20: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
ec30: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
ec40: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
ec50: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
ec60: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
ec70: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
ec80: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
ec90: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
eca0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ecb0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
ecc0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
ecd0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
ece0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
ecf0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
ed00: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
ed10: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
ed20: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
ed30: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
ed40: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
ed50: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
ed60: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
ed70: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
ed80: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
ed90: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
eda0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
edb0: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
edc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
edd0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
ede0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
edf0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
ee00: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
ee10: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
ee20: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
ee30: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
ee40: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
ee50: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
ee60: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
ee70: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
ee80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ee90: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
eea0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
eeb0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
eec0: 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
eed0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
eee0: 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
eef0: 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
ef20: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
ef30: 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
ef40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
ef60: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
ef70: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
efa0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
efb0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
efc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
efd0: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
efe0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
eff0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f010: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
f020: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f030: 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
f040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f050: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f060: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
f070: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
f080: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
f090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
f0a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
f0b0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
f0c0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
f0d0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
f0e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
f0f0: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
f100: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
f110: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
f120: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f130: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
f140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f150: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
f160: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
f170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f180: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
f190: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
f1a0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
f1b0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
f1c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
f1d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
f1e0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
f1f0: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
f200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
f210: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
f220: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
f230: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
f240: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
f250: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
f260: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
f270: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
f280: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
f290: 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
f2a0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
f2b0: 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
f2c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
f2d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
f2e0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
f2f0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
f300: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f310: 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
f320: 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
f330: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f340: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
f350: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
f360: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
f370: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
f380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f390: 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
f3a0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
f3b0: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
f3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
f3d0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
f3e0: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
f3f0: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
f400: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
f410: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
f420: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
f430: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f440: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
f450: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
f460: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
f470: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
f480: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
f490: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
f4a0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
f4b0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
f4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
f4d0: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
f4e0: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
f4f0: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
f500: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
f510: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
f520: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
f530: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
f540: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
f550: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
f560: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
f570: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
f580: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
f590: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
f5a0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
f5b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f5c0: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
f5d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
f5e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f5f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
f600: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
f610: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
f620: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
f630: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
f640: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
f650: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
f660: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
f670: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
f680: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
f690: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
f6a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
f6b0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
f6c0: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
f6d0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
f6e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
f6f0: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
f700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
f710: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
f720: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
f730: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
f740: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
f750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f760: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f770: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
f780: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
f790: 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
f7a0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
f7b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
f7c0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
f7d0: 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
f7e0: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
f7f0: 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
f800: 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
f810: 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
f820: 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
f830: 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
f840: 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
f850: 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
f860: 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
f870: 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
f880: 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
f890: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
f8a0: 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
f8b0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
f8c0: 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
f8d0: 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
f8e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
f8f0: 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
f900: 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
f910: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
f920: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f930: 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
f940: 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
f950: 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
f960: 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
f970: 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
f980: 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
f990: 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
f9a0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
f9b0: 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
f9c0: 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
f9d0: 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
f9e0: 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
f9f0: 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
fa00: 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
fa10: 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
fa20: 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
fa30: 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
fa40: 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
fa50: 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
fa60: 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
fa70: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
fa80: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
fa90: 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
faa0: 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
fab0: 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
fac0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
fad0: 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
fae0: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
faf0: 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
fb00: 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
fb10: 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
fb20: 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
fb30: 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
fb40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fb50: 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
fb60: 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
fb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
fb80: 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
fb90: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
fba0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
fbb0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
fbc0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
fbd0: 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
fbe0: 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
fbf0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
fc00: 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
fc10: 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
fc20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fc30: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
fc40: 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
fc50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
fc60: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
fc70: 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
fc80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
fc90: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
fca0: 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
fcb0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
fcc0: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
fcd0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fce0: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
fcf0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
fd00: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
fd10: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
fd20: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
fd30: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fd40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
fd50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
fd60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
fd70: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
fd80: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
fd90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fda0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
fdb0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
fdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
fdd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
fde0: 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
fdf0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
fe00: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
fe10: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
fe20: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
fe30: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
fe40: 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
fe50: 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
fe60: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
fe70: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
fe80: 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
fe90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
fea0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
feb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fec0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
fed0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
fee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
fef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
ff00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
ff10: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ff20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ff30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ff40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ff50: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
ff60: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
ff70: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ff80: 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20  probably.       
ff90: 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65     ** going to e
ffa0: 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72  nd up being corr
ffb0: 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72  upt.  It is corr
ffc0: 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f  upt to us, anyho
ffd0: 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  w..          ** 
ffe0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
fff0: 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
10000 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69   along can fix i
10010 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20  t.....          
10020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
10030 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10040 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
10050 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10060 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
10070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10080 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
10090 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
100a0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
100b0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
100c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
100d0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
100e0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
100f0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
10100 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
10110 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10120 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
10130 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
10140 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
10150 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
10160 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
10170 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
10180 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
10190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
101a0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
101b0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
101c0 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
101d0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
101e0 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
101f0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
10200 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
10210 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
10220 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
10230 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  .  );..  /* If t
10240 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73 20  his playback is 
10250 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d 61  happening automa
10260 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65 73  tically as a res
10270 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72 20  ult of an IO or 
10280 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72  .  ** malloc err
10290 6f 72 20 74 68 61 74 20 6f 63 63 75 72 65 64 20  or that occured 
102a0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
102b0 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64  -counter was upd
102c0 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a 20 62  ated but .  ** b
102d0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
102e0 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d 69 74  ction was commit
102f0 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ted, then the ch
10300 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a 20 20  ange-counter .  
10310 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  ** modification 
10320 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20 62 65  may just have be
10330 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49 66 20  en reverted. If 
10340 74 68 69 73 20 68 61 70 70 65 6e 73 20 69 6e 20  this happens in 
10350 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a 2a 20  exclusive .  ** 
10360 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62 73 65  mode, then subse
10370 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  quent transactio
10380 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62 79 20  ns performed by 
10390 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
103a0 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75 70 64  ill not.  ** upd
103b0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
103c0 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e 20 54  ounter at all. T
103d0 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74 6f 20  his may lead to 
103e0 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73 74 65  cache inconsiste
103f0 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  ncy.  ** problem
10400 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72 6f 63  s for other proc
10410 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20 70 6f  esses at some po
10420 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
10430 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20 2a 2a  e. So, just.  **
10440 20 69 6e 20 63 61 73 65 20 74 68 69 73 20 68 61   in case this ha
10450 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c 65 61  s happened, clea
10460 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75 6e  r the changeCoun
10470 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77 2e 0a  tDone flag now..
10480 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 63    */.  pPager->c
10490 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
104a0 20 30 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   0;..  if( rc==S
104b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
104c0 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
104d0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
104e0 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
104f0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
10500 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
10510 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
10520 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20  thname+1);.  }. 
10530 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10540 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
10550 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
10560 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61  tion(pPager, zMa
10570 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a  ster[0]!='\0');.
10580 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
10590 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
105a0 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b 0a  er[0] && res ){.
105b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
105c0 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
105d0 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
105e0 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
105f0 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a  n success,.    *
10600 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70  * see if it is p
10610 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
10620 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10630 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rnal..    */.   
10640 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
10650 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d  aster(pPager, zM
10660 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  aster);.  }..  /
10670 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
10680 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
10690 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
106a0 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
106b0 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
106c0 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
106d0 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
106e0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
106f0 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
10700 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
10710 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
10720 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
10730 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
10740 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
10750 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
10760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
10770 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
10780 76 65 70 6f 69 6e 74 2e 20 20 4f 72 2c 20 69 66  vepoint.  Or, if
10790 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c   pSavepoint==NUL
107a0 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b  L, then playback
107b0 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d  .** the entire m
107c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
107d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  le..**.** The ca
107e0 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  se pSavepoint==N
107f0 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20  ULL occurs when 
10800 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
10810 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
10820 0a 2a 2a 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  .** on a SAVEPOI
10830 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
10840 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
10850 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
10860 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53  t pagerPlaybackS
10870 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
10880 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76  pPager, PagerSav
10890 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69  epoint *pSavepoi
108a0 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  nt){.  i64 szJ; 
108b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108c0 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69 7a  /* Effective siz
108d0 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  e of the main jo
108e0 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
108f0 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
10900 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66 69      /* End of fi
10910 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20 6d  rst segment of m
10920 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63 6f  ain-journal reco
10930 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 69  rds */.  Pgno ii
10940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10950 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
10960 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  r */.  int rc = 
10970 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
10980 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10990 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
109a0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
109b0 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75 72 65  Bitvec to ensure
109c0 20 70 61 67 65 73 20 70 6c 61 79 65 64 20 62 61   pages played ba
109d0 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a 2f 0a  ck only once */.
109e0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
109f0 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
10a00 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
10a10 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
10a20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
10a30 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
10a40 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
10a50 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
10a60 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
10a70 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
10a80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
10aa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 72 75   }.  }..  /* Tru
10ab0 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
10ac0 73 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  se back to the s
10ad0 69 7a 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  ize it was befor
10ae0 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 61 76 65  e the .  ** save
10af0 70 6f 69 6e 74 20 62 65 69 6e 67 20 72 65 76 65  point being reve
10b00 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
10b10 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
10b20 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
10b30 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
10b40 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
10b50 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
10b60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10b70 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
10b80 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 65  RED );..  /* Use
10b90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10ba0 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65 63  Off as the effec
10bb0 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65  tive size of the
10bc0 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
10bd0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68   ** journal.  Th
10be0 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d 69  e actual file mi
10bf0 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
10c00 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a 20  an this in.  ** 
10c10 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
10c20 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50 41  E_TRUNCATE or PA
10c30 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
10c40 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61 6e  PERSIST.  But an
10c50 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73 74  ything.  ** past
10c60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10c70 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69 74  Off is off-limit
10c80 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20 20  s to us..  */.  
10c90 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
10ca0 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
10cb0 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67  Begin by rolling
10cc0 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72   back records fr
10cd0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
10ce0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
10cf0 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f    ** PagerSavepo
10d00 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20  int.iOffset and 
10d10 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68  continuing to th
10d20 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
10d30 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72  eader..  ** Ther
10d40 65 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72  e might be recor
10d50 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ds in the main j
10d60 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65  ournal that have
10d70 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20   a page number. 
10d80 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e   ** greater than
10d90 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
10da0 61 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67  abase size (pPag
10db0 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20  er->dbSize) but 
10dc0 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  those.  ** will 
10dd0 62 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d  be skipped autom
10de0 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73  atically.  Pages
10df0 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44   are added to pD
10e00 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a  one as they.  **
10e10 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
10e20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
10e30 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69  vepoint ){.    i
10e40 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  HdrOff = pSavepo
10e50 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
10e60 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  ? pSavepoint->iH
10e70 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a 3b 0a  drOffset : szJ;.
10e80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10e90 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65 70 6f  nalOff = pSavepo
10ea0 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  int->iOffset;.  
10eb0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
10ec0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
10ed0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69 48 64  ->journalOff<iHd
10ee0 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 72 63  rOff ){.      rc
10ef0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
10f00 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
10f10 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d 3e 6a  r, 1, &pPager->j
10f20 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44  ournalOff, 1, pD
10f30 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65  one);.      asse
10f40 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
10f50 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ONE );.    }.  }
10f60 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
10f70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
10f80 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74  ;.  }..  /* Cont
10f90 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62 61 63  inue rolling bac
10fa0 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20 6f 66  k records out of
10fb0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
10fc0 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20 20  l starting at.  
10fd0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ** the first jou
10fe0 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 65 6e  rnal header seen
10ff0 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
11000 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65 63 74  until the effect
11010 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ive end.  ** of 
11020 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
11030 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e 75 65   file.  Continue
11040 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f 66 2d   to skip out-of-
11050 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e 64 0a  range pages and.
11060 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 64    ** continue ad
11070 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c 6c 65  ding pages rolle
11080 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e 65 2e  d back to pDone.
11090 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 72  .  */.  while( r
110a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
110b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
110c0 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33  ff<szJ ){.    u3
110d0 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
110e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
110f0 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
11100 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
11110 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
11120 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
11130 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
11140 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
11150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
11160 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
11170 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
11180 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
11190 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
111a0 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
111b0 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
111c0 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
111d0 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
111e0 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
111f0 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
11200 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
11210 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
11220 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
11230 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
11240 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52     assert( !(nJR
11250 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ec==0.         &
11260 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
11270 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
11280 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
11290 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
112a0 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
112b0 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
112c0 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
112d0 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
112e0 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
112f0 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
11300 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
11310 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  r)).    );.    i
11320 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
11330 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
11340 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
11350 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
11360 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11370 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
11380 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
11390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
113a0 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  f)/JOURNAL_PG_SZ
113b0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
113c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63      for(ii=0; rc
113d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
113e0 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61 67 65  i<nJRec && pPage
113f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a  r->journalOff<sz
11400 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  J; ii++){.      
11410 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
11420 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
11430 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d  ger, 1, &pPager-
11440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
11450 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
11460 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11470 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
11480 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
11490 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
114a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
114b0 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46  ==szJ );..  /* F
114c0 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63  inally,  rollbac
114d0 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  k pages from the
114e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50   sub-journal.  P
114f0 61 67 65 20 74 68 61 74 20 77 65 72 65 0a 20 20  age that were.  
11500 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f  ** previously ro
11510 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66  lled back out of
11520 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
11530 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65  l (and are hence
11540 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20   in pDone).  ** 
11550 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e  will be skipped.
11560 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70    Out-of-range p
11570 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b  ages are also sk
11580 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ipped..  */.  if
11590 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
115a0 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
115b0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75   pSavepoint->iSu
115c0 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
115d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 66  pageSize);.    f
115e0 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69 6e 74  or(ii=pSavepoint
115f0 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d 3d 53  ->iSubRec; rc==S
11600 51 4c 49 54 45 5f 4f 4b 26 26 69 69 3c 28 75 33  QLITE_OK&&ii<(u3
11610 32 29 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  2)pPager->stmtNR
11620 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ec; ii++){.     
11630 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
11640 3d 3d 20 69 69 2a 28 34 2b 70 50 61 67 65 72 2d  == ii*(4+pPager-
11650 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20  >pageSize) );.  
11660 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
11670 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
11680 28 70 50 61 67 65 72 2c 20 30 2c 20 26 6f 66 66  (pPager, 0, &off
11690 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  set, 1, pDone);.
116a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
116b0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
116c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
116d0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
116e0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
116f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11700 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
11710 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
11720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
11740 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
11750 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
11760 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
11770 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
11780 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11790 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
117a0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
117b0 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
117c0 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
117d0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
117e0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
117f0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
11800 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
11810 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
11820 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
11830 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
11840 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
11850 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
11860 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
11870 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
11880 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11890 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
118a0 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
118b0 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
118c0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
118d0 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
118e0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
118f0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
11900 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
11910 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
11920 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
11930 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
11940 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11950 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
11960 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
11970 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11980 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
11990 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
119a0 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
119b0 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
119c0 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
119d0 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
119e0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
119f0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
11a00 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
11a10 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
11a20 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
11a30 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
11a40 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
11a50 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
11a60 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
11a70 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
11a80 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
11a90 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
11aa0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11ab0 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
11ac0 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
11ad0 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
11ae0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
11af0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
11b00 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
11b10 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
11b20 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
11b30 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
11b40 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
11b50 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
11b60 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
11b70 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
11b80 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
11b90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11ba0 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
11bb0 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
11bc0 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
11bd0 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
11be0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
11bf0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
11c00 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
11c10 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
11c20 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
11c30 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
11c40 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
11c50 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
11c60 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
11c70 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
11c80 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
11c90 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
11ca0 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
11cb0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
11cc0 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
11cd0 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
11ce0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
11cf0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
11d00 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
11d10 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
11d20 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
11d30 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
11d40 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
11d50 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
11d60 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
11d70 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
11d80 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
11d90 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
11da0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
11db0 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
11dc0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
11dd0 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
11de0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
11df0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
11e00 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
11e10 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
11e20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
11e30 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
11e40 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
11e50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
11e60 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
11e70 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
11e80 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
11e90 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
11ea0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
11eb0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
11ec0 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
11ed0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
11ee0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
11ef0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
11f00 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
11f10 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
11f20 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
11f30 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
11f40 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
11f50 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
11f60 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
11f70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
11f80 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
11f90 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
11fa0 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
11fb0 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
11fc0 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68  e if we fail. Th
11fd0 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61  e OS will automa
11fe0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74  tically delete t
11ff0 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  he temporary.** 
12000 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
12010 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  closed..*/.stati
12020 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  c int sqlite3Pag
12030 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61  erOpentemp(.  Pa
12040 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
12050 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
12060 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c   object */.  sql
12070 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
12080 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  ,  /* Write the 
12090 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
120a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  here */.  int vf
120b0 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
120c0 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
120d0 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56  through to the V
120e0 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  FS */.){.  int r
120f0 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
12100 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
12110 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
12120 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
12130 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
12140 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
12150 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20  dif..  vfsFlags 
12160 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |=  SQLITE_OPEN_
12170 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
12180 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
12190 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  .            SQL
121a0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
121b0 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE | SQLITE_OPEN
121c0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a  _DELETEONCLOSE;.
121d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
121e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66  Open(pPager->pVf
121f0 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73  s, 0, pFile, vfs
12200 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73  Flags, 0);.  ass
12210 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
12220 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65  OK || pFile->pMe
12230 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75 72  thods );.  retur
12240 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
12250 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28  int pagerStress(
12260 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a 29 3b  void *,PgHdr *);
12270 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12280 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
12290 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
122a0 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
122b0 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
122c0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
122d0 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
122e0 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
122f0 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
12300 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
12310 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
12320 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
12330 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
12340 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
12350 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
12360 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
12370 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
12380 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
12390 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
123a0 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
123b0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
123c0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
123d0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
123e0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
123f0 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
12400 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
12410 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
12420 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
12430 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
12440 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
12450 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
12460 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
12470 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
12480 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
12490 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
124a0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
124b0 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
124c0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
124d0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
124e0 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73 71  3PagerOpen(.  sq
124f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
12500 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
12510 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74 65  rtual file syste
12520 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50 61  m to use */.  Pa
12530 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
12540 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
12550 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
12560 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
12570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
12580 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
12590 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
125a0 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
125b0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
125c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
125d0 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
125e0 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
125f0 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
12600 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
12610 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
12620 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
12630 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66  file */.  int vf
12640 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12650 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73 73     /* flags pass
12660 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
12670 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
12680 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50  ) */.){.  u8 *pP
12690 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  tr;.  Pager *pPa
126a0 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ger = 0;.  int r
126b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
126c0 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65   int i;.  int te
126d0 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e  mpFile = 0;.  in
126e0 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69  t memDb = 0;.  i
126f0 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
12700 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
12710 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
12720 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
12730 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61  ==0;.  int noRea
12740 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26  dlock = (flags &
12750 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f   PAGER_NO_READLO
12760 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f  CK)!=0;.  int jo
12770 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 0a 20  urnalFileSize;. 
12780 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65 20   int pcacheSize 
12790 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53  = sqlite3PcacheS
127a0 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73 7a 50  ize();.  int szP
127b0 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45  ageDflt = SQLITE
127c0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
127d0 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 74  ZE;.  char *zPat
127e0 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
127f0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a   nPathname = 0;.
12800 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
12810 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
12820 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
12830 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
12840 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
12850 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
12860 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c  ize(pVfs);.  }el
12870 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
12880 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
12890 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
128a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
128b0 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20   default return 
128c0 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
128d0 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  r */.  *ppPager 
128e0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
128f0 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  te and store the
12900 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 69   full pathname i
12910 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62  n an allocated b
12920 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20 20  uffer pointed.  
12930 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e 61  ** to by zPathna
12940 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74 68  me, length nPath
12950 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68 69  name. Or, if thi
12960 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
12970 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61 76   file,.  ** leav
12980 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d 65  e both nPathname
12990 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20 73   and zPathname s
129a0 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20 20  et to 0..  */.  
129b0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
129c0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
129d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
129e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
129f0 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e 61  e+1;.    zPathna
12a00 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a10 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29 3b  oc(nPathname*2);
12a20 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e 61  .    if( zPathna
12a30 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  me==0 ){.      r
12a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12a50 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  EM;.    }.#ifnde
12a60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
12a70 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
12a80 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
12a90 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
12aa0 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
12ab0 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61  1;.      zPathna
12ac0 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  me[0] = 0;.    }
12ad0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
12ae0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
12af0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12b00 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12b10 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a  me, nPathname, z
12b20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12b30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
12b40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12b50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
12b60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  thname);.      r
12b70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
12b80 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20      nPathname = 
12b90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12ba0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
12bb0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
12bc0 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
12bd0 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
12be0 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
12bf0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
12c00 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
12c10 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
12c20 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
12c30 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53  e */.    pcacheS
12c40 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20  ize      +      
12c50 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
12c60 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75  bject */.    jou
12c70 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
12c80 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
12ca0 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
12cb0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
12cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12cd0 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
12ce0 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
12cf0 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
12d00 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
12d10 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
12d20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
12d30 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f   40            /
12d40 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
12d50 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
12d60 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
12d70 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
12d80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
12d90 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
12da0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12db0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
12dc0 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 65  PCache = (PCache
12dd0 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
12de0 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26   pPtr = ((u8 *)&
12df0 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61  pPager[1]) + pca
12e00 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  cheSize;.  pPage
12e10 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
12e20 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
12e30 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
12e40 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
12e50 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
12e60 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
12e70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
12e80 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
12e90 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile];.  pPager->
12ea0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
12eb0 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
12ec0 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61  >szOsFile+journa
12ed0 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
12ee0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
12ef0 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
12f00 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a  Vfs->szOsFile+2*
12f10 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
12f20 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
12f30 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
12f40 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
12f50 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
12f60 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
12f70 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
12f80 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
12f90 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
12fa0 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50  = pVfs;.  if( zP
12fb0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
12fc0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
12fd0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
12fe0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
12ff0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13000 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
13010 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
13020 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
13030 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
13040 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
13050 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
13060 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
13070 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
13080 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a 65 6f  ame - (int)sizeo
13090 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  f("-journal")) )
130a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
130b0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
130c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
130d0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
130e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
130f0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
13100 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
13110 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20  Pager->fd,.     
13120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13130 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46      pPager->vfsF
13140 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
13150 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
13160 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
13170 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
13180 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
13190 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
131a0 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
131b0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
131c0 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  .      ** choose
131d0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
131e0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
131f0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
13200 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
13210 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
13220 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13230 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13240 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13250 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
13260 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
13270 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20  IZE,.      **   
13280 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
13290 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
132a0 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
132b0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
132c0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
132d0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
132e0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
132f0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
13300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13310 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
13320 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 74 53   ){.        setS
13330 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
13340 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
13350 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
13360 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
13370 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
13380 44 66 6c 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Dflt = pPager->s
13390 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
133a0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
133b0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
133c0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b  _WRITE.        {
133d0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
133e0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
133f0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
13400 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
13410 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
13420 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  i;.          ass
13430 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
13440 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
13450 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
13460 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
13470 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
13480 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20  (65536>>8));.   
13490 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
134a0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
134b0 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33  _PAGE_SIZE<=6553
134c0 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  6);.          fo
134d0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
134e0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
134f0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
13500 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
13510 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
13520 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
13530 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
13540 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69   szPageDflt = ii
13550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13560 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13570 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67         if( szPag
13580 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58  eDflt>SQLITE_MAX
13590 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
135a0 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ZE ){.          
135b0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c  szPageDflt = SQL
135c0 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
135d0 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20  PAGE_SIZE;.     
135e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
135f0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13600 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72  /* If a temporar
13610 79 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73  y file is reques
13620 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f  ted, it is not o
13630 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  pened immediatel
13640 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  y..    ** In thi
13650 73 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74  s case we accept
13660 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
13670 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79  e size and delay
13680 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a   actually.    **
13690 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c   opening the fil
136a0 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  e until the firs
136b0 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74  t call to OsWrit
136c0 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
136d0 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  ** This branch i
136e0 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61  s also run for a
136f0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13700 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f  base. An in-memo
13710 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  ry.    ** databa
13720 73 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  se is the same a
13730 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68  s a temp-file th
13740 61 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  at is never writ
13750 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a  ten out to.    *
13760 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20  * disk and uses 
13770 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c  an in-memory rol
13780 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20  lback journal.. 
13790 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46     */ .    tempF
137a0 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ile = 1;.    pPa
137b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
137c0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
137d0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20  }..  if( pPager 
137e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
137f0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13800 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
13810 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a  te3PageMalloc(sz
13820 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a  PageDflt);.  }..
13830 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
13840 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
13850 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
13860 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
13870 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
13880 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
13890 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
138a0 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
138b0 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
138c0 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
138d0 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
138e0 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
138f0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
13900 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
13910 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
13920 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
13930 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13940 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
13950 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13960 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
13970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
13980 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
13990 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f   }.  nExtra = FO
139a0 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
139b0 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  xtra);.  sqlite3
139c0 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67  PcacheOpen(szPag
139d0 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21  eDflt, nExtra, !
139e0 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20  memDb,.         
139f0 20 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44             !memD
13a00 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c  b?pagerStress:0,
13a10 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c   (void *)pPager,
13a20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
13a30 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
13a40 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  (("OPEN %d %s\n"
13a50 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
13a60 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
13a70 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  er->zFilename));
13a80 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
13a90 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
13aa0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
13ab0 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69  ename))..  /* Fi
13ac0 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72  ll in Pager.zDir
13ad0 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65  ectory[] */.  me
13ae0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  mcpy(pPager->zDi
13af0 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d  rectory, pPager-
13b00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
13b10 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  hname+1);.  for(
13b20 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  i=sqlite3Strlen3
13b30 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  0(pPager->zDirec
13b40 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20 69 3e  tory); .      i>
13b50 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
13b60 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
13b70 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
13b80 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
13b90 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
13ba0 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  0;..  /* Fill in
13bb0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b   Pager.zJournal[
13bc0 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  ] */.  if( zPath
13bd0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63  name ){.    memc
13be0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
13bf0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
13c00 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13c10 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  e);.    memcpy(&
13c20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
13c30 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a  [nPathname], "-j
13c40 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d  ournal", 9);.  }
13c50 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72  else{.    pPager
13c60 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  ->zJournal = 0;.
13c70 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72    }..  /* pPager
13c80 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13c90 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13ca0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
13cb0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
13cc0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
13cd0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
13ce0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
13cf0 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
13d00 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
13d10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
13d20 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
13d30 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
13d40 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
13d50 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
13d60 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70  = (u8)memDb;.  p
13d70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
13d80 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20  = szPageDflt;.  
13d90 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  /* pPager->stmtS
13da0 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
13db0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
13dc0 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
13dd0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
13de0 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13df0 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
13e00 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
13e10 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
13e20 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61  _COUNT;.  /* pPa
13e30 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
13e40 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20  ER_UNLOCK; */.  
13e50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13e60 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69  state == (tempFi
13e70 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55  le ? PAGER_EXCLU
13e80 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c  SIVE : PAGER_UNL
13e90 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61  OCK) );.  /* pPa
13ea0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
13eb0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
13ec0 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65  empFile = (u8)te
13ed0 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74  mpFile;.  assert
13ee0 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45  ( tempFile==PAGE
13ef0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
13f00 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20  RMAL .          
13f10 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  || tempFile==PAG
13f20 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
13f30 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73  XCLUSIVE );.  as
13f40 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
13f50 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
13f60 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72  E==1 );.  pPager
13f70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
13f80 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20  = (u8)tempFile; 
13f90 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
13fa0 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
13fb0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
13fc0 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
13fd0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
13fe0 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
13ff0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
14000 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = (pPager->tempF
14010 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
14020 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  al) ?1:0;.  pPag
14030 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
14040 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
14050 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
14060 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
14070 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
14080 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
14090 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
140a0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
140b0 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
140c0 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
140d0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
140e0 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
140f0 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
14100 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
14110 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
14120 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
14130 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
14140 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
14150 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  ||tempFile);.  s
14160 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14170 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
14180 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
14190 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
141a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
141b0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
141c0 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  * pPager->xBusyH
141d0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
141e0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
141f0 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b  yHandlerArg = 0;
14200 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
14210 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
14220 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
14230 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
14240 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
14250 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14260 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
14270 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
14280 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
14290 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
142a0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
142b0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
142c0 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  r, .  int (*xBus
142d0 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a  yHandler)(void *
142e0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  ),.  void *pBusy
142f0 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20 0a  HandlerArg.){  .
14300 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48    pPager->xBusyH
14310 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61  andler = xBusyHa
14320 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d  ndler;.  pPager-
14330 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  >pBusyHandlerArg
14340 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41   = pBusyHandlerA
14350 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rg;.}../*.** Set
14360 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
14370 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
14380 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
14390 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
143a0 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
143b0 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
143c0 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
143d0 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
143e0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
143f0 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
14400 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
14410 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
14420 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
14430 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
14440 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
14450 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
14460 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
14470 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
14480 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
14490 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
144a0 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
144b0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
144c0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
144d0 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50  (DbPage*)){.  pP
144e0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
144f0 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
14500 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
14510 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53   size to *pPageS
14520 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67 67  ize. If the sugg
14530 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a  est new page siz
14540 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70  e is.** inapprop
14550 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61  riate, then an a
14560 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
14570 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  size is set to t
14580 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66  hat.** value bef
14590 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
145a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
145b0 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
145c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36  ger *pPager, u16
145d0 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20   *pPageSize){.  
145e0 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d  int rc = pPager-
145f0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20  >errCode;.  if( 
14600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14610 0a 20 20 20 20 75 31 36 20 70 61 67 65 53 69 7a  .    u16 pageSiz
14620 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a  e = *pPageSize;.
14630 20 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65      assert( page
14640 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
14650 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
14660 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
14670 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
14680 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
14690 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50   && pageSize!=pP
146a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a  ager->pageSize .
146b0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
146c0 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61  >memDb==0 || pPa
146d0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a  ger->dbSize==0).
146e0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
146f0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
14700 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
14710 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
14720 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
14730 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
14740 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29  Malloc(pageSize)
14750 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
14760 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
14770 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
14780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14790 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
147a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
147b0 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
147c0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
147d0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
147e0 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74 53  er->memDb ) setS
147f0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
14800 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14810 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
14820 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
14830 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
14840 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
14850 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14860 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
14870 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
14880 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
14890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
148a0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
148b0 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
148c0 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ze;.  }.  return
148d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
148e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
148f0 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79  o the "temporary
14900 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65   page" buffer he
14910 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ld internally.**
14920 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20   by the pager.  
14930 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72  This is a buffer
14940 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f   that is big eno
14950 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ugh to hold the.
14960 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  ** entire conten
14970 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
14980 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66  page.  This buff
14990 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72  er is used inter
149a0 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20  nally.** during 
149b0 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c  rollback and wil
149c0 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e  l be overwritten
149d0 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c   whenever a roll
149e0 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  back.** occurs. 
149f0 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c   But other modul
14a00 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75  es are free to u
14a10 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f  se it too, as lo
14a20 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c  ng as.** no roll
14a30 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e  backs are happen
14a40 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ing..*/.void *sq
14a50 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70  lite3PagerTempSp
14a60 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ace(Pager *pPage
14a70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
14a80 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14a90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
14aa0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69   to set the maxi
14ab0 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67  mum database pag
14ac0 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67  e count if mxPag
14ad0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a  e is positive. .
14ae0 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
14af0 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  es if mxPage is 
14b00 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
14b10 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64  .  And never red
14b20 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d  uce the.** maxim
14b30 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65  um page count be
14b40 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  low the current 
14b50 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14b60 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61  base..**.** Rega
14b70 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65  rdless of mxPage
14b80 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72  , return the cur
14b90 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67  rent maximum pag
14ba0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
14bb0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
14bc0 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a  ageCount(Pager *
14bd0 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
14be0 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
14bf0 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  e>0 ){.    pPage
14c00 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61  r->mxPgno = mxPa
14c10 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ge;.  }.  sqlite
14c20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14c30 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65  pPager, 0);.  re
14c40 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50  turn pPager->mxP
14c50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  gno;.}../*.** Th
14c60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
14c70 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
14c80 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
14c90 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
14ca0 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
14cb0 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
14cc0 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
14cd0 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
14ce0 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
14cf0 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
14d00 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
14d10 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
14d20 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
14d30 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
14d40 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
14d50 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
14d60 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
14d70 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
14d80 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
14d90 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
14da0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
14db0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
14dc0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
14dd0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
14de0 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73  ed_cnt;.void dis
14df0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
14e00 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
14e10 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71    saved_cnt = sq
14e20 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
14e30 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65  ending;.  sqlite
14e40 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
14e50 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20  ng = -1;.}.void 
14e60 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
14e70 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
14e80 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  {.  sqlite3_io_e
14e90 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73  rror_pending = s
14ea0 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73  aved_cnt;.}.#els
14eb0 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  e.# define disab
14ec0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
14ed0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
14ee0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
14ef0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
14f00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
14f10 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
14f20 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
14f30 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
14f40 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
14f50 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
14f60 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
14f70 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
14f80 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
14f90 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
14fa0 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
14fb0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
14fc0 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
14fd0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
14fe0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
14ff0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
15000 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
15010 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
15020 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
15030 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
15040 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
15050 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
15060 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
15070 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
15080 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
15090 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
150a0 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
150b0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
150c0 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
150d0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
150e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
150f0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
15100 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
15110 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
15120 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
15130 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15140 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
15150 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
15160 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
15170 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
15180 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
15190 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d   if( pPager->fd-
151a0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
151b0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
151c0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
151d0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
151e0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
151f0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
15200 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, N, 0);.    if
15210 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
15220 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
15230 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15240 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
15250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15260 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15270 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
15280 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
15290 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
152a0 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
152b0 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
152c0 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
152d0 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
152e0 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
152f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
15300 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
15310 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
15320 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
15330 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
15340 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
15350 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
15360 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
15370 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
15380 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
15390 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
153a0 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
153b0 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
153c0 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
153d0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
153e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
153f0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
15400 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
15410 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
15420 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
15430 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
15440 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
15450 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
15460 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15470 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
15480 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20  dbSizeValid ){. 
15490 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
154a0 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
154b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
154c0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
154d0 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
154e0 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
154f0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15500 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
15510 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15520 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
15530 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
15540 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
15550 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15560 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15570 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
15580 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
15590 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
155a0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
155b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
155c0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
155d0 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
155e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
155f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
15600 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15610 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b  bSize = (Pgno)n;
15620 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
15630 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50 67 6e  bFileSize = (Pgn
15640 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65  o)n;.      pPage
15650 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
15660 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
15670 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
15680 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
15690 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
156a0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
156b0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
156c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
156d0 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20  gno = (Pgno)n;. 
156e0 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20   }.  if( pnPage 
156f0 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
15700 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20 20 72   (int)n;.  }.  r
15710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
15730 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
15740 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
15750 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
15760 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
15770 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
15780 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
15790 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
157a0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
157b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
157c0 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
157d0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
157e0 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
157f0 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
15800 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
15810 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
15820 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
15830 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
15840 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
15850 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
15860 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
15870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15880 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
15890 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
158a0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
158b0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
158c0 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
158d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
158e0 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
158f0 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
15900 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
15910 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
15920 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
15930 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
15940 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
15950 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
15960 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
15970 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
15980 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
15990 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
159a0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
159b0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
159c0 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
159d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
159e0 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
159f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
15a00 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  id==0 );..  if( 
15a10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
15a20 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
15a30 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
15a50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15a60 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
15a70 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
15a80 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
15a90 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
15aa0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
15ab0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
15ac0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
15ad0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15ae0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15af0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
15b00 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
15b10 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
15b20 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
15b30 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
15b40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15b50 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
15b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15b70 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
15b80 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d  runcate the in-m
15b90 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66  emory database f
15ba0 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61  ile image to nPa
15bb0 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a  ge pages. This .
15bc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  ** function does
15bd0 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f   not actually mo
15be0 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73  dify the databas
15bf0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
15c00 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73  It .** just sets
15c10 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
15c20 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
15c30 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20   object so that 
15c40 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69  the .** truncati
15c50 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20  on will be done 
15c60 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  when the current
15c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15c80 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f  committed..*/.vo
15c90 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  id sqlite3PagerT
15ca0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67  runcateImage(Pag
15cb0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
15cc0 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
15cd0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
15ce0 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65  eValid );.  asse
15cf0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
15d00 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 70  ze>=nPage );.  p
15d10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
15d20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
15d30 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
15d40 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
15d50 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
15d60 67 65 20 69 6e 20 70 61 67 65 73 2e 20 54 68 69  ge in pages. Thi
15d70 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 69  s.** function di
15d80 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74  ffers from sqlit
15d90 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
15da0 28 29 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a  () in two ways:.
15db0 2a 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d 61 79  **.**  a) It may
15dc0 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
15dd0 77 68 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  when at least on
15de0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  e reference to a
15df0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
15e00 20 70 61 67 65 20 69 73 20 68 65 6c 64 2e 20 54   page is held. T
15e10 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
15e20 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
15e30 20 73 69 7a 65 20 69 73 20 61 6c 72 65 61 64 79   size is already
15e40 0a 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20 61 6e  .**     known an
15e50 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  d a call to sqli
15e60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  te3OsFileSize() 
15e70 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
15e80 0a 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65 20 72  .**.**  b) The r
15e90 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6e  eturn value is n
15ea0 6f 74 20 61 64 6a 75 73 74 65 64 20 66 6f 72 20  ot adjusted for 
15eb0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
15ec0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
15ed0 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a 65 28  3PagerImageSize(
15ee0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15ef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15f00 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
15f10 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15f20 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64  ->dbSize;.}.#end
15f30 69 66 20 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  if  /* ifndef SQ
15f40 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15f50 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  CUUM */../*.** S
15f60 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
15f70 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
15f80 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
15f90 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
15fa0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
15fb0 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
15fc0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
15fd0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
15fe0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
15ff0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
16000 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
16010 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
16020 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
16030 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
16040 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
16050 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
16060 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
16070 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
16080 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
16090 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
160a0 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
160b0 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
160c0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
160d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
160e0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
160f0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
16100 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
16110 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
16120 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
16130 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16140 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
16150 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
16160 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
16170 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
16180 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
16190 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
161a0 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
161b0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
161c0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
161d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64  r *pPager){..  d
161e0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
161f0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
16200 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
16210 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50  gnMalloc();.  pP
16220 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
16230 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
16240 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
16250 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
16260 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45  ager);.  if( !ME
16270 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  MDB ){.    /* Se
16280 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
16290 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
162a0 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
162b0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
162c0 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
162d0 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
162e0 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
162f0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
16300 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
16310 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
16320 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
16330 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
16340 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
16350 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
16360 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
16370 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
16380 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
16390 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
163a0 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
163b0 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
163c0 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
163d0 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
163e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
163f0 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
16400 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
16410 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
16420 20 20 7d 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d    }.  enable_sim
16430 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
16440 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  ();.  sqlite3End
16450 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
16460 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
16470 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
16480 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
16490 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
164a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
164b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
164c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
164d0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
164e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
164f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76   }.  sqlite3Bitv
16500 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
16510 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
16520 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
16530 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
16540 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
16550 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
16560 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  point(pPager);. 
16570 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
16580 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
16590 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
165a0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
165b0 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
165c0 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
165d0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
165e0 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
165f0 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
16600 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
16610 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50    */..  sqlite3P
16620 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  ageFree(pPager->
16630 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71  pTmpSpace);.  sq
16640 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65  lite3PcacheClose
16650 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
16660 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
16670 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
16680 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
16690 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
166a0 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
166b0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
166c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
166d0 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
166e0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
166f0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
16700 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
16710 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a  ber(DbPage *p){.
16720 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f    return p->pgno
16730 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16740 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
16750 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
16760 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65  for a page.  The
16770 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69   input pointer i
16780 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65  s.** a reference
16790 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74   to the page dat
167a0 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  a..*/.int sqlite
167b0 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
167c0 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
167d0 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
167e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
167f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
16800 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
16810 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
16820 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
16830 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
16840 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
16850 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
16860 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
16870 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
16880 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
16890 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
168a0 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
168b0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
168c0 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
168d0 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
168e0 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
168f0 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
16900 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
16910 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
16920 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
16930 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
16940 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
16950 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
16960 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
16970 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
16980 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
16990 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
169a0 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
169b0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
169c0 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
169d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
169e0 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
169f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
16a00 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
16a10 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
16a20 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
16a30 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
16a40 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
16a50 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
16a60 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
16a70 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
16a80 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
16a90 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
16aa0 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
16ab0 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
16ac0 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
16ad0 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
16ae0 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
16af0 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
16b00 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
16b10 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
16b20 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
16b30 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
16b40 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
16b50 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
16b60 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
16b70 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
16b80 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  o no sync occurs
16b90 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49  ..**.** If the I
16ba0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
16bb0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
16bc0 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
16bd0 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a  edia on which.**
16be0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16bf0 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73   stored, then Os
16c00 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
16c10 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f  called on the jo
16c20 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49  urnal.** file. I
16c30 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
16c40 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
16c50 20 69 73 20 74 6f 20 75 70 64 61 74 65 20 74 68   is to update th
16c60 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 0a  e nRec field in.
16c70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
16c80 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eader..**.** Thi
16c90 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
16ca0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
16cb0 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
16cc0 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
16cd0 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
16ce0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
16cf0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
16d00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
16d10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
16d20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
16d30 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
16d40 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
16d50 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
16d60 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
16d70 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
16d80 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16d90 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
16da0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
16db0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16dc0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
16dd0 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
16de0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
16df0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
16e00 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
16e10 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
16e20 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
16e30 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
16e40 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
16e50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16e60 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a  journalOpen );..
16e70 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44        if( 0==(iD
16e80 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53  c&SQLITE_IOCAP_S
16e90 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20  AFE_APPEND) ){. 
16ea0 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f         i64 jrnlO
16eb0 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
16ec0 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
16ed0 20 20 20 20 20 20 20 75 38 20 7a 4d 61 67 69 63         u8 zMagic
16ee0 5b 38 5d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  [8];..        /*
16ef0 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c   This block deal
16f00 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63 75 72  s with an obscur
16f10 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68  e problem. If th
16f20 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
16f30 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  n.        ** tha
16f40 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69 73 20  t wrote to this 
16f50 64 61 74 61 62 61 73 65 20 77 61 73 20 6f 70 65  database was ope
16f60 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73 69 73  rating in persis
16f70 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20  tent-journal.   
16f80 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68       ** mode, th
16f90 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16fa0 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69 73 20  ile may at this 
16fb0 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79 20 62  point actually b
16fc0 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20 20 20  e larger.       
16fd0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 6a   ** than Pager.j
16fe0 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e  ournalOff bytes.
16ff0 20 49 66 20 74 68 65 20 6e 65 78 74 20 74 68 69   If the next thi
17000 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ng in the journa
17010 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
17020 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
17030 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  a journal-header
17040 20 28 77 72 69 74 74 65 6e 20 61 73 20 70 61 72   (written as par
17050 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  t of the.       
17060 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63 6f 6e   ** previous con
17070 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73 61 63  nections transac
17080 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63 72 61  tion), and a cra
17090 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c  sh or power-fail
170a0 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ure .        ** 
170b0 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e 52 65  occurs after nRe
170c0 63 20 69 73 20 75 70 64 61 74 65 64 20 62 75 74  c is updated but
170d0 20 62 65 66 6f 72 65 20 74 68 69 73 20 63 6f 6e   before this con
170e0 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 0a  nection writes .
170f0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 74 68          ** anyth
17100 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68 65 20  ing else to the 
17110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
17120 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62   commits/rolls b
17130 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20 20 20  ack its .       
17140 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 29   ** transaction)
17150 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 6d 61  , then SQLite ma
17160 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65  y become confuse
17170 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74 68 65  d when doing the
17180 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 6f 74   .        ** hot
17190 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
171a0 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f  k following reco
171b0 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c  very. It may rol
171c0 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20  l back all.     
171d0 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f     ** of this co
171e0 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61 2c 20  nnections data, 
171f0 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74 6f 20  then proceed to 
17200 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74 68 65  rolling back the
17210 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a   old,.        **
17220 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64 61 74   out-of-date dat
17230 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69  a that follows i
17240 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  t. Database corr
17250 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  uption..        
17260 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
17270 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
17280 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  s, if the journa
17290 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70 70 65  l file does appe
172a0 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20  ar to contain.  
172b0 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c 69 64        ** a valid
172c0 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e   header followin
172d0 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  g Pager.journalO
172e0 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ff, then write a
172f0 20 30 78 30 30 0a 20 20 20 20 20 20 20 20 2a 2a   0x00.        **
17300 20 62 79 74 65 20 74 6f 20 74 68 65 20 73 74 61   byte to the sta
17310 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72 65 76  rt of it to prev
17320 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65 69 6e  ent it from bein
17330 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20  g recognized..  
17340 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
17360 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
17370 20 7a 4d 61 67 69 63 2c 20 38 2c 20 6a 72 6e 6c   zMagic, 8, jrnl
17380 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
17390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
173a0 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 4d 61  && 0==memcmp(zMa
173b0 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
173c0 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20 20 20  ic, 8) ){.      
173d0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
173e0 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d 20 30   u8 zerobyte = 0
173f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
17400 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
17410 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 65  pPager->jfd, &ze
17420 72 6f 62 79 74 65 2c 20 31 2c 20 6a 72 6e 6c 4f  robyte, 1, jrnlO
17430 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff);.        }. 
17440 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17450 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
17460 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
17470 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
17480 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17490 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
174a0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
174b0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
174c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
174d0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
174e0 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
174f0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
17500 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
17510 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
17520 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
17530 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
17540 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
17550 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
17560 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
17570 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
17580 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
17590 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
175a0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
175b0 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
175c0 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
175d0 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
175e0 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
175f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
17600 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
17610 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
17620 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
17630 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
17640 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
17650 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
17660 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
17670 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
17680 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
17690 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
176a0 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
176b0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
176c0 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
176d0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
176e0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
176f0 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
17700 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
17710 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
17720 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
17730 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17740 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
17750 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
17760 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
17770 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17780 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
17790 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
177a0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
177b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
177c0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
177d0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
177e0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
177f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17800 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
17810 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
17820 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50      jrnlOff = pP
17830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17840 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
17850 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
17860 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
17870 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
17880 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c  pPager, jrnlOff,
17890 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
178a0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
178b0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
178c0 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  Off, pPager->nRe
178d0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
178e0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
178f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17900 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  ( 0==(iDc&SQLITE
17910 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
17920 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41  L) ){.        PA
17930 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
17940 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
17950 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17960 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  )));.        IOT
17970 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
17980 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
17990 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
179a0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
179b0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  jfd, pPager->syn
179c0 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20  c_flags| .      
179d0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e      (pPager->syn
179e0 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  c_flags==SQLITE_
179f0 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45  SYNC_FULL?SQLITE
17a00 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30  _SYNC_DATAONLY:0
17a10 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
17a20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
17a30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17a40 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
17a50 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
17a60 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
17a70 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17a80 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
17a90 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
17aa0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
17ab0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
17ac0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
17ad0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
17ae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
17af0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
17b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
17b10 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
17b20 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
17b30 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
17b40 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
17b50 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
17b60 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
17b70 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
17b80 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72  ile. No calls ar
17b90 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65  e made.** to the
17ba0 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20 6d   page-cache to m
17bb0 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61 73  ark the pages as
17bc0 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74 68   clean. It is th
17bd0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
17be0 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  .** of the calle
17bf0 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65 43  r to use PcacheC
17c00 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61  leanAll() or Pca
17c10 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74  cheMakeClean() t
17c20 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61  o mark.** the pa
17c30 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  ges as clean..*/
17c40 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
17c50 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
17c60 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
17c70 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
17c80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
17c90 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
17ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17cb0 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
17cc0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
17cd0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
17ce0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
17cf0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
17d00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
17d10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
17d20 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
17d30 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
17d40 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
17d50 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
17d60 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
17d70 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
17d80 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
17d90 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
17da0 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
17db0 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
17dc0 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
17dd0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
17de0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
17df0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
17e00 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
17e10 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
17e20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
17e30 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
17e40 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
17e50 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
17e60 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
17e70 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
17e80 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
17e90 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
17ea0 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
17eb0 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
17ec0 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
17ed0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
17ee0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
17ef0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
17f00 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
17f10 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
17f20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
17f30 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
17f40 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
17f50 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
17f60 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
17f70 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
17f80 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
17f90 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
17fa0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
17fb0 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
17fc0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
17fd0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
17fe0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17ff0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
18000 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
18010 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
18020 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
18030 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
18040 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
18050 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
18060 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
18070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18080 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18090 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
180a0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
180b0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
180c0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
180d0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
180e0 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
180f0 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
18100 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
18110 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
18120 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
18130 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18140 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
18150 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
18160 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
18170 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
18180 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18190 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
181a0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
181b0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
181c0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
181d0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
181e0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
181f0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
18200 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
18210 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
18220 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
18230 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
18240 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
18250 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
18260 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
18270 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
18280 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
18290 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
182a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
182b0 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
182c0 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70  >dbSize && 0==(p
182d0 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44  List->flags&PGHD
182e0 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b  R_DONT_WRITE) ){
182f0 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
18300 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  t = (pList->pgno
18310 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
18320 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
18330 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
18340 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c  ODEC2(pPager, pL
18350 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73  ist->pData, pLis
18360 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20  t->pgno, 6);..  
18370 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
18380 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
18390 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
183a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183b0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
183c0 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
183d0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
183e0 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20 20 20  (pList)));.     
183f0 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54   IOTRACE(("PGOUT
18400 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
18410 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29  r, pList->pgno))
18420 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18430 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
18440 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70  er->fd, pData, p
18450 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
18460 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
18470 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
18480 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
18490 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 50  _count);.      P
184a0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
184b0 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 20  ->nWrite);.     
184c0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
184d0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  ==1 ){.        m
184e0 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64  emcpy(&pPager->d
184f0 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74  bFileVers, &pDat
18500 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50  a[24], sizeof(pP
18510 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18520 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
18530 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
18540 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  o>pPager->dbFile
18550 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
18560 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
18570 7a 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ze = pList->pgno
18580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18590 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
185a0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50     else{.      P
185b0 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f 53 54  AGERTRACE(("NOST
185c0 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
185d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
185e0 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
185f0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
18600 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
18610 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53  urn rc;.#ifdef S
18620 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
18630 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
18640 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
18650 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
18660 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
18670 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
18680 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
18690 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
186a0 2a 2a 20 41 64 64 20 74 68 65 20 70 61 67 65 20  ** Add the page 
186b0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
186c0 61 6c 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  al. It is the ca
186d0 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
186e0 6c 69 74 79 20 74 6f 0a 2a 2a 20 75 73 65 20 73  lity to.** use s
186f0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
18700 29 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20  ) to check that 
18710 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
18720 75 69 72 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  uired before .**
18730 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
18740 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
18750 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  c int subjournal
18760 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
18770 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 6f  {.  int rc;.  vo
18780 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
18790 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20  >pData;.  Pager 
187a0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
187b0 50 61 67 65 72 3b 0a 20 20 69 36 34 20 6f 66 66  Pager;.  i64 off
187c0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
187d0 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
187e0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 63  ->pageSize);.  c
187f0 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
18800 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
18810 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
18820 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
18830 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  (("STMT-JOURNAL 
18840 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
18850 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
18860 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20  pPg->pgno));..  
18870 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
18880 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
18890 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
188a0 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
188b0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
188c0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
188d0 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
188e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
188f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18900 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
18910 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
18920 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
18930 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
18940 2b 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  +4);.  }.  if( r
18950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18960 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18970 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73 65  NRec++;.    asse
18980 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
18990 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
189a0 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70 6f  rc = addToSavepo
189b0 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65  intBitvecs(pPage
189c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  r, pPg->pgno);. 
189d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
189e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
189f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18a00 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
18a10 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
18a20 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
18a30 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
18a40 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  mit. The argumen
18a50 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
18a60 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20 50 61  o a purgeable Pa
18a70 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20  ger .** object. 
18a80 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
18a90 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20 61  tempts to make a
18aa0 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70 61   single dirty pa
18ab0 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a  ge that has no.*
18ac0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  * outstanding re
18ad0 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e 65  ferences (if one
18ae0 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20 73   exists) clean s
18af0 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
18b00 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79   recycled .** by
18b10 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   the pcache laye
18b20 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
18b30 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69   pagerStress(voi
18b40 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67  d *p, PgHdr *pPg
18b50 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
18b60 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b  er = (Pager *)p;
18b70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18b80 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50  TE_OK;..  if( pP
18b90 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
18ba0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18bb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
18bc0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
18bd0 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
18be0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
18bf0 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
18c00 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  OK ){.    if( pP
18c10 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
18c20 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
18c30 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
18c40 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
18c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18c60 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
18c70 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
18c80 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
18c90 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
18ca0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
18cb0 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20  ORY) &&.        
18cc0 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  !(sqlite3OsDevic
18cd0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
18ce0 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
18cf0 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
18d00 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a  PPEND).      ){.
18d10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18d20 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
18d30 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
18d40 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
18d50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18d70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
18d80 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
18d90 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
18da0 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o>pPager->dbSize
18db0 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
18dc0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
18dd0 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75       rc = subjou
18de0 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
18df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18e00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18e10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
18e20 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
18e30 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
18e40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
18e50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18e60 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
18e70 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18e80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
18e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18ea0 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
18eb0 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
18ec0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
18ed0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
18ee0 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
18ef0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
18f00 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65  n(pPg);.  }.  re
18f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18f20 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  ** Return 1 if t
18f30 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
18f40 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
18f50 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
18f60 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
18f70 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
18f80 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
18f90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
18fa0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
18fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18fc0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
18fd0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
18fe0 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
18ff0 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
19000 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
19010 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
19020 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
19030 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
19040 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
19050 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  l..**.** Return 
19060 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61 62  negative if unab
19070 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
19080 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
19090 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
190a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
190b0 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20  es not open the 
190c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
190d0 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63  examine its.** c
190e0 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20  ontent.  Hence, 
190f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
19100 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61  t contain the na
19110 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a  me of a master.*
19120 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
19130 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c  hat has been del
19140 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20  eted, and hence 
19150 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a  not be hot.  Or.
19160 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  ** the header of
19170 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
19180 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74  ht be zeroed out
19190 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
191a0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63  ** does not disc
191b0 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65 73  over these cases
191c0 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f   of a non-hot jo
191d0 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a  urnal - if the.*
191e0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  * journal file e
191f0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
19200 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74   empty this rout
19210 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a  ine assumes it.*
19220 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70  * is hot.  The p
19230 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20  ager_playback() 
19240 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
19250 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a  cover that the.*
19260 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
19270 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74  s not really hot
19280 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e   and will no-op.
19290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
192a0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
192b0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
192c0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
192d0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
192e0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
192f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19300 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74  _OK;.  int exist
19310 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63  s = 0;.  int loc
19320 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ked = 0;.  asser
19330 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
19340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19350 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
19360 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19370 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
19380 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30  ;.  *pExists = 0
19390 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
193a0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70  OsAccess(pVfs, p
193b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
193c0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
193d0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
193e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
193f0 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29  E_OK && exists )
19400 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19410 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
19420 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
19430 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a  , &locked);.  }.
19440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19450 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 26 26  _OK && exists &&
19460 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20   !locked ){.    
19470 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
19480 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19490 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
194a0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  , &nPage);.    i
194b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
194c0 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61   ){.     if( nPa
194d0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
194e0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
194f0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
19500 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
19510 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19520 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a    *pExists = 1;.
19530 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19540 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19550 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
19560 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
19570 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
19580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
19590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
195a0 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
195b0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
195c0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
195d0 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f   int rc;.  i64 o
195e0 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28  ffset;.  assert(
195f0 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61   MEMDB==0 );.  a
19600 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
19610 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
19620 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
19630 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19640 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
19650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19660 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19670 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d  ;.  }.  offset =
19680 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
19690 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
196a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
196b0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
196c0 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
196d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
196e0 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52  offset);.  PAGER
196f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
19700 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
19710 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
19720 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a  pPager->nRead);.
19730 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e    IOTRACE(("PGIN
19740 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
19750 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28  r, pgno));.  if(
19760 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
19770 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
19780 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
19790 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32  8*)pPg->pData)[2
197a0 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
197b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197d0 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
197e0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
197f0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
19800 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  er, pPg->pData, 
19810 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
19820 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
19830 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
19840 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
19850 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
19860 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
19870 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  g->pgno, pager_p
19880 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
19890 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
198a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
198b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
198c0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68 61  o obtain the sha
198d0 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72 65  red lock require
198e0 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61  d before.** data
198f0 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72 6f   may be read fro
19900 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
19910 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65 64  e. If the shared
19920 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61 64   lock has alread
19930 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e  y.** been obtain
19940 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
19950 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
19960 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79 20  .** Immediately 
19970 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67 20  after obtaining 
19980 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19990 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20 74  (if required), t
199a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
199b0 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f 74  checks for a hot
199c0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49  -journal file. I
199d0 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20  f one is found, 
199e0 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
199f0 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66  lback.** is perf
19a00 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ormed immediatel
19a10 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19a20 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
19a30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19a40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19a50 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45  TE_OK;.  int isE
19a60 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a  rrorReset = 0;..
19a70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
19a80 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
19a90 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
19aa0 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74  cess, has no out
19ab0 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70  standing .  ** p
19ac0 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61  age references a
19ad0 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f  nd is in an erro
19ae0 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20  r-state, now is 
19af0 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c  the chance to cl
19b00 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72  ear.  ** the err
19b10 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20  or. Discard the 
19b20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
19b30 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
19b40 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f  treat any.  ** o
19b50 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
19b60 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
19b70 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d  l..  */.  if( !M
19b80 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
19b90 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
19ba0 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
19bb0 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
19bc0 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26  r->pPCache)==0 &
19bd0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
19be0 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  e .  ){.    if( 
19bf0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19c00 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 45  pen ){.      isE
19c10 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20  rrorReset = 1;. 
19c20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
19c30 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54  >errCode = SQLIT
19c40 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f  E_OK;.    pager_
19c50 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
19c60 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
19c70 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69  pager is still i
19c80 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65  n an error state
19c90 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64  , do not proceed
19ca0 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a  . The error .  *
19cb0 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20  * state will be 
19cc0 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20  cleared at some 
19cd0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
19ce0 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67  ure when all pag
19cf0 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  e .  ** referenc
19d00 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20 61  es are dropped a
19d10 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61 6e  nd the cache can
19d20 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20   be discarded.. 
19d30 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
19d40 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
19d50 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
19d60 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
19d70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19d80 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
19d90 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19da0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19db0 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  || isErrorReset 
19dc0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
19dd0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19de0 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74  r->pVfs;.    int
19df0 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20   isHotJournal = 
19e00 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  0;.    assert( !
19e10 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73  MEMDB );.    ass
19e20 65 72 74 28 20 73 71 6c 69 74 65 33 50 63 61 63  ert( sqlite3Pcac
19e30 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
19e40 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29  r->pPCache)==0 )
19e50 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
19e60 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
19e70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
19e80 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
19e90 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
19ea0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
19eb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19ec0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19ed0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19ee0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
19ef0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
19f00 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
19f10 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , rc);.      }. 
19f20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
19f30 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19f40 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
19f50 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19f60 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
19f70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
19f80 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19f90 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
19fa0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75  .    /* If a jou
19fb0 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
19fc0 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e  , and there is n
19fd0 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  o RESERVED lock 
19fe0 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
19ff0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
1a000 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64  n it either need
1a010 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
1a020 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a  ack or deleted..
1a030 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1a040 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
1a050 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f        rc = hasHo
1a060 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  tJournal(pPager,
1a070 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b   &isHotJournal);
1a080 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a0a0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1a0b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a0c0 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52 65     if( isErrorRe
1a0d0 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72  set || isHotJour
1a0e0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nal ){.      /* 
1a0f0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
1a100 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a110 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
1a120 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
1a130 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1a140 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1a150 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1a160 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1a170 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1a180 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1a190 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
1a1a0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
1a1b0 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
1a1c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1a1d0 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65  file, detect the
1a1e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
1a1f0 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61  and conclude tha
1a200 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  t the.      ** d
1a210 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65 20  atabase is safe 
1a220 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74 68  to read while th
1a230 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  is process is st
1a240 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a  ill rolling it .
1a250 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
1a260 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a       ** .      *
1a270 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
1a280 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
1a290 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
1a2a0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
1a2b0 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
1a2c0 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
1a2d0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
1a2e0 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
1a2f0 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f  il to.      ** o
1a300 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
1a310 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a320 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a330 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
1a340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a350 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
1a360 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
1a370 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1a380 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
1a390 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1a3a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a3b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a3c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a3d0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1a3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
1a3f0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1a400 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1a410 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1a420 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
1a430 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
1a440 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
1a450 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
1a460 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
1a470 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
1a480 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
1a490 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
1a4a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1a4b0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
1a4c0 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
1a4d0 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1a4e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1a4f0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1a500 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1a510 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
1a520 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
1a530 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a540 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
1a550 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
1a560 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
1a570 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
1a580 20 20 20 20 20 20 69 66 28 20 21 69 73 45 72 72        if( !isErr
1a590 6f 72 52 65 73 65 74 20 26 26 20 70 50 61 67 65  orReset && pPage
1a5a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1a5b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
1a5c0 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
1a5d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
1a5e0 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
1a5f0 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
1a600 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
1a610 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
1a620 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a630 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a640 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
1a650 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1a660 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1a670 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
1a680 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1a690 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1a6a0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
1a6b0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1a6c0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1a6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1a6e0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1a6f0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1a700 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1a710 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
1a720 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1a730 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1a740 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1a750 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
1a760 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1a770 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74  QLITE_OK && fout
1a780 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
1a790 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20  DONLY ){.       
1a7a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1a7b0 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
1a7c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a7d0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1a7e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
1a7f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1a800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1a810 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1a820 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
1a830 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
1a840 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
1a850 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
1a860 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
1a870 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
1a880 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a890 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1a8a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a8b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a8c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
1a8e0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1a8f0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1a900 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1a910 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  1;.      pPager-
1a920 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1a930 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
1a940 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1a950 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
1a960 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1a970 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1a980 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a  urnalHdr = 0;. .
1a990 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
1a9a0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
1a9b0 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
1a9c0 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
1a9d0 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  te.      ** lock
1a9e0 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1a9f0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75  he read lock. Pu
1aa00 72 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65  rge the cache be
1aa10 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c  fore.      ** pl
1aa20 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68  aying back the h
1aa30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68  ot-journal so th
1aa40 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20  at we don't end 
1aa50 75 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  up with.      **
1aa60 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
1aa70 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f   cache..      */
1aa80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63  .      sqlite3Pc
1aa90 61 63 68 65 43 6c 65 61 72 28 70 50 61 67 65 72  acheClear(pPager
1aaa0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1aab0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
1aac0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
1aad0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1aae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aaf0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1ab00 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1ab10 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
1ab20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
1ab30 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
1ab40 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1ab50 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
1ab60 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
1ab70 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
1ab80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
1ab90 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1aba0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
1abb0 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
1abc0 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
1abd0 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
1abe0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
1abf0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
1ac00 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
1ac10 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
1ac20 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
1ac30 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
1ac40 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
1ac50 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
1ac60 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1ac70 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
1ac80 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
1ac90 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
1aca0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1acb0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
1acc0 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
1acd0 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
1ace0 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
1acf0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
1ad00 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1ad10 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
1ad20 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
1ad30 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
1ad40 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
1ad50 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
1ad60 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
1ad70 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
1ad80 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
1ad90 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
1ada0 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
1adb0 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
1adc0 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
1add0 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
1ade0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
1adf0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
1ae00 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
1ae10 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
1ae20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
1ae30 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
1ae40 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
1ae50 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
1ae60 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
1ae70 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
1ae80 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
1ae90 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1aea0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1aeb0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1aec0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1aed0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
1aee0 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
1aef0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1af00 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
1af10 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
1af20 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
1af30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1af40 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1af50 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
1af60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1af70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1af80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1af90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
1afa0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
1afb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1afc0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
1afd0 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
1afe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
1aff0 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
1b000 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
1b010 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
1b020 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
1b030 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1b040 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1b050 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
1b060 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1b070 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
1b080 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1b090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b0a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1b0b0 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
1b0c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b0d0 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
1b0e0 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
1b0f0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
1b100 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
1b110 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
1b120 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
1b130 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1b140 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
1b150 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
1b160 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
1b170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b180 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b190 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1b1a0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
1b1b0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
1b1c0 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  ;.  }.. failed:.
1b1d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
1b1f0 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
1b200 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
1b210 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
1b220 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1b230 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
1b240 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
1b250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1b270 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
1b280 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
1b290 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
1b2a0 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
1b2b0 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1b2c0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1b2d0 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
1b2e0 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
1b2f0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1b300 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
1b310 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
1b320 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
1b330 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
1b340 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
1b350 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
1b360 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
1b370 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
1b380 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
1b390 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
1b3a0 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
1b3b0 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
1b3c0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1b3d0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1b3e0 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74  _READ ){.    int
1b3f0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1b400 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
1b410 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
1b420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
1b440 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
1b450 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
1b460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b470 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b480 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1b490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1b4a0 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
1b4b0 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
1b4c0 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68  hed zero, and th
1b4d0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
1b4e0 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20  n the.** middle 
1b4f0 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  of a write trans
1b500 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64  action or opened
1b510 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
1b520 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a  de, unlock it..*
1b530 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
1b540 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
1b550 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
1b560 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
1b570 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
1b580 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1b590 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70 50  ==0).    && (!pP
1b5a0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1b5b0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
1b5c0 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20  ournalOff>0) .  
1b5d0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
1b5e0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
1b5f0 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
1b600 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20  .** Drop a page 
1b610 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75  from the cache u
1b620 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  sing sqlite3Pcac
1b630 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  heDrop()..**.** 
1b640 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
1b650 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70  ere are now no p
1b660 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65  ages with refere
1b670 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20  nces to them, a 
1b680 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
1b690 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
1b6a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1b6b0 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73  is removed..*/.s
1b6c0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
1b6d0 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20  DropPage(DbPage 
1b6e0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1b6f0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b700 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
1b710 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
1b720 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
1b730 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
1b740 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
1b750 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
1b760 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1b770 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
1b780 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
1b790 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
1b7a0 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
1b7b0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
1b7c0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
1b7d0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
1b7e0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
1b7f0 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
1b800 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
1b810 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1b820 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
1b830 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
1b840 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
1b850 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
1b860 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
1b870 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
1b880 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
1b890 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
1b8a0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
1b8b0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
1b8c0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
1b8d0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
1b8e0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
1b8f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
1b900 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
1b910 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
1b920 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
1b930 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
1b940 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
1b950 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
1b960 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
1b970 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
1b980 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
1b990 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1b9a0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
1b9b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
1b9c0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1b9d0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
1b9e0 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
1b9f0 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
1ba00 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
1ba10 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
1ba20 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1ba30 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
1ba40 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1ba50 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
1ba60 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
1ba70 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
1ba80 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
1ba90 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
1baa0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
1bab0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
1bac0 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
1bad0 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
1bae0 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
1baf0 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
1bb00 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
1bb10 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
1bb20 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
1bb30 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
1bb40 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
1bb50 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
1bb60 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
1bb70 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
1bb80 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
1bb90 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1bba0 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
1bbb0 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
1bbc0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
1bbd0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
1bbe0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
1bbf0 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
1bc00 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
1bc10 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
1bc20 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
1bc30 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
1bc40 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
1bc50 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
1bc60 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
1bc70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
1bc80 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
1bc90 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
1bca0 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
1bcb0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
1bcc0 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
1bcd0 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1bce0 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
1bcf0 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
1bd00 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
1bd10 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
1bd20 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
1bd30 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
1bd40 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
1bd50 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
1bd60 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
1bd70 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
1bd80 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
1bd90 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
1bda0 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
1bdb0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bdc0 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
1bdd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
1bde0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1bdf0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
1be00 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1be10 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
1be20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
1be30 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
1be40 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
1be50 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
1be60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
1be70 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
1be80 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
1be90 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
1bea0 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
1beb0 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
1bec0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
1bed0 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e  r *pPg = 0;.  in
1bee0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1bef0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1bf00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
1bf10 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
1bf20 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
1bf30 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
1bf40 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f   .       || pgno
1bf50 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  ==1.  );..  /* T
1bf60 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
1bf70 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
1bf80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
1bf90 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
1bfa0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
1bfb0 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
1bfc0 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
1bfd0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
1bfe0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
1bff0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
1c000 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
1c010 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1c020 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1c030 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c040 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
1c050 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
1c060 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
1c070 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
1c080 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1c090 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
1c0a0 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
1c0b0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1c0c0 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1c0d0 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1c0e0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1c0f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c100 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1c110 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1c120 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1c130 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1c140 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1c150 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1c160 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1c170 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c180 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c190 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1c1a0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1c1b0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1c1c0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1c1d0 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
1c1e0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
1c1f0 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  no, 1, &pPg);.  
1c200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c210 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1c220 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
1c230 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  g->pPager==0 ){.
1c240 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1c250 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
1c260 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
1c270 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
1c280 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
1c290 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20  nitialized..    
1c2a0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
1c2b0 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
1c2c0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
1c2d0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
1c2e0 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d 65  = pPager;.    me
1c2f0 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61  mset(pPg->pExtra
1c300 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
1c310 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  tra);..    rc = 
1c320 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1c330 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
1c340 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
1c350 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1c360 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1c370 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1c380 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c390 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61    }..    if( nMa
1c3a0 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  x<(int)pgno || M
1c3b0 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  EMDB || noConten
1c3c0 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
1c3d0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
1c3e0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  no ){.        sq
1c3f0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c400 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
1c410 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1c420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c430 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
1c440 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
1c450 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
1c460 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
1c470 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
1c480 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1c490 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20  _READ;.      }. 
1c4a0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
1c4b0 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
1c4c0 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
1c4d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1c4e0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
1c4f0 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
1c500 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1c510 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1c520 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
1c530 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
1c540 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50       /* sqlite3P
1c550 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20  agerUnref(pPg); 
1c560 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
1c570 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20  DropPage(pPg);. 
1c580 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1c590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c5a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
1c5b0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
1c5c0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
1c5d0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1c5e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
1c5f0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
1c600 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
1c610 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1c620 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
1c630 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
1c640 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
1c650 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e  PCache)>0 || pgn
1c660 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
1c670 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
1c680 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
1c690 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
1c6a0 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1c6b0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1c6c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1c6d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c6e0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1c6f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1c710 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   }..  *ppPage = 
1c720 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1c730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c740 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
1c750 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
1c760 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
1c770 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
1c780 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
1c790 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
1c7a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1c7b0 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
1c7c0 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
1c7d0 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
1c7e0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1c7f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1c800 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
1c810 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1c820 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
1c830 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1c840 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
1c850 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
1c860 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
1c870 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
1c880 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1c890 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
1c8a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1c8b0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
1c8c0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1c8d0 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
1c8e0 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
1c8f0 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
1c900 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
1c910 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
1c920 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
1c930 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1c940 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1c950 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
1c960 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1c970 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1c980 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ..  if( (pPager-
1c990 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1c9a0 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61  LOCK).   && (pPa
1c9b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
1c9c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1c9d0 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
1c9e0 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  TE_FULL).  ){.  
1c9f0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
1ca00 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
1ca10 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
1ca20 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
1ca30 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
1ca40 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
1ca50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1ca60 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1ca70 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
1ca80 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
1ca90 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
1caa0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
1cab0 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
1cac0 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
1cad0 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
1cae0 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
1caf0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
1cb00 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
1cb10 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
1cb20 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
1cb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1cb40 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
1cb50 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
1cb60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1cb70 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1cb80 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1cb90 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
1cba0 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
1cbb0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
1cbc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1cbd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1cbe0 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  If the main jour
1cbf0 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61 6c 72  nal file has alr
1cc00 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64  eady been opened
1cc10 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  , ensure that th
1cc20 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  e.** sub-journal
1cc30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20 74 6f   file is open to
1cc40 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  o. If the main j
1cc50 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 6f 70  ournal is not op
1cc60 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en,.** this func
1cc70 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1cc80 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1cc90 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1cca0 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65 73 20  everything goes 
1ccb0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70 6c 61  according to pla
1ccc0 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  n. An .** SQLITE
1ccd0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
1cce0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ccf0 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  d if the call to
1cd00 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f 70   .** sqlite3OsOp
1cd10 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  en() fails..*/.s
1cd20 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53 75  tatic int openSu
1cd30 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  bJournal(Pager *
1cd40 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1cd50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cd60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1cd70 72 6e 61 6c 4f 70 65 6e 20 26 26 20 21 70 50 61  rnalOpen && !pPa
1cd80 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68  ger->sjfd->pMeth
1cd90 6f 64 73 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ods ){.    if( p
1cda0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1cdb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
1cdc0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
1cdd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
1cde0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
1cdf0 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d  er->sjfd);.    }
1ce00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1ce10 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1ce20 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1ce30 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c 49  ager->sjfd, SQLI
1ce40 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1ce50 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  AL);.    }.  }. 
1ce60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ce70 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1ce80 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1ce90 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1cea0 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1ceb0 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1cec0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1ced0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cee0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1cef0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1cf00 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1cf10 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1cf20 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1cf30 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1cf40 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1cf50 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1cf60 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1cf70 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1cf80 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1cf90 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1cfa0 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
1cfb0 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1cfc0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 66  r->pVfs;.  int f
1cfd0 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
1cfe0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
1cff0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1d000 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
1d010 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e 74 20  CREATE);..  int 
1d020 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
1d030 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d040 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1d050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d060 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
1d070 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d080 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1d090 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1d0a0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1d0b0 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
1d0c0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
1d0d0 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
1d0e0 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
1d0f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1d100 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  pInJournal==0 ){
1d110 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1d120 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
1d130 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1d140 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20  journal;.  }..  
1d150 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1d160 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
1d170 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65    if( pPager->te
1d180 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
1d190 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1d1a0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1d1b0 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  OSE|SQLITE_OPEN_
1d1c0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  TEMP_JOURNAL);. 
1d1d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d1e0 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45  flags |= (SQLITE
1d1f0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1d200 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
1d210 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1d220 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
1d230 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1d240 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1d250 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28  3MemJournalOpen(
1d260 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
1d270 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d280 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23  OK;.    }else{.#
1d290 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1d2a0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1d2b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d2c0 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
1d2d0 20 20 20 20 20 20 20 20 20 20 70 56 66 73 2c 20            pVfs, 
1d2e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d2f0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
1d300 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72  lags, jrnlBuffer
1d310 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20  Size(pPager).   
1d320 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
1d330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1d340 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1d350 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1d360 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1d370 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
1d380 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  }.    assert( rc
1d390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1d3a0 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
1d3b0 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50 61 67  hods );.    pPag
1d3c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1d3d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1d3e0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1d3f0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1d400 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20 20 69  alHdr = 0;.    i
1d410 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d420 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
1d430 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1d440 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1d450 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
1d460 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1d470 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1d480 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1d490 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1d4a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61  .    }.  }.  pPa
1d4b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1d4c0 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
1d4d0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1d4e0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
1d4f0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
1d500 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
1d510 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d520 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
1d530 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1d540 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
1d550 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1d560 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1d570 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
1d580 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
1d590 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1d5a0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1d5b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
1d5c0 53 61 76 65 70 6f 69 6e 74 20 26 26 20 72 63 3d  Savepoint && rc=
1d5d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d5e0 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
1d5f0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1d600 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
1d610 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1d620 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63  LITE_NOMEM && rc
1d630 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  !=SQLITE_IOERR_N
1d640 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1d650 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1d660 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
1d670 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1d680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d690 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1d6a0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
1d6b0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
1d6c0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1d6d0 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74  al:.  sqlite3Bit
1d6e0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
1d6f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
1d700 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
1d710 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75  rnal = 0;.  retu
1d720 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d730 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
1d740 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d750 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
1d760 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
1d770 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
1d780 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
1d790 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
1d7a0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1d7b0 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
1d7c0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1d7d0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1d7e0 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
1d7f0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1d800 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
1d810 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1d820 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d830 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
1d840 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
1d850 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
1d860 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
1d870 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
1d880 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
1d890 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
1d8a0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
1d8b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
1d8c0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
1d8d0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
1d8e0 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
1d8f0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
1d900 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1d910 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
1d920 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
1d930 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
1d940 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
1d950 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d960 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
1d970 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
1d980 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
1d990 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
1d9a0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
1d9b0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1d9c0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
1d9d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1d9e0 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
1d9f0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
1da00 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
1da10 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
1da20 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
1da30 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
1da40 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
1da50 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
1da60 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
1da70 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
1da80 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
1da90 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
1daa0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1dab0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1dac0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
1dad0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1dae0 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1daf0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1db00 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1db10 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1db20 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1db30 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1db40 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1db50 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1db60 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1db70 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1db80 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1db90 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1dba0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1dbb0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1dbc0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1dbd0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1dbe0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1dbf0 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1dc00 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1dc10 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1dc20 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1dc30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1dc40 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1dc50 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1dc60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1dc70 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1dc80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1dc90 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1dca0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1dcb0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1dcc0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
1dcd0 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
1dce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1dcf0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1dd00 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1dd10 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1dd20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dd30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1dd40 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1dd50 0a 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61  .      if( exFla
1dd60 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  g ){.        rc 
1dd70 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1dd80 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1dd90 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1dda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ddb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ddc0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1ddd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1dde0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1ddf0 68 65 20 3d 20 30 3b 0a 20 20 20 20 50 41 47 45  he = 0;.    PAGE
1de00 52 54 52 41 43 45 28 28 22 54 52 41 4e 53 41 43  RTRACE(("TRANSAC
1de10 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1de20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1de30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1de40 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1de50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20  ager->tempFile. 
1de60 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
1de70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1de80 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1de90 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
1dea0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1deb0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1dec0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
1ded0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1dee0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1def0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
1df00 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1df10 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
1df20 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
1df30 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1df40 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20  ode the last.   
1df50 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
1df60 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
1df70 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
1df80 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
1df90 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1dfa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
1dfb0 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
1dfc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1dfd0 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
1dfe0 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65   kept open and e
1dff0 69 74 68 65 72 20 77 61 73 20 74 72 75 6e 63 61  ither was trunca
1e000 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f  ted to 0 bytes o
1e010 72 20 69 74 73 20 68 65 61 64 65 72 20 77 61 73  r its header was
1e020 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74  .    ** overwrit
1e030 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ten with zeros..
1e040 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1e050 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
1e060 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1e070 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  ( pPager->dbOrig
1e080 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
1e090 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
1e0a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1e0b0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e0c0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1e0d0 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67 65 72  , 0);.    pPager
1e0e0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
1e0f0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
1e100 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  te( pPager->dbSi
1e110 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ze );.    if( !p
1e120 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1e130 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1e140 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e160 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1e170 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1e180 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1e190 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1e1a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1e1b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1e1c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1e1d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1e1e0 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1e1f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1e200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e210 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
1e220 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
1e230 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
1e240 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1e250 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
1e260 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1e270 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
1e280 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
1e290 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
1e2a0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
1e2b0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
1e2c0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1e2d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1e2e0 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
1e2f0 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
1e300 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
1e310 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
1e320 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1e330 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
1e340 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
1e350 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
1e360 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
1e370 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1e380 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
1e390 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1e3a0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
1e3b0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
1e3c0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
1e3d0 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
1e3e0 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
1e3f0 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
1e400 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1e410 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
1e420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e430 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
1e440 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
1e450 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
1e460 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
1e470 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
1e480 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
1e490 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
1e4a0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
1e4b0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
1e4c0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
1e4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1e4e0 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
1e4f0 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
1e500 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28  ite3PagerCommit(
1e510 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65  ) or sqlite3Page
1e520 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a  rRollback() to.*
1e530 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  * reset..*/.stat
1e540 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1e550 74 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  te(PgHdr *pPg){.
1e560 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20    void *pData = 
1e570 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61  pPg->pData;.  Pa
1e580 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e590 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1e5a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e5b0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1e5c0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1e5d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1e5e0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1e5f0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1e600 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1e610 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1e620 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e630 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1e640 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1e650 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1e660 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1e670 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1e680 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1e690 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1e6a0 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1e6b0 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1e6c0 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1e6d0 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1e6e0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1e6f0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1e700 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1e710 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1e720 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1e730 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1e740 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1e750 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1e760 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1e770 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1e780 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1e790 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1e7a0 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1e7b0 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1e7c0 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1e7d0 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1e7e0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1e7f0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1e800 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1e810 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1e820 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1e830 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1e840 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1e850 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e860 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1e870 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1e880 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1e890 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1e8a0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1e8b0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1e8c0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1e8d0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73  t away..  */.  s
1e8e0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
1e8f0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1e900 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28  ( pageInJournal(
1e910 70 50 67 29 20 26 26 20 21 73 75 62 6a 52 65 71  pPg) && !subjReq
1e920 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1e930 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
1e940 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1e950 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
1e960 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  fied = 1;.  }els
1e970 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
1e980 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
1e990 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1e9a0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
1e9b0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
1e9c0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
1e9d0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
1e9e0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
1e9f0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
1ea00 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
1ea10 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
1ea20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
1ea30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1ea40 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
1ea50 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
1ea60 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1ea70 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1ea80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ea90 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1eaa0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1eab0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67  e3PagerBegin(pPg
1eac0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1ead0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1eae0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1eaf0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1eb00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1eb10 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1eb20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1eb30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1eb40 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
1eb50 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
1eb60 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1eb70 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1eb80 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
1eb90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1eba0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1ebb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1ebc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ebd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1ebe0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
1ebf0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1ec00 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
1ec10 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20  ified = 1;.  .  
1ec20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1ec30 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
1ec40 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
1ec50 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
1ec60 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
1ec70 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1ec80 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1ec90 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
1eca0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1ecb0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
1ecc0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1ecd0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1ece0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
1ecf0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65  */.    if( !page
1ed00 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
1ed10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
1ed20 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
1ed30 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  f( pPg->pgno<=pP
1ed40 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1ed50 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20   ){.        u32 
1ed60 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 63  cksum;.        c
1ed70 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
1ed80 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1ed90 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1eda0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1edb0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1edc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
1edd0 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1ede0 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1edf0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1ee00 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1ee10 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1ee20 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  t. */.        as
1ee30 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
1ee40 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1ee50 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
1ee60 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43    pData2 = CODEC
1ee70 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
1ee80 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a   pPg->pgno, 7);.
1ee90 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
1eea0 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
1eeb0 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29  er, (u8*)pData2)
1eec0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
1eed0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1eee0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1eef0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d  journalOff, pPg-
1ef00 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1ef10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ef20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ef30 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1ef40 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
1ef50 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1ef60 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ef90 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b  journalOff + 4);
1efa0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1efb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1efc0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1efd0 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e+4;.        }. 
1efe0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1eff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f000 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1f010 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1f020 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1f030 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a  nalOff, cksum);.
1f040 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1f050 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
1f060 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
1f070 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1f080 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1f090 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1f0a0 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20  g->pgno, .      
1f0b0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1f0c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1f0d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f0e0 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1f0f0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1f100 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1f110 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  );.        PAGER
1f120 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20  TRACE(("JOURNAL 
1f130 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1f140 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
1f150 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1f160 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1f170 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a  r), pPg->pgno, .
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1f190 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1f1a0 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c  NEED_SYNC)?1:0),
1f1b0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1f1c0 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20 20 20  pPg)));..       
1f1d0 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e 20 49   /* Even if an I
1f1e0 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20 65 72  O or diskfull er
1f1f0 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68 69  ror occurred whi
1f200 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74  le journalling t
1f210 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  he.        ** pa
1f220 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20  ge in the block 
1f230 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65 20 6e  above, set the n
1f240 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f  eed-sync flag fo
1f250 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  r the page..    
1f260 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
1f270 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  , when the trans
1f280 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
1f290 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63   back, the logic
1f2a0 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
1f2b0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
1f2c0 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68  () will think th
1f2d0 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
1f2e0 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72 65 64  s to be restored
1f2f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
1f300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f310 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f 20 65  . And if an IO e
1f320 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1f330 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20  e doing so,.    
1f340 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72      ** then corr
1f350 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f  uption may follo
1f360 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  w..        */.  
1f370 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1f380 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1f390 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
1f3a0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
1f3b0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20  SYNC;.          
1f3c0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1f3d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
1f3e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
1f3f0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1f400 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1f410 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1f420 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  e .        ** tr
1f430 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1f440 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1f450 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1f460 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1f470 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f4a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f4b0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
1f4c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1f4d0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1f4e0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1f4f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f500 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
1f510 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
1f520 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1f530 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53   testcase( rc==S
1f540 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1f550 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
1f560 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
1f570 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1f580 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c   );.        rc |
1f590 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74  = addToSavepoint
1f5a0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1f5b0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1f5c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f5d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f5e0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
1f5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1f600 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f610 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1f620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f630 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f640 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
1f650 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
1f660 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
1f670 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
1f680 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
1f690 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1f6a0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1f6b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f6c0 50 41 47 45 52 54 52 41 43 45 28 28 22 41 50 50  PAGERTRACE(("APP
1f6d0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1f6e0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1f700 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1f710 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  pPg->pgno,.     
1f720 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
1f730 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1f740 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a  D_SYNC)?1:0)));.
1f750 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f760 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1f770 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1f780 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1f790 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1f7a0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1f7b0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1f7c0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1f7d0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1f7e0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1f7f0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1f800 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1f810 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1f820 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1f830 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1f840 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1f850 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1f860 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1f870 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75     */.    if( su
1f880 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1f890 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Pg) ){.      rc 
1f8a0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
1f8b0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1f8c0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1f8d0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1f8e0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1f8f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f900 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1f910 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1f920 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
1f930 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1f940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f950 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1f960 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1f970 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50 47  ze==(PAGER_MJ_PG
1f980 4e 4f 28 70 50 61 67 65 72 29 2d 31 29 20 29 7b  NO(pPager)-1) ){
1f990 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
1f9a0 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
1f9b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f9d0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1f9e0 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61  o mark a data-pa
1f9f0 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20  ge as writable. 
1fa00 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65  It uses .** page
1fa10 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65  r_write() to ope
1fa20 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
1fa30 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1fa40 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20  lready open).** 
1fa50 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61  and write the pa
1fa60 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65  ge *pData to the
1fa70 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1fa80 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
1fa90 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
1faa0 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77  tion and pager_w
1fab0 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74  rite() is that t
1fac0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
1fad0 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20  also deals with 
1fae0 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
1faf0 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65   where 2 or more
1fb00 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e   pages.** fit on
1fb10 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73   a single disk s
1fb20 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63  ector. In this c
1fb30 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64  ase all co-resid
1fb40 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73  ent pages.** mus
1fb50 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  t have been writ
1fb60 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
1fb70 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72  al file before r
1fb80 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  eturning..*/.int
1fb90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fba0 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  te(DbPage *pDbPa
1fbb0 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
1fbc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67  SQLITE_OK;..  Pg
1fbd0 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
1fbe0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
1fbf0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1fc00 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50  r;.  Pgno nPageP
1fc10 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67  erSector = (pPag
1fc20 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70  er->sectorSize/p
1fc30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1fc40 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65  ;..  if( nPagePe
1fc50 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1fc60 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1fc70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1fc80 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1fc90 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1fca0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1fcb0 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1fcc0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1fcd0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1fce0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1fcf0 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1fd00 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1fd10 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1fd20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1fd30 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1fd40 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1fd50 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53  i;.    int needS
1fd60 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
1fd70 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
1fd80 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
1fd90 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
1fda0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
1fdb0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
1fdc0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
1fdd0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
1fde0 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
1fdf0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1fe00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1fe10 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
1fe20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1fe30 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1fe40 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1fe50 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1fe60 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1fe70 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1fe80 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1fe90 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1fea0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1feb0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1fec0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1fed0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1fee0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1fef0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1ff00 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1ff10 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1ff20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1ff30 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1ff40 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1ff50 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1ff60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1ff70 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ff80 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
1ff90 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
1ffa0 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43  pPg->pgno>nPageC
1ffb0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1ffc0 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f  age = (pPg->pgno
1ffd0 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d   - pg1)+1;.    }
1ffe0 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50  else if( (pg1+nP
1fff0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e  agePerSector-1)>
20000 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
20010 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
20020 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20  eCount+1-pg1;.  
20030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
20040 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53  Page = nPagePerS
20050 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  ector;.    }.   
20060 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29   assert(nPage>0)
20070 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31  ;.    assert(pg1
20080 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  <=pPg->pgno);.  
20090 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50    assert((pg1+nP
200a0 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b  age)>pPg->pgno);
200b0 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ..    for(ii=0; 
200c0 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d  ii<nPage && rc==
200d0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29  SQLITE_OK; ii++)
200e0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20  {.      Pgno pg 
200f0 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20  = pg1+ii;.      
20100 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20  PgHdr *pPage;.  
20110 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d      if( pg==pPg-
20120 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65  >pgno || !sqlite
20130 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
20140 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
20150 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pg) ){.        i
20160 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f  f( pg!=PAGER_MJ_
20170 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
20180 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20190 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
201a0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
201b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
201c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
201d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
201e0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
201f0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
20200 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
20210 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
20220 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
20230 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
20240 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
20250 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
20260 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
20270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20280 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
20290 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
202a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
202b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
202c0 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70  e if( (pPage = p
202d0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
202e0 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20  er, pg))!=0 ){. 
202f0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
20300 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
20310 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20  ED_SYNC ){.     
20320 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
20330 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
20340 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20350 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
20360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20370 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44    /* If the PGHD
20380 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
20390 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20   is set for any 
203a0 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67  of the nPage pag
203b0 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  es .    ** start
203c0 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e  ing at pg1, then
203d0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
203e0 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  set for all of t
203f0 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20  hem. Because.   
20400 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61   ** writing to a
20410 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67  ny of these nPag
20420 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61  e pages may dama
20430 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74  ge the others, t
20440 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
20450 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74  l file must cont
20460 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70  ain sync()ed cop
20470 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68  ies of all of th
20480 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  em.    ** before
20490 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e   any of them can
204a0 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
204b0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
204c0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
204d0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b   if( needSync ){
204e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
204f0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
20500 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
20510 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
20520 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
20530 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
20540 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
20550 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
20560 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
20570 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
20580 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
20590 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
205a0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
205b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
205c0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
205d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
205e0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
205f0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
20600 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
20610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20620 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
20630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
20640 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
20650 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
20660 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
20670 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
20680 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20690 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
206a0 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
206b0 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
206c0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
206d0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
206e0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
206f0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
20700 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
20710 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
20720 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
20730 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
20740 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
20750 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
20760 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
20770 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
20780 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
20790 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
207a0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
207b0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
207c0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
207d0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
207e0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
207f0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
20800 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
20810 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
20820 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
20830 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
20840 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
20850 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
20860 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
20870 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
20880 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
20890 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
208a0 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
208b0 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
208c0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
208d0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
208e0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
208f0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
20900 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
20910 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
20920 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
20930 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
20940 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
20950 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
20960 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
20970 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
20980 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
20990 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
209a0 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
209b0 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
209c0 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
209d0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
209e0 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
209f0 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
20a00 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
20a10 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
20a20 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
20a30 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
20a40 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
20a50 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
20a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
20a70 6c 65 64 2c 20 73 65 74 20 74 68 65 20 62 69 74  led, set the bit
20a80 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
20a90 6f 20 70 44 62 50 61 67 65 20 69 6e 0a 2a 2a 20  o pDbPage in.** 
20aa0 74 68 65 20 50 61 67 65 72 2e 70 41 6c 77 61 79  the Pager.pAlway
20ab0 73 52 6f 6c 6c 62 61 63 6b 20 62 69 74 76 65 63  sRollback bitvec
20ac0 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  .  Subsequent ca
20ad0 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65  lls to.** sqlite
20ae0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
20af0 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
20b00 65 20 70 61 67 65 20 77 69 6c 6c 20 74 68 65 72  e page will ther
20b10 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
20b20 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 65  d..** This is ne
20b30 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
20b40 20 61 20 70 72 6f 62 6c 65 6d 20 77 68 65 72 65   a problem where
20b50 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
20b60 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  a is added to.**
20b70 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
20b80 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
20b90 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
20ba0 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
20bb0 20 74 68 65 0a 2a 2a 20 66 72 65 65 6c 69 73 74   the.** freelist
20bc0 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
20bd0 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65  part of the same
20be0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
20bf0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
20c00 0a 2a 2a 20 6f 74 68 65 72 20 70 75 72 70 6f 73  .** other purpos
20c10 65 2e 20 20 57 68 65 6e 20 69 74 20 69 73 20 66  e.  When it is f
20c20 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
20c30 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
20c40 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63   routine is.** c
20c50 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
20c60 73 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33  sed, the sqlite3
20c70 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
20c80 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
20c90 61 6c 6c 65 64 2e 0a 2a 2a 20 42 75 74 20 62 65  alled..** But be
20ca0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
20cb0 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
20cc0 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
20cd0 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
20ce0 69 74 0a 2a 2a 20 67 65 74 73 20 72 6f 6c 6c 65  it.** gets rolle
20cf0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
20d00 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
20d10 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
20d20 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ) call..*/.int s
20d30 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
20d40 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
20d50 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
20d60 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  pPg = pDbPage;. 
20d70 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20d80 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
20d90 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
20da0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
20db0 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20  >dbOrigSize ){. 
20dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20dd0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
20de0 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
20df0 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
20e00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20e10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >pInJournal );. 
20e20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61     pPager->pAlwa
20e30 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c  ysRollback = sql
20e40 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
20e50 28 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  (pPager->dbOrigS
20e60 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ize);.    if( !p
20e70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
20e80 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
20e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20ea0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
20eb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
20ec0 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
20ed0 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  AlwaysRollback, 
20ee0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69  pPg->pgno);..  i
20ef0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20f00 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   && (pPg->flags&
20f10 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26 20  PGHDR_DIRTY) && 
20f20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
20f30 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  nt==0 ){.    ass
20f40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20f50 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
20f60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
20f70 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d  er->dbSize==pPg-
20f80 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
20f90 3e 64 62 4f 72 69 67 53 69 7a 65 3c 70 50 61 67  >dbOrigSize<pPag
20fa0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
20fb0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
20fc0 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
20fd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
20fe0 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
20ff0 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
21000 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
21010 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
21020 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
21030 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
21040 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
21050 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
21060 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
21070 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
21080 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
21090 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
210a0 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
210b0 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
210c0 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
210d0 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
210e0 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
210f0 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
21100 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
21110 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21120 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
21130 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
21140 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
21150 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
21160 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
21170 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
21180 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
21190 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
211a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
211b0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
211c0 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE(("DONT_WRITE
211d0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
211e0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
211f0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
21200 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
21210 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
21220 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
21230 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e  no)).      pPg->
21240 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
21250 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
21260 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
21270 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
21280 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
21290 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
212a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
212b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
212c0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
212d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
212e0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
212f0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
21300 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
21310 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
21320 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
21330 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
21340 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
21350 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
21360 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
21370 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
21380 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
21390 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
213a0 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
213b0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
213c0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
213d0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
213e0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
213f0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
21400 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
21410 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
21420 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
21430 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
21440 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
21450 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
21460 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
21470 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
21480 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
21490 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
214a0 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
214b0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
214c0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
214d0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
214e0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
214f0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 54 45 53 54  ->pPager;.  TEST
21500 4f 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20 29 20  ONLY( int rc; ) 
21510 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
21520 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 69 74   from sqlite3Bit
21530 76 65 63 53 65 74 28 29 20 2a 2f 0a 0a 20 20 61  vecSet() */..  a
21540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21550 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
21560 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
21570 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21580 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
21590 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
215a0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
215b0 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
215c0 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
215d0 73 20 74 68 65 20 50 61 67 65 72 2e 70 41 6c 77  s the Pager.pAlw
215e0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 62 69 74 29  aysRollback bit)
215f0 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a 2a  , then this.  **
21600 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
21610 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
21620 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21630 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c 20 73  Open==0 .   || s
21640 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
21650 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  (pPager->pAlways
21660 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70  Rollback, pPg->p
21670 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67 2d 3e  gno).   || pPg->
21680 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f  pgno>pPager->dbO
21690 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20 20 20  rigSize.  ){.   
216a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 23 69   return;.  }..#i
216b0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
216c0 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66 28 20  RE_DELETE.  if( 
216d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
216e0 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
216f0 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
21700 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d 3e 70  !=0.   || pPg->p
21710 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
21720 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  igSize ){.    re
21730 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
21740 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55 52 45  ..  /* If SECURE
21750 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73 61 62  _DELETE is disab
21760 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20  led, then there 
21770 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
21780 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  his.  ** routine
21790 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 6f   can be called o
217a0 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77 68 69  n a page for whi
217b0 63 68 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ch sqlite3PagerD
217c0 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a 2a 20  ontWrite().  ** 
217d0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65  has not been pre
217e0 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64 20 64  viously called d
217f0 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74  uring the same t
21800 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
21810 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72 69 74   And if DontWrit
21820 65 28 29 20 68 61 73 20 70 72 65 76 69 6f 75 73  e() has previous
21830 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  ly been called, 
21840 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
21850 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  ** conditions mu
21860 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a 2a 0a  st be met..  **.
21870 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 20 4e    ** (Later:)  N
21880 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74 68 65  ot true.  If the
21890 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
218a0 72 75 70 74 65 64 20 62 79 20 68 61 76 69 6e 67  rupted by having
218b0 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a 2a 20   duplicate.  ** 
218c0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
218d0 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72 72 75  elist (ex: corru
218e0 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e 20 74  pt9.test) then t
218f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
21900 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73 73 61  not.  ** necessa
21910 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a 2f 0a  rily true:.  */.
21920 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
21930 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
21940 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
21950 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  = pPager->dbOrig
21960 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20 61 73  Size ); */..  as
21970 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
21980 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
21990 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
219a0 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
219b0 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74  ..  /* Failure t
219c0 6f 20 73 65 74 20 74 68 65 20 62 69 74 73 20 69  o set the bits i
219d0 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20  n the InJournal 
219e0 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62  bit-vectors is b
219f0 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74 20 6d  enign..  ** It m
21a00 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  erely means that
21a10 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73 6f 6d   we might do som
21a20 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74 6f 20  e extra work to 
21a30 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65 0a 20  journal a page. 
21a40 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
21a50 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a 6f 75  t need to be jou
21a60 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72 74 68  rnaled.  Neverth
21a70 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65 20 74  eless, be sure t
21a80 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a 2a 20  o test the.  ** 
21a90 63 61 73 65 20 77 68 65 72 65 20 61 20 6d 61 6c  case where a mal
21aa0 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
21ab0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f   while trying to
21ac0 20 73 65 74 20 61 20 62 69 74 20 69 6e 20 61 20   set a bit in a 
21ad0 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74 6f 72  .  ** bit vector
21ae0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21af0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
21b00 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  c();.  TESTONLY(
21b10 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65 33 42   rc = ) sqlite3B
21b20 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
21b30 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
21b40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63  ->pgno);.  testc
21b50 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
21b60 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53 54 4f  NOMEM );.  TESTO
21b70 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54  NLY( rc = ) addT
21b80 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
21b90 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
21ba0 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gno);.  testcase
21bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
21bc0 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  EM );.  sqlite3E
21bd0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
21be0 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  ;...  PAGERTRACE
21bf0 28 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  (("DONT_ROLLBACK
21c00 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
21c10 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
21c20 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
21c30 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52  .  IOTRACE(("GAR
21c40 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  BAGE %p %d\n", p
21c50 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
21c60 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  )).}.../*.** Thi
21c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
21c80 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
21c90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
21ca0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
21cb0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
21cc0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
21cd0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
21ce0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
21cf0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
21d00 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
21d10 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
21d20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
21d30 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
21d40 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
21d50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
21d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
21d70 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
21d80 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72  .  assert( isDir
21d90 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73  ect==0 );  /* is
21da0 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20 74  Direct is only t
21db0 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20 77  rue for atomic w
21dc0 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  rites */.#endif.
21dd0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63    if( !pPager->c
21de0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26  hangeCountDone &
21df0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
21e00 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  >0 ){.    /* Ope
21e10 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
21e20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
21e30 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
21e40 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
21e50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
21e60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21e70 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21e80 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21  n rc;..    if( !
21e90 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20  isDirect ){.    
21ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21eb0 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
21ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ee0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
21ef0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
21f00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
21f10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
21f20 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
21f30 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
21f40 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
21f50 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
21f60 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
21f70 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
21f80 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
21f90 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
21fa0 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67  Vers);.    chang
21fb0 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
21fc0 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
21fd0 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61  r*)pPgHdr->pData
21fe0 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
21ff0 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53  nter);..#ifdef S
22000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
22010 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66  MIC_WRITE.    if
22020 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
22030 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
22040 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
22050 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70  t void *zBuf = p
22060 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20  PgHdr->pData;.  
22070 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22080 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30  er->dbFileSize>0
22090 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
220a0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
220b0 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
220c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
220d0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
220e0 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  if..    /* Relea
220f0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
22100 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
22110 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
22120 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61  pPgHdr);.    pPa
22130 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
22140 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Done = 1;.  }.  
22150 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22160 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67  .** Sync the pag
22170 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e  er file to disk.
22180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
22190 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a  agerSync(Pager *
221a0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
221b0 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  c;.  if( MEMDB )
221c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
221d0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
221e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
221f0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
22200 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
22210 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lags);.  }.  ret
22220 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22230 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
22240 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
22250 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
22260 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
22270 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
22280 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
22290 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
222a0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
222b0 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
222c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
222d0 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
222e0 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
222f0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
22300 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
22310 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
22320 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
22330 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
22340 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
22350 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
22360 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
22370 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
22380 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
22390 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
223a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223b0 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
223c0 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
223d0 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
223e0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
223f0 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
22400 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22410 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
22420 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
22430 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
22440 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
22450 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
22460 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
22470 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
22480 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
22490 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
224a0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
224b0 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
224c0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   the final param
224d0 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20  eter - noSync - 
224e0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
224f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22500 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74  itself.** is not
22510 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61 6c   synced. The cal
22520 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73 71  ler must call sq
22530 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 29  lite3PagerSync()
22540 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20   directly to.** 
22550 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
22560 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63 61  e file before ca
22570 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73  lling CommitPhas
22580 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74 65  eTwo() to delete
22590 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
225a0 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73  file in this cas
225b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
225c0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
225d0 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a 70  eOne(.  Pager *p
225e0 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20  Pager, .  const 
225f0 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a  char *zMaster, .
22600 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
22610 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22620 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
22630 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
22640 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
22650 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
22660 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e  .  /* If no chan
22670 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
22680 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65  de, we can leave
22690 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
226a0 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69   early..  */.  i
226b0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
226c0 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
226d0 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
226e0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
226f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
22700 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
22710 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
22720 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
22730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22740 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
22750 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
22760 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
22770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22780 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
22790 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
227a0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
227b0 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
227c0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
227d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
227e0 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
227f0 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f 2a 20  dbSize));..  /* 
22800 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
22810 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
22820 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
22830 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
22840 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
22850 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
22860 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
22870 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
22880 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
22890 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
228a0 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
228b0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
228c0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
228d0 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51  *pPg;..#ifdef SQ
228e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
228f0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20  IC_WRITE.    /* 
22900 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  The atomic-write
22910 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
22920 6e 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  n be used if all
22930 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   of the.    ** f
22940 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
22950 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
22960 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73      + The file-s
22970 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74  ystem supports t
22980 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
22990 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20  property for.   
229a0 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20   **      blocks 
229b0 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a  of size page-siz
229c0 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20  e, and.    **   
229d0 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69   + This commit i
229e0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  s not part of a 
229f0 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73  multi-file trans
22a00 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
22a10 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20  **    + Exactly 
22a20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62 65 65  one page has bee
22a30 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73  n modified and s
22a40 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  tore in the jour
22a50 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  nal file..    **
22a60 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f  .    ** If the o
22a70 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
22a80 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68  be used, then th
22a90 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
22aa0 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a  ill never.    **
22ab0 20 62 65 20 63 72 65 61 74 65 64 20 66 6f 72 20   be created for 
22ac0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
22ad0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
22ae0 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b   useAtomicWrite;
22af0 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
22b00 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
22b10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
22b20 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69  e);.    useAtomi
22b30 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20  cWrite = (.     
22b40 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a     !zMaster && .
22b50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
22b60 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20  journalOpen &&. 
22b70 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
22b80 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
22b90 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
22ba0 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  ) && .        pP
22bb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 70 50  ager->dbSize>=pP
22bc0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
22bd0 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 50   && .        (pP
22be0 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44 69  g==0 || pPg->pDi
22bf0 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a 20  rty==0).    );. 
22c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22c10 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
22c20 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
22c30 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
22c40 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a  RNALMODE_OFF );.
22c50 20 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69      if( useAtomi
22c60 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  cWrite ){.      
22c70 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52  /* Update the nR
22c80 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  ec field in the 
22c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
22ca0 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65  .      int offse
22cb0 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
22cc0 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
22cd0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a  aJournalMagic);.
22ce0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
22cf0 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20  ger->nRec==1);. 
22d00 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
22d10 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
22d20 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65  d, offset, pPage
22d30 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20  r->nRec);..     
22d40 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
22d50 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
22d60 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  unter. The follo
22d70 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d  wing call will m
22d80 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74  odify.      ** t
22d90 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
22da0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70  resentation of p
22db0 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65  age 1 to include
22dc0 20 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20   the updated.   
22dd0 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75     ** change cou
22de0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
22df0 69 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63  ite page 1 direc
22e00 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62  tly to the datab
22e10 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  ase.      ** fil
22e20 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68  e. Because of th
22e30 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70  e atomic-write p
22e40 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68  roperty of the h
22e50 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  ost file-system,
22e60 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
22e70 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a  is safe..      *
22e80 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
22e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22ea0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22eb0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
22ec0 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
22ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22ee0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22ef0 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
22f00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
22f10 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
22f20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26  useAtomicWrite &
22f30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
22f40 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ).#endif..    /*
22f50 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
22f60 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
22f70 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22f80 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
22f90 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
22fa0 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
22fb0 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
22fc0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
22fd0 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
22fe0 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
22ff0 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
23000 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
23010 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
23020 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
23030 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
23040 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
23050 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
23060 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
23070 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
23080 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
23090 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
230a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
230b0 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
230c0 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
230d0 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
230e0 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
230f0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  er, 0);.      if
23100 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23110 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
23120 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
23130 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
23140 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
23150 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65  DE_OFF ){.#ifnde
23160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23170 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
23180 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
23190 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 4f 72  ize<pPager->dbOr
231a0 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
231b0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
231c0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
231d0 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
231e0 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
231f0 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
23200 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
23210 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
23220 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
23230 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
23240 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
23250 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
23260 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
23270 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
23280 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20     Pgno iSkip = 
23290 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
232a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
232b0 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
232c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
232d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
232e0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
232f0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20  ->dbOrigSize;.  
23300 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 64          for( i=d
23310 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67  bSize+1; i<=pPag
23320 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20  er->dbOrigSize; 
23330 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
23340 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
23350 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
23360 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
23370 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
23390 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
233a0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
233b0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
233c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
233d0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
233e0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
233f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23400 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
23410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23420 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
23430 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
23440 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23450 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
23460 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
23470 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23480 20 20 7d 20 0a 20 20 20 20 20 20 20 20 20 20 70    } .          p
23490 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
234a0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  dbSize;.        
234b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
234c0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
234d0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
234e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
234f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23500 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
23510 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72  _exit;.        r
23520 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
23530 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
23540 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
23550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
23560 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
23570 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
23580 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
23590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
235a0 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 73  e */.    pPg = s
235b0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
235c0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
235d0 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d  Cache);.    rc =
235e0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
235f0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
23600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23610 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
23620 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
23630 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
23640 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
23650 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
23660 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
23670 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
23680 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
23690 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
236a0 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
236b0 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
236c0 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
236d0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
236e0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
236f0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
23700 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
23710 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
23720 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
23730 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
23740 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
23750 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
23760 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
23770 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
23780 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
23790 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
237a0 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
237b0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
237c0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
237d0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
237e0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
237f0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
23800 61 63 68 65 29 3b 0a 0a 20 20 20 20 69 66 28 20  ache);..    if( 
23810 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
23820 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
23830 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
23840 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
23850 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
23860 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
23870 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
23880 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 64  Pager, pPager->d
23890 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  bSize);.      if
238a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
238b0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
238c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
238d0 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
238e0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69  e file. */.    i
238f0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
23900 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b  nc && !noSync ){
23910 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23920 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
23930 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
23940 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d  nc_flags);.    }
23950 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
23960 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
23970 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
23980 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
23990 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79  _SYNCED;.  }..sy
239a0 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
239b0 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
239c0 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
239d0 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
239e0 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
239f0 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
23a00 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
23a10 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
23a20 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
23a30 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
23a40 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
23a50 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
23a60 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
23a70 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
23a80 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
23a90 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
23aa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
23ab0 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
23ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
23ad0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23ae0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
23af0 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
23b00 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
23b10 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
23b20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
23b30 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
23b40 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
23b50 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
23b60 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
23b70 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
23b80 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
23b90 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
23ba0 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
23bb0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
23bc0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23bd0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
23be0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
23bf0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
23c00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
23c10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
23c20 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
23c30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
23c40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
23c50 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
23c60 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
23c70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
23c80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
23c90 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
23ca0 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
23cb0 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
23cc0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
23cd0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
23ce0 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
23cf0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23d00 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
23d10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
23d20 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
23d30 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
23d40 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
23d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23d60 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  }.  PAGERTRACE((
23d70 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
23d80 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
23d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23da0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
23db0 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42  _SYNCED || MEMDB
23dc0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
23dd0 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
23de0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
23df0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
23e00 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
23e10 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
23e20 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
23e30 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  c);.  return rc;
23e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
23e50 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
23e60 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
23e70 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
23e80 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
23e90 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
23ea0 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
23eb0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
23ec0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
23ed0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
23ee0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
23ef0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
23f00 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
23f10 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
23f20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
23f30 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
23f40 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
23f50 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
23f60 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
23f70 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
23f80 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
23f90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
23fa0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
23fb0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
23fc0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
23fd0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
23fe0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
23ff0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
24000 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
24010 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
24020 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
24030 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
24040 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
24050 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24060 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
24070 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
24080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24090 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
240a0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
240b0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
240c0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
240d0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
240e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
240f0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
24100 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
24110 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
24120 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
24130 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
24140 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
24150 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
24160 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
24170 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
24180 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
24190 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
241a0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
241b0 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
241c0 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
241d0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
241e0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
241f0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
24200 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
24210 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
24220 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
24230 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
24240 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
24250 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
24260 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
24270 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
24280 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
24290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
242a0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
242b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
242c0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
242d0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
242e0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
242f0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
24300 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
24310 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
24320 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
24330 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
24340 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
24350 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
24360 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
24370 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
24380 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
24390 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
243a0 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
243b0 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
243c0 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
243d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
243e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
243f0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
24400 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
24410 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
24420 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24430 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
24440 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
24450 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
24460 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
24470 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
24480 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
24490 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
244a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
244b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
244c0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
244d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
244e0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
244f0 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
24500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24510 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
24520 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
24530 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
24540 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
24550 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
24560 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24570 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
24580 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
24590 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
245a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
245b0 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
245c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
245d0 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
245e0 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
245f0 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
24600 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
24610 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
24620 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
24630 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
24640 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
24650 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
24660 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
24670 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
24680 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
24690 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
246a0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
246b0 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
246c0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
246d0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
246e0 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
246f0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
24700 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
24710 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
24720 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
24730 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
24740 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
24750 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
24760 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
24770 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
24780 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
24790 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
247a0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
247b0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
247c0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
247d0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
247e0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
247f0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
24800 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
24810 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
24820 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  ;.}.int sqlite3P
24830 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
24840 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
24850 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65  turn MEMDB;.}.#e
24860 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75  ndif../*.** Ensu
24870 72 65 20 74 68 61 74 20 74 68 65 72 65 20 61 72  re that there ar
24880 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61 76 65  e at least nSave
24890 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e 74 73  point savepoints
248a0 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
248b0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
248c0 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
248d0 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
248e0 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
248f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
24900 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e 74 3e   if( nSavepoint>
24910 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
24920 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  nt && pPager->us
24930 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
24940 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61 67 65  int ii;.    Page
24950 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
24960 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ;..    /* Either
24970 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 63 74   there is no act
24980 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ive journal or t
24990 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
249a0 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20 20 2a  s open or .    *
249b0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
249c0 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64 20 69   always stored i
249d0 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20  n memory */.    
249e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
249f0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c  nSavepoint==0 ||
24a00 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70   pPager->sjfd->p
24a10 4d 65 74 68 6f 64 73 20 7c 7c 0a 20 20 20 20 20  Methods ||.     
24a20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
24a30 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
24a40 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
24a50 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  MORY );..    /* 
24a60 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61  Grow the Pager.a
24a70 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
24a80 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e  using realloc().
24a90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
24aa0 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74  OMEM.    ** if t
24ab0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
24ac0 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ils. Otherwise, 
24ad0 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72  zero the new por
24ae0 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a  tion in case a .
24af0 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61      ** malloc fa
24b00 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
24b10 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74  le populating it
24b20 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29   in the for(...)
24b30 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20   loop below..   
24b40 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d 20 28   */.    aNew = (
24b50 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
24b60 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
24b70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
24b80 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a  >aSavepoint, siz
24b90 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
24ba0 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20  nt)*nSavepoint. 
24bb0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
24bc0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74  New ){.      ret
24bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
24be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
24bf0 65 74 28 26 61 4e 65 77 5b 70 50 61 67 65 72 2d  et(&aNew[pPager-
24c00 3e 6e 53 61 76 65 70 6f 69 6e 74 5d 2c 20 30 2c  >nSavepoint], 0,
24c10 0a 20 20 20 20 20 20 20 20 28 6e 53 61 76 65 70  .        (nSavep
24c20 6f 69 6e 74 20 2d 20 70 50 61 67 65 72 2d 3e 6e  oint - pPager->n
24c30 53 61 76 65 70 6f 69 6e 74 29 20 2a 20 73 69 7a  Savepoint) * siz
24c40 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
24c50 6e 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  nt).    );.    p
24c60 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
24c70 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 69 69  t = aNew;.    ii
24c80 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
24c90 70 6f 69 6e 74 3b 0a 20 20 20 20 70 50 61 67 65  point;.    pPage
24ca0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
24cb0 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20  nSavepoint;..   
24cc0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
24cd0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24ce0 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20  structures just 
24cf0 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
24d00 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a    for(/* no-op *
24d10 2f 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74  /; ii<nSavepoint
24d20 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
24d30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
24d40 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
24d50 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72      aNew[ii].nOr
24d60 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ig = pPager->dbS
24d70 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
24d80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
24d90 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  en && pPager->jo
24da0 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20  urnalOff>0 ){.  
24db0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
24dc0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  Offset = pPager-
24dd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20  >journalOff;.   
24de0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24df0 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73    aNew[ii].iOffs
24e00 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  et = JOURNAL_HDR
24e10 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
24e20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b     }.      aNew[
24e30 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50  ii].iSubRec = pP
24e40 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a  ager->stmtNRec;.
24e50 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70        aNew[ii].p
24e60 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71  InSavepoint = sq
24e70 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
24e80 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
24e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61 4e  );.      if( !aN
24ea0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
24eb0 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  int ){.        r
24ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24ed0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
24ee0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  }..    /* Open t
24ef0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20  he sub-journal, 
24f00 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
24f10 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  eady opened. */.
24f20 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
24f30 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
24f40 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
24f50 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
24f60 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77 61  meter op is alwa
24f70 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  ys either SAVEPO
24f80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20  INT_ROLLBACK or 
24f90 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
24fa0 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 53  E..** If it is S
24fb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
24fc0 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20 61  , then release a
24fd0 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20 73  nd destroy the s
24fe0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a  avepoint with.**
24ff0 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69 6e   index iSavepoin
25000 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  t. If it is SAVE
25010 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
25020 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c  then rollback al
25030 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61  l changes.** tha
25040 74 20 68 61 76 65 20 6f 63 63 75 72 65 64 20 73  t have occured s
25050 69 6e 63 65 20 73 61 76 65 70 6f 69 6e 74 20 69  ince savepoint i
25060 53 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72  Savepoint was cr
25070 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  eated..**.** In 
25080 65 69 74 68 65 72 20 63 61 73 65 2c 20 61 6c 6c  either case, all
25090 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68   savepoints with
250a0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
250b0 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e  r than iSavepoin
250c0 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f  t .** are destro
250d0 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  yed..**.** If th
250e0 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
250f0 6e 20 28 69 53 61 76 65 70 6f 69 6e 74 2b 31 29  n (iSavepoint+1)
25100 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
25110 74 73 20 77 68 65 6e 20 74 68 69 73 20 0a 2a 2a  ts when this .**
25120 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
25130 6c 65 64 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  led it is a no-o
25140 70 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  p..*/ .int sqlit
25150 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
25160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
25170 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
25180 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
25190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
251a0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
251b0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
251c0 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
251d0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20  _ROLLBACK );..  
251e0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 70  if( iSavepoint<p
251f0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
25200 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  t ){.    int ii;
25210 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20  .    int nNew = 
25220 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70  iSavepoint + (op
25230 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
25240 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69  BACK);.    for(i
25250 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65  i=nNew; ii<pPage
25260 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
25270 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
25280 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
25290 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  (pPager->aSavepo
252a0 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  int[ii].pInSavep
252b0 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oint);.    }.   
252c0 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
252d0 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20  int = nNew;..   
252e0 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
252f0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 70  NT_ROLLBACK && p
25300 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74  Pager->jfd->pMet
25310 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 50 61  hods ){.      Pa
25320 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
25330 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
25340 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
25350 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
25360 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
25370 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
25380 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
25390 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
253a0 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
253b0 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
253c0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
253d0 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
253e0 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
253f0 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63  savepoint, trunc
25400 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
25410 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
25420 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20      if( nNew==0 
25430 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
25440 5f 52 45 4c 45 41 53 45 20 26 26 20 70 50 61 67  _RELEASE && pPag
25450 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f  er->sjfd->pMetho
25460 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ds ){.      asse
25470 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
25480 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  K );.      rc = 
25490 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
254a0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
254b0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
254c0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
254d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
254e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
254f0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
25500 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
25510 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
25520 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
25530 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
25540 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
25550 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
25560 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
25570 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25580 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
25590 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
255a0 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
255b0 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
255c0 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
255d0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
255e0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
255f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25600 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
25610 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25620 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
25630 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
25640 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
25650 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
25660 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
25670 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
25680 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
25690 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
256a0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
256b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
256c0 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
256d0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
256e0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
256f0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
25700 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
25710 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
25720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
25730 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
25740 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
25750 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25760 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
25770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25780 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
25790 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
257a0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
257b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
257c0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
257d0 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
257e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
257f0 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
25800 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
25810 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
25820 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
25830 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
25840 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
25850 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
25860 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
25870 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
25880 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
25890 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
258a0 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
258b0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
258c0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
258d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
258e0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
258f0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
25900 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
25910 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
25920 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
25930 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
25940 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
25950 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
25960 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
25970 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
25980 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25990 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
259a0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
259b0 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
259c0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
259d0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
259e0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
259f0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
25a00 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
25a10 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
25a20 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
25a30 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
25a40 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
25a50 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
25a60 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
25a70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
25a80 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
25a90 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
25aa0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
25ab0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
25ac0 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
25ad0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
25ae0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
25af0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
25b00 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
25b10 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
25b20 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
25b30 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
25b40 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
25b50 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
25b60 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
25b70 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
25b80 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
25b90 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
25ba0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
25bb0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
25bc0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
25bd0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25be0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
25bf0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
25c00 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
25c10 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
25c20 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
25c30 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
25c40 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
25c50 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
25c60 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
25c70 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
25c80 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
25c90 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
25ca0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
25cb0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
25cc0 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
25cd0 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
25ce0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
25cf0 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
25d00 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
25d10 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
25d20 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
25d30 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
25d40 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
25d50 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
25d60 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
25d70 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
25d80 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
25d90 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
25da0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
25db0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
25dc0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
25dd0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
25de0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
25df0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
25e00 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
25e10 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
25e20 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
25e30 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
25e40 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
25e50 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
25e60 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
25e70 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  o = 0;.  int rc;
25e80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
25e90 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
25ea0 20 49 66 20 74 68 65 20 70 61 67 65 20 62 65 69   If the page bei
25eb0 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69 72 74  ng moved is dirt
25ec0 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20 62 65  y and has not be
25ed0 65 6e 20 73 61 76 65 64 20 62 79 20 74 68 65 20  en saved by the 
25ee0 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61 76 65  latest.  ** save
25ef0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61 76 65  point, then save
25f00 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
25f10 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
25f20 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a  e into the .  **
25f30 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77   sub-journal now
25f40 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
25f50 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
25f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61   following scena
25f70 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  rio:.  **.  **  
25f80 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20 20   BEGIN;.  **    
25f90 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 58   <journal page X
25fa0 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20 69 74  , then modify it
25fb0 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a   in memory>.  **
25fc0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 6f       SAVEPOINT o
25fd0 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  ne;.  **       <
25fe0 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f 20 6c  Move page X to l
25ff0 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20  ocation Y>.  ** 
26000 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
26010 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  one;.  **.  ** I
26020 66 20 70 61 67 65 20 58 20 77 65 72 65 20 6e 6f  f page X were no
26030 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
26040 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68 65 72   sub-journal her
26050 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 0a  e, it would not.
26060 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62 6c 65    ** be possible
26070 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74 73 20   to restore its 
26080 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20 74 68  contents when th
26090 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f  e "ROLLBACK TO o
260a0 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  ne".  ** stateme
260b0 6e 74 20 77 65 72 65 20 70 72 6f 63 65 73 73 65  nt were processe
260c0 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
260d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
260e0 49 52 54 59 20 0a 20 20 20 26 26 20 73 75 62 6a  IRTY .   && subj
260f0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
26100 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
26110 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72  K!=(rc = subjour
26120 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20  nalPage(pPg)).  
26130 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
26140 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
26150 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE(("MOVE %d pa
26160 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
26170 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
26180 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
26190 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
261a0 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
261b0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
261c0 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b  NC)?1:0, pgno));
261d0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
261e0 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
261f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
26200 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
26210 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
26220 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
26230 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
26240 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
26250 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70  fore page pPg->p
26260 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  gno can.  ** be 
26270 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72  written to, stor
26280 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c  e pPg->pgno in l
26290 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65  ocal variable ne
262a0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a  edSyncPgno..  **
262b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43  .  ** If the isC
262c0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
262d0 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  t, there is no n
262e0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
262f0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  that.  ** the jo
26300 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
26310 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
26320 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
26330 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20  pPg->pgno .  ** 
26340 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
26350 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
26360 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
26370 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
26380 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  to it..  */.  if
26390 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
263a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26  HDR_NEED_SYNC) &
263b0 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
263c0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
263d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
263e0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
263f0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
26400 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
26410 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20  >dbOrigSize );. 
26420 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
26430 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
26440 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
26450 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
26460 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
26470 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
26480 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
26490 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
264a0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
264b0 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
264c0 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
264d0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
264e0 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
264f0 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
26500 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
26510 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
26520 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
26530 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
26540 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
26550 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
26560 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
26570 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67  NEED_SYNC;.  pPg
26580 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
26590 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
265a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
265b0 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e  Old || pPgOld->n
265c0 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Ref==1 );.  if( 
265d0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50  pPgOld ){.    pP
265e0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67  g->flags |= (pPg
265f0 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  Old->flags&PGHDR
26600 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d  _NEED_SYNC);.  }
26610 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
26620 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
26630 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
26640 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
26650 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
26660 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
26670 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
26680 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
26690 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
266a0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
266b0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
266c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
266d0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
266e0 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
266f0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
26700 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
26710 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
26720 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
26730 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
26740 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
26750 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
26760 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
26770 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
26780 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
26790 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
267a0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
267b0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
267c0 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
267d0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
267e0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
267f0 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
26800 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
26810 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
26820 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
26830 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
26840 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
26850 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
26860 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
26870 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
26880 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
26890 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
268a0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
268b0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
268c0 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
268d0 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
268e0 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
268f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
26900 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
26910 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
26920 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
26930 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
26940 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
26950 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
26960 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
26970 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
26980 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
26990 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
269a0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
269b0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
269c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
269d0 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
269e0 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
269f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
26a00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26a10 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
26a20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
26a30 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
26a40 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
26a50 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
26a60 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
26a70 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72 20 2a    */.    PgHdr *
26a80 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
26a90 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
26aa0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
26ab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
26ac0 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
26ad0 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
26ae0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26b00 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
26b10 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64 53 79  ournal && needSy
26b20 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ncPgno<=pPager->
26b30 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20  dbOrigSize ){.  
26b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
26b50 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
26b60 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
26b70 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20  dSyncPgno);.    
26b80 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
26b90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
26ba0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
26bb0 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 1;.    assert(
26bc0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
26bd0 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a  =0 && !MEMDB );.
26be0 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c 61 67      pPgHdr->flag
26bf0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
26c00 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69 74 65  SYNC;.    sqlite
26c10 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
26c20 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
26c30 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
26c40 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
26c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26c60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
26c70 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
26c80 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20 66  er to the data f
26c90 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
26ca0 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
26cb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
26cc0 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  ata(DbPage *pPg)
26cd0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  {.  assert( pPg-
26ce0 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e  >nRef>0 || pPg->
26cf0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b  pPager->memDb );
26d00 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70  .  return pPg->p
26d10 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Data;.}../*.** R
26d20 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
26d30 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
26d40 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
26d50 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
26d60 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
26d70 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
26d80 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
26d90 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
26da0 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
26db0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
26dc0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
26dd0 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
26de0 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a  ger?pPg->pExtra:
26df0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
26e00 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
26e10 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
26e20 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
26e30 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
26e40 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
26e50 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
26e60 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26e70 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
26e80 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26e90 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
26ea0 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
26eb0 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
26ec0 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
26ed0 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
26ee0 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
26ef0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
26f00 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
26f10 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
26f20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
26f30 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
26f40 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
26f50 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
26f60 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
26f70 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
26f80 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
26f90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
26fa0 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
26fb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
26fc0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
26fd0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
26fe0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
26ff0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
27000 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
27010 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
27020 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
27030 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
27040 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
27050 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
27060 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
27070 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
27080 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
27090 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
270a0 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
270b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
270c0 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
270d0 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
270e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
270f0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
27100 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29  usiveMode = (u8)
27110 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
27120 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
27130 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
27140 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
27150 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
27160 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
27170 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
27180 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  e must be one of
27190 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52  :.**.**    PAGER
271a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
271b0 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  RY.**    PAGER_J
271c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
271d0 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
271e0 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
271f0 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  TE.**    PAGER_J
27200 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
27210 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  ST.**    PAGER_J
27220 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a  OURNALMODE_OFF.*
27230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 72 61  *.** If the para
27240 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
27250 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ERY, then the jo
27260 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65  urnal-mode is se
27270 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75  t to the.** valu
27280 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
27290 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
272a0 69 6e 64 69 63 61 74 65 20 74 68 65 20 63 75 72  indicate the cur
272b0 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75  rent (possibly u
272c0 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e  pdated).** journ
272d0 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  al-mode..*/.int 
272e0 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
272f0 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a 70  nalMode(Pager *p
27300 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65  Pager, int eMode
27310 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  ){.  if( !MEMDB 
27320 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
27330 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
27340 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
27350 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
27360 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
27370 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20  NALMODE_DELETE. 
27380 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
27390 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
273a0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
273b0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
273c0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
273d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
273e0 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  IST.            
273f0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
27400 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
27410 46 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  F .             
27420 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
27430 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
27440 4f 52 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ORY );.    asser
27450 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  t( PAGER_JOURNAL
27460 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
27470 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30      if( eMode>=0
27480 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
27490 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
274a0 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20 20 7d  (u8)eMode;.    }
274b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
274c0 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
274d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
274e0 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RY );.    }.  }.
274f0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
27500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27510 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
27520 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
27530 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
27540 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
27550 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  iles..*/.i64 sql
27560 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
27570 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
27580 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
27590 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
275a0 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
275b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
275c0 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
275d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
275e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
275f0 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69  eLimit;.}..#endi
27600 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
27610 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.