/ Hex Artifact Content
Login

Artifact a1e23f2c55bda1303cb6236d4aca9666e58eb610:


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 34  : pager.c,v 1.54
0350: 35 20 32 30 30 39 2f 30 31 2f 31 30 20 31 36 3a  5 2009/01/10 16:
0360: 31 35 3a 30 39 20 64 61 6e 69 65 6c 6b 31 39 37  15:09 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 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
21a0: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
21b0: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
21c0: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
21d0: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
21e0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
21f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2200: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
2210: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
2220: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
2230: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2240: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
2250: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2260: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
2270: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
2280: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
2290: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
22a0: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
22b0: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
22c0: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
22d0: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
22e0: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
22f0: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
2300: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
2310: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
2320: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
2330: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2340: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
2350: 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20  u8 dbModified;  
2360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2370: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
2380: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
2390: 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 63  the Db */.  u8 c
23a0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
23b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
23c0: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
23d0: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
23e0: 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 64 62 53  nter */.  u8 dbS
23f0: 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20 20 20  izeValid;       
2400: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77 68 65        /* Set whe
2410: 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f 72 72  n dbSize is corr
2420: 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ect */.  Pgno db
2430: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
2440: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2450: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
2460: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
2470: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
2480: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2490: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
24a0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
24b0: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
24c0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
24d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24e0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
24f0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2500: 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20  u32 vfsFlags;   
2510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2520: 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
2530: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
2540: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2560: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
2570: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
2580: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
25b0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
25c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
25d0: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
25f0: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2600: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2610: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2620: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2640: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2650: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2660: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2670: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2680: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2690: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
26a0: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
26b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
26c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
26d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26e0: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
26f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2720: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2730: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  ges */.  int mxP
2740: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2750: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2760: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2770: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2780: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e   */.  Pgno mxPgn
2790: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
27a0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c    /* Maximum all
27b0: 6f 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65  owed size of the
27c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42   database */.  B
27d0: 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61  itvec *pInJourna
27e0: 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  l;         /* On
27f0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2800: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2810: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 42 69  ase file */.  Bi
2820: 74 76 65 63 20 2a 70 41 6c 77 61 79 73 52 6f 6c  tvec *pAlwaysRol
2830: 6c 62 61 63 6b 3b 20 20 20 20 2f 2a 20 4f 6e 65  lback;    /* One
2840: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2850: 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
2860: 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 63  -rollback */.  c
2870: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
2880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2890: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
28a0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
28b0: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
28c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
28d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
28e0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
28f0: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
2900: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
2910: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
2920: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
2930: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  es */.  sqlite3_
2940: 66 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  file *fd, *jfd; 
2950: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2960: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
2970: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2980: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
2990: 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20  le *sjfd;       
29a0: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
29b0: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 75 62  ptor for the sub
29c0: 2d 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74  -journal*/.  int
29d0: 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
29e0: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63  (void*); /* Func
29f0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65  tion to call whe
2a00: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64  n busy */.  void
2a10: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
2a20: 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  g;      /* Conte
2a30: 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  xt argument for 
2a40: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
2a50: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
2a60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2a70: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
2a80: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
2a90: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
2aa0: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
2ab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2ac0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
2ad0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
2ae0: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 65 63  der */.  u32 sec
2af0: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
2b00: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
2b10: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
2b20: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23  ng rollback */.#
2b30: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2b40: 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  T.  int nHit, nM
2b50: 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  iss;            
2b60: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e  /* Cache hits an
2b70: 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69  d missing */.  i
2b80: 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65  nt nRead, nWrite
2b90: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ;          /* Da
2ba0: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
2bb0: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e  d/written */.#en
2bc0: 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52 65  dif.  void (*xRe
2bd0: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 29  initer)(DbPage*)
2be0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
2bf0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
2c00: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
2c10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2c20: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
2c30: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
2c40: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
2c50: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
2c60: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
2c70: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
2c80: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
2c90: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
2ca0: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
2cb0: 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61 72 20  /.#endif.  char 
2cc0: 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  *pTmpSpace;     
2cd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 2e         /* Pager.
2ce0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
2cf0: 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d 70 20  f space for tmp 
2d00: 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  use */.  char db
2d10: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
2d20: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
2d30: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
2d40: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
2d50: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
2d60: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
2d70: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
2d80: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
2d90: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
2da0: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2dc0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
2dd0: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
2de0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
2df0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
2e00: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
2e10: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
2e20: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e40: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
2e50: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
2e60: 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ] */.};../*.** T
2e70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
2e80: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
2e90: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
2ea0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
2eb0: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
2ec0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
2ed0: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
2ee0: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
2ef0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
2f00: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
2f10: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
2f20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2f30: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
2f40: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
2f50: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
2f60: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
2f70: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
2f80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
2f90: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
2fa0: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
2fb0: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
2fc0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
2fd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
2fe0: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
2ff0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3000: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
3010: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
3020: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45  */.# define PAGE
3030: 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23  R_INCR(v)  v++.#
3040: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41  else.# define PA
3050: 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64  GER_INCR(v).#end
3060: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  if..../*.** Jour
3070: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
3080: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
3090: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
30a0: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
30b0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
30c0: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
30d0: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
30e0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
30f0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
3100: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
3110: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
3120: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
3130: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
3140: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3150: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
3160: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
3170: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
3180: 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  g.** written, se
3190: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
31a0: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
31b0: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
31c0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
31d0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
31e0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
31f0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
3200: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
3210: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
3220: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
3230: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
3240: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
3250: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3260: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
3270: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
3280: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
3290: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
32a0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
32b0: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
32c0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
32d0: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
32e0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
32f0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
3300: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
3310: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
3320: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
3330: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
3340: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
3350: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
3360: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3370: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3380: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3390: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
33a0: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
33b0: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
33c0: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
33d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
33e0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
33f0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
3400: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
3410: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
3420: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
3430: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3440: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3450: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3460: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3470: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3480: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3490: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
34a0: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
34b0: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
34c0: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
34d0: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
34e0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
34f0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3500: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3510: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3520: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3530: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3540: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3550: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3560: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3570: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3580: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3590: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
35a0: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
35b0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
35c0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
35d0: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
35e0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
35f0: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3600: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3610: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3620: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3640: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3650: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3660: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3670: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3680: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3690: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
36a0: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
36b0: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
36c0: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
36d0: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
36e0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
36f0: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3700: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3710: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3720: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3730: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3740: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3750: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3760: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3770: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3780: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3790: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
37a0: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
37b0: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
37c0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
37d0: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
37e0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
37f0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3800: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3810: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3820: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3830: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3840: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3850: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3860: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3870: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3880: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3890: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
38a0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
38b0: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
38c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
38d0: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
38e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61  #endif../*.** Pa
38f0: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
3900: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
3910: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
3920: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
3930: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
3940: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
3950: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
3960: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
3970: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
3980: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
3990: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
39a0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
39b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
39c0: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
39d0: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
39e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
39f0: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
3a00: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
3a10: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
3a20: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
3a30: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
3a40: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
3a50: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
3a60: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
3a70: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
3a80: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
3a90: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
3aa0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
3ab0: 28 78 29 20 28 28 50 67 6e 6f 29 28 28 50 45 4e  (x) ((Pgno)((PEN
3ac0: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
3ad0: 70 61 67 65 53 69 7a 65 29 29 2b 31 29 29 0a 0a  pageSize))+1))..
3ae0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
3af0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
3b00: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
3b10: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
3b20: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
3b30: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 52  7483647../*.** R
3b40: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
3b50: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
3b60: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
3b70: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
3b80: 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67 65  urnal..** A page
3b90: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72 69   needs to be wri
3ba0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73 75  tten into the su
3bb0: 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68 65  b-journal if the
3bc0: 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a 2a  re exists one.**
3bd0: 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73 61   or more open sa
3be0: 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  vepoints for whi
3bf0: 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ch:.**.**   * Th
3c00: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  e page-number is
3c10: 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
3c20: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
3c30: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e 64  point.nOrig, and
3c40: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74 20  .**   * The bit 
3c50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3c60: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
3c70: 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a 2a   is not set in.*
3c80: 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70  *     PagerSavep
3c90: 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e  oint.pInSavepoin
3ca0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3cb0: 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
3cc0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
3cd0: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67   Pgno pgno = pPg
3ce0: 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
3cf0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
3d00: 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b 0a  Pager;.  int i;.
3d10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
3d20: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
3d30: 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72   i++){.    Pager
3d40: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
3d50: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
3d60: 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  nt[i];.    if( p
3d70: 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26 26  ->nOrig>=pgno &&
3d80: 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76 65   0==sqlite3Bitve
3d90: 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76 65  cTest(p->pInSave
3da0: 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b 0a  point, pgno) ){.
3db0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3dc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3dd0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
3de0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
3df0: 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64  e page is alread
3e00: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
3e10: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
3e20: 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72 6e   int pageInJourn
3e30: 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  al(PgHdr *pPg){.
3e40: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3e50: 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d 3e  BitvecTest(pPg->
3e60: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
3e70: 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  al, pPg->pgno);.
3e80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
3e90: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
3ea0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
3eb0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
3ec0: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
3ed0: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
3ee0: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
3ef0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
3f00: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
3f10: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
3f20: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
3f30: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
3f40: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
3f50: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
3f60: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
3f70: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
3f80: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
3f90: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
3fa0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
3fb0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
3fc0: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
3fd0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
3fe0: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
3ff0: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
4000: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
4010: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
4020: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
4030: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
4040: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4050: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
4060: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
4070: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
4080: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
4090: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
40a0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
40b0: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
40c0: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
40d0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
40e0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
40f0: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4100: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4110: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4120: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4130: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4140: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4150: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
4160: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
4170: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
4180: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
4190: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
41a0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
41b0: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
41c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
41d0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
41e0: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
41f0: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
4200: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
4210: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
4220: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
4230: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
4240: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
4250: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
4260: 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64  f( !pFd->pMethod
4270: 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
4280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
4290: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
42a0: 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f  sUnlock(pFd, eLo
42b0: 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ck);.}../*.** Th
42c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
42d0: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
42e0: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
42f0: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
4300: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
4310: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
4320: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
4330: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
4340: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
4350: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
4360: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
4370: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
4380: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
4390: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
43a0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
43b0: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
43c0: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
43d0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
43e0: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
43f0: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
4400: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
4410: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
4420: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
4430: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
4440: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
4450: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
4460: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
4470: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
4480: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
4490: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
44a0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
44b0: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
44c0: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
44d0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
44e0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
44f0: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
4500: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
4510: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
4520: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
4530: 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20  .  int dc;      
4540: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
4550: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
4560: 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b  /.  int nSector;
4570: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
4580: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  size */.  int sz
4590: 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Page;        /* 
45a0: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73  Page size */.  s
45b0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
45c0: 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20  = pPager->fd;.. 
45d0: 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64   if( fd->pMethod
45e0: 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71  s ){.    dc = sq
45f0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
4600: 72 61 63 74 65 72 69 73 74 69 63 73 28 66 64 29  racteristics(fd)
4610: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
4620: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
4630: 7a 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d  ze;.    szPage =
4640: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
4650: 65 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  e;.  }..  assert
4660: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
4670: 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38  OMIC512==(512>>8
4680: 29 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c  ));.  assert(SQL
4690: 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
46a0: 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29  64K==(65536>>8))
46b0: 3b 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d  ;..  if( !fd->pM
46c0: 65 74 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20  ethods || .     
46d0: 20 20 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f    (dc & (SQLITE_
46e0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a  IOCAP_ATOMIC|(sz
46f0: 50 61 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65  Page>>8)) && nSe
4700: 63 74 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b  ctor<=szPage) ){
4710: 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  .    return JOUR
4720: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
4730: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
4740: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
4750: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
4770: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
4780: 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   be called when 
4790: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
47a0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 72  within the pager
47b0: 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69  .** code. The fi
47c0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
47d0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
47e0: 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65   pager structure
47f0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
4800: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
4810: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
4820: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 41  ned by a pager A
4830: 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  PI function. .**
4840: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
4850: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
4860: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
4870: 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
4880: 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ction. .**.** If
4890: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
48a0: 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49  ment is SQLITE_I
48b0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
48c0: 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f  RUPT, or SQLITE_
48d0: 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  FULL.** the erro
48e0: 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73  r becomes persis
48f0: 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20  tent. Until the 
4900: 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20  persisten error 
4910: 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73  is cleared,.** s
4920: 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61  ubsequent API ca
4930: 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65  lls on this Page
4940: 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  r will immediate
4950: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4960: 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  me .** error cod
4970: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69  e..**.** A persi
4980: 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69  stent error indi
4990: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63  cates that the c
49a0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
49b0: 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63  ager-cache .** c
49c0: 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64  annot be trusted
49d0: 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61 6e  . This state can
49e0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 63   be cleared by c
49f0: 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72  ompletely discar
4a00: 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e  ding .** the con
4a10: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4a20: 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74  er-cache. If a t
4a30: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61  ransaction was a
4a40: 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68  ctive when.** th
4a50: 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  e persistent err
4a60: 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e  or occured, then
4a70: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
4a80: 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a  urnal may need.*
4a90: 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64  * to be replayed
4aa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4ab0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
4ac0: 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74  ger *pPager);.st
4ad0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4ae0: 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  rror(Pager *pPag
4af0: 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  er, int rc){.  i
4b00: 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30 78  nt rc2 = rc & 0x
4b10: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20  ff;.  assert(.  
4b20: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
4b30: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
4b40: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
4b50: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4b60: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
4b70: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
4b80: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
4b90: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
4ba0: 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  f(.    rc2==SQLI
4bb0: 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72  TE_FULL ||.    r
4bc0: 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  c2==SQLITE_IOERR
4bd0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4be0: 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b  ITE_CORRUPT.  ){
4bf0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
4c00: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69  Code = rc;.    i
4c10: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
4c20: 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
4c30: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
4c40: 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
4c50: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
4c60: 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
4c70: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
4c80: 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63  is already unloc
4c90: 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f  ked, call pager_
4ca0: 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a  unlock() now to.
4cb0: 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74        ** clear t
4cc0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
4cd0: 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  nd ensure that t
4ce0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 69  he pager-cache i
4cf0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  s .      ** comp
4d00: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20  letely empty..  
4d10: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67      */.      pag
4d20: 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
4d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
4d40: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4d50: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
4d60: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
4d70: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
4d80: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
4d90: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
4da0: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
4db0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
4dc0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
4dd0: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
4de0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
4df0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
4e00: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
4e10: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
4e20: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
4e30: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
4e40: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
4e50: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
4e60: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
4e70: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
4e80: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
4e90: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4ea0: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
4eb0: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
4ec0: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
4ed0: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
4ee0: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
4ef0: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
4f00: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
4f10: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
4f20: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
4f30: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
4f40: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
4f50: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
4f60: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
4f70: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
4f80: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4f90: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
4fa0: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
4fb0: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
4fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
4fd0: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
4fe0: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
4ff0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5000: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5010: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
5020: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
5030: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
5040: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
5050: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
5060: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
5070: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5080: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5090: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
50a0: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
50b0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
50c0: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
50d0: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
50e0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
50f0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5100: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
5110: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
5120: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
5130: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
5140: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
5150: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
5160: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
5170: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
5180: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
5190: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
51a0: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
51b0: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
51c0: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
51d0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
51e0: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
51f0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
5200: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
5210: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
5220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
5230: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
5240: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
5250: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5260: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
5270: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
5280: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
5290: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
52a0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
52b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
52c0: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
52d0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
52e0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
52f0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
5300: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
5310: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
5320: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
5330: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
5340: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
5350: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
5360: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
5370: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
5380: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
5390: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
53a0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
53b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
53c0: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
53d0: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
53e0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
53f0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
5400: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
5410: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
5420: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
5430: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
5440: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
5450: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
5460: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
5470: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
5480: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5490: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
54a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
54b0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
54c0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
54d0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
54e0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
54f0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5500: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
5510: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
5520: 32 20 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75  2 cksum;.  u32 u
5530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5540: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
5550: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
5560: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5570: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
5580: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
5590: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
55a0: 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d  */..  zMaster[0]
55b0: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d   = '\0';..  rc =
55c0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
55d0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
55e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
55f0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
5600: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5610: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5620: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c  Jrnl, szJ-16, &l
5630: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5640: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5650: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e  n rc;..  if( len
5660: 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  >=nMaster ){.   
5670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5680: 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  K;.  }..  rc = r
5690: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
56a0: 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29   szJ-12, &cksum)
56b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
56c0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
56d0: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
56e0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
56f0: 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38  aMagic, 8, szJ-8
5700: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5710: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
5720: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5730: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5740: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5750: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5760: 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  rnl, zMaster, le
5770: 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  n, szJ-16-len);.
5780: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5790: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
57a0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73  n rc;.  }.  zMas
57b0: 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  ter[len] = '\0';
57c0: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
57d0: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
57e0: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
57f0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
5800: 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20  for(u=0; u<len; 
5810: 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  u++){.    cksum 
5820: 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20  -= zMaster[u];. 
5830: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5840: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5850: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5860: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5870: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5880: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5890: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
58a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
58b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
58c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
58d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
58e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
58f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5900: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5910: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5920: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5930: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5940: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
5950: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  r[0] = '\0';.  }
5960: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
5970: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5980: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
5990: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
59a0: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
59b0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
59c0: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
59d0: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
59e0: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
59f0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
5a00: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5a10: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5a20: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5a30: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5a40: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5a50: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
5a70: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5b30: 0a 73 74 61 74 69 63 20 69 36 34 20 6a 6f 75 72  .static i64 jour
5b40: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 50 61 67  nalHdrOffset(Pag
5b50: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
5b60: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
5b70: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
5b80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5b90: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
5ba0: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
5bb0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5bc0: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
5bd0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5be0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5bf0: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
5c00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
5c10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
5c20: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
5c30: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
5c40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5c50: 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
5c60: 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a 73 74 61  rn offset;.}.sta
5c70: 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75  tic void seekJou
5c80: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5c90: 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72  Pager){.  pPager
5ca0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a  ->journalOff = j
5cb0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
5cc0: 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
5cd0: 2a 20 57 72 69 74 65 20 7a 65 72 6f 73 20 6f 76  * Write zeros ov
5ce0: 65 72 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  er the header of
5cf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5d00: 65 2e 20 20 54 68 69 73 20 68 61 73 20 74 68 65  e.  This has the
5d10: 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 69 6e  .** effect of in
5d20: 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 6a  validating the j
5d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
5d40: 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a  committing the.*
5d50: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  * transaction..*
5d60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 7a 65 72  /.static int zer
5d70: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  oJournalHdr(Page
5d80: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 64  r *pPager, int d
5d90: 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e  oTruncate){.  in
5da0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5db0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
5dc0: 20 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38   char zeroHdr[28
5dd0: 5d 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20  ] = {0};..  if( 
5de0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5df0: 66 66 20 29 7b 0a 20 20 20 20 69 36 34 20 69 4c  ff ){.    i64 iL
5e00: 69 6d 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  imit = pPager->j
5e10: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
5e20: 0a 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ..    IOTRACE(("
5e30: 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20  JZEROHDR %p\n", 
5e40: 70 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28  pPager)).    if(
5e50: 20 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69   doTruncate || i
5e60: 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Limit==0 ){.    
5e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5e80: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
5e90: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65  >jfd, 0);.    }e
5ea0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
5eb0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
5ec0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f  Pager->jfd, zero
5ed0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f  Hdr, sizeof(zero
5ee0: 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Hdr), 0);.    }.
5ef0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5f00: 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72  TE_OK && !pPager
5f10: 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
5f20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5f30: 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
5f40: 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  , SQLITE_SYNC_DA
5f50: 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73  TAONLY|pPager->s
5f60: 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
5f70: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
5f80: 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61 6e  s point the tran
5f90: 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
5fa0: 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72 69  tted but the wri
5fb0: 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  te lock .    ** 
5fc0: 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e  is still held on
5fd0: 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
5fe0: 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c 69  ere is a size li
5ff0: 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20 66  mit configured f
6000: 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  or .    ** the p
6010: 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
6020: 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61  l and the journa
6030: 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
6040: 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20   consumes more. 
6050: 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61 6e     ** space than
6060: 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f   that limit allo
6070: 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74 65  ws for, truncate
6080: 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20 69   it now. There i
6090: 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a  s no need.    **
60a0: 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69 6c   to sync the fil
60b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  e following this
60c0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
60d0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
60e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d  QLITE_OK && iLim
60f0: 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 36  it>0 ){.      i6
6100: 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d  4 sz;.      rc =
6110: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
6120: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
6130: 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &sz);.      if( 
6140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6150: 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   sz>iLimit ){.  
6160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6170: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
6180: 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74  ger->jfd, iLimit
6190: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
61a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
61b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
61c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
61d0: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
61e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
61f0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
6200: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
6210: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
6220: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
6230: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6240: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
6250: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
6260: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
6270: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
6280: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
6290: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
62a0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
62b0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
62c0: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
62d0: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
62e0: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
62f0: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
6300: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
6310: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
6320: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
6330: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
6340: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
6350: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
6360: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
6370: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
6380: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
6390: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
63a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
63b0: 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61 62  - 4 bytes: Datab
63c0: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  ase page size..*
63d0: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
63e0: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
63f0: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f 66  Z - 28) bytes of
6400: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
6410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
6420: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
6430: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
6440: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6450: 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48 65 61 64  K;.  char *zHead
6460: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
6470: 70 53 70 61 63 65 3b 0a 20 20 75 33 32 20 6e 48  pSpace;.  u32 nH
6480: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
6490: 70 61 67 65 53 69 7a 65 3b 0a 20 20 75 33 32 20  pageSize;.  u32 
64a0: 6e 57 72 69 74 65 3b 0a 20 20 69 6e 74 20 69 69  nWrite;.  int ii
64b0: 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65 72  ;..  if( nHeader
64c0: 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  >JOURNAL_HDR_SZ(
64d0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 6e  pPager) ){.    n
64e0: 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c  Header = JOURNAL
64f0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6500: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
6510: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 73  ere are active s
6520: 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 61 6e  avepoints and an
6530: 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65 20 63  y of them were c
6540: 72 65 61 74 65 64 20 73 69 6e 63 65 20 74 68 65  reated since the
6550: 0a 20 20 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  .  ** most recen
6560: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
6570: 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 75 70   was written, up
6580: 64 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  date the PagerSa
6590: 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 0a  vepoint.iHdrOff.
65a0: 20 20 2a 2a 20 66 69 65 6c 64 73 20 6e 6f 77 2e    ** fields now.
65b0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
65c0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
65d0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
65e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
65f0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
6600: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
6610: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
6620: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
6630: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
6640: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
6650: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a    }.  }..  seekJ
6660: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6670: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
6680: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
6690: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
66a0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
66b0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
66c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
66d0: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
66e0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
66f0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
6700: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
6710: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
6720: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
6730: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
6740: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
6750: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
6760: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
6770: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
6780: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
6790: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
67a0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
67b0: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
67c0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
67d0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
67e0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
67f0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
6800: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
6810: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
6820: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
6830: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
6840: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
6850: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
6860: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
6870: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
6880: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
6890: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
68a0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
68b0: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
68c0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
68d0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
68e0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
68f0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
6900: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
6910: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
6920: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
6930: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
6940: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
6950: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
6960: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
6970: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
6980: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
6990: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
69a0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
69b0: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
69c0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
69d0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
69e0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
69f0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
6a00: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
6a10: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
6a20: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
6a30: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
6a40: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
6a50: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
6a60: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
6a70: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
6a80: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
6a90: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
6aa0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
6ab0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
6ac0: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
6ad0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
6ae0: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
6af0: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
6b00: 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50 61  >noSync) || (pPa
6b10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
6b20: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
6b30: 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20 7c  ODE_MEMORY).   |
6b40: 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  | (sqlite3OsDevi
6b50: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
6b60: 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
6b70: 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
6b80: 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20  APPEND) .  ){.  
6b90: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6ba0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6bb0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66  rnalMagic)], 0xf
6bc0: 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73  fffffff);.  }els
6bd0: 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  e{.    put32bits
6be0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6bf0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6c00: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
6c10: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
6c20: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
6c30: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f  r */ .  sqlite3_
6c40: 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
6c50: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
6c60: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
6c70: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74  ksumInit);.  put
6c80: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6c90: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6ca0: 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72  agic)+4], pPager
6cb0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6cc0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
6cd0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
6ce0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6cf0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6d00: 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70  rnalMagic)+8], p
6d10: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
6d20: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
6d30: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
6d40: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
6d50: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
6d60: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6d70: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6d80: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
6d90: 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20  torSize);..  /* 
6da0: 49 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  Initializing the
6db0: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66   tail of the buf
6dc0: 66 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  fer is not neces
6dd0: 73 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e  sary.  Everythin
6de0: 67 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e  g.  ** works fin
6df0: 64 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d if the followi
6e00: 6e 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f  ng memset() is o
6e10: 6d 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69  mitted.  But ini
6e20: 74 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74  tializing.  ** t
6e30: 68 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e  he memory preven
6e40: 74 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  ts valgrind from
6e50: 20 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f   complaining, so
6e60: 20 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20   we are willing 
6e70: 74 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65  to.  ** take the
6e80: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74   performance hit
6e90: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
6ea0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6eb0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6ec0: 36 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  6], 0,.         
6ed0: 6e 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28  nHeader-(sizeof(
6ee0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6ef0: 36 29 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  6));..  if( pPag
6f00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d  er->journalHdr==
6f10: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
6f20: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  page size */.   
6f30: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6f40: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6f50: 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70  nalMagic)+16], p
6f60: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
6f70: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72  ;.  }..  for(nWr
6f80: 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  ite=0; rc==SQLIT
6f90: 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55  E_OK&&nWrite<JOU
6fa0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6fb0: 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65  er); nWrite+=nHe
6fc0: 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52 41  ader){.    IOTRA
6fd0: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
6fe0: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
6ff0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7000: 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a 20  Hdr, nHeader)). 
7010: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
7020: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7030: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48 65  fd, zHeader, nHe
7040: 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ader, pPager->jo
7050: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70  urnalOff);.    p
7060: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7070: 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20  f += nHeader;.  
7080: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
7090: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
70a0: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
70b0: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
70c0: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
70d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
70e0: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
70f0: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
7100: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
7110: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
7120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
7130: 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65 6e  file. The curren
7140: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
7150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
7160: 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 50  s given by.** pP
7170: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7180: 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
7190: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
71a0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
71b0: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
71c0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
71d0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
71e0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
71f0: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
7200: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
7210: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
7220: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
7230: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
7240: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
7250: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
7260: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
7270: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
7280: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
7290: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
72a0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
72b0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
72c0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
72d0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
72e0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
72f0: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
7300: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
7310: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
7320: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
7330: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
7340: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
7350: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
7360: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
7370: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
7380: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 75  nd *dbSize are u
7390: 6e 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f  ndefined.  If JO
73a0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
73b0: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
73c0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
73d0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
73e0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
73f0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7400: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
7410: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
7420: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
7430: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
7440: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
7450: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
7460: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
7470: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
7480: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
7490: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
74a0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e  der */.  i64 jrn
74b0: 6c 4f 66 66 3b 0a 20 20 75 33 32 20 69 50 61 67  lOff;.  u32 iPag
74c0: 65 53 69 7a 65 3b 0a 20 20 75 33 32 20 69 53 65  eSize;.  u32 iSe
74d0: 63 74 6f 72 53 69 7a 65 3b 0a 0a 20 20 73 65 65  ctorSize;..  see
74e0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
74f0: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
7500: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
7510: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7520: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
7530: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
7540: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
7550: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
7560: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7570: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7580: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
7590: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
75a0: 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e  eof(aMagic), jrn
75b0: 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20  lOff);.  if( rc 
75c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
75d0: 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66  rnlOff += sizeof
75e0: 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28  (aMagic);..  if(
75f0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
7600: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7610: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
7620: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7630: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
7640: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7650: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7660: 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29   jrnlOff, pNRec)
7670: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7680: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7690: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
76a0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
76b0: 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  4, &pPager->cksu
76c0: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
76d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
76e0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
76f0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
7700: 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65  nlOff+8, pDbSize
7710: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
7720: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
7730: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7740: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ff==0 ){.    rc 
7750: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7760: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7770: 66 2b 31 36 2c 20 26 69 50 61 67 65 53 69 7a 65  f+16, &iPageSize
7780: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7790: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
77a0: 69 66 28 20 69 50 61 67 65 53 69 7a 65 3c 35 31  if( iPageSize<51
77b0: 32 20 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65  2 .     || iPage
77c0: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
77d0: 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
77e0: 7c 7c 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  || ((iPageSize-1
77f0: 29 26 69 50 61 67 65 53 69 7a 65 29 21 3d 30 20  )&iPageSize)!=0 
7800: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
7810: 20 49 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a   If the page-siz
7820: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
7830: 2d 68 65 61 64 65 72 20 69 73 20 69 6e 76 61 6c  -header is inval
7840: 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  id, then the pro
7850: 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  cess.      ** th
7860: 61 74 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75  at wrote the jou
7870: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74  rnal-header must
7880: 20 68 61 76 65 20 63 72 61 73 68 65 64 20 62 65   have crashed be
7890: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 0a  fore the header.
78a0: 20 20 20 20 20 20 2a 2a 20 77 61 73 20 73 79 6e        ** was syn
78b0: 63 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ced. In this cas
78c0: 65 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 74  e stop reading t
78d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
78e0: 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  here..      */. 
78f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7900: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 65 6c 73 65  _DONE;.    }else
7910: 7b 0a 20 20 20 20 20 20 75 31 36 20 70 61 67 65  {.      u16 page
7920: 73 69 7a 65 20 3d 20 28 75 31 36 29 69 50 61 67  size = (u16)iPag
7930: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20  eSize;.      rc 
7940: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
7950: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
7960: 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20  , &pagesize);.  
7970: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
7980: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 61 67  SQLITE_OK || pag
7990: 65 73 69 7a 65 3d 3d 28 75 31 36 29 69 50 61 67  esize==(u16)iPag
79a0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 7d 0a 20  eSize );.    }. 
79b0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
79c0: 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a  rn rc;.  .    /*
79d0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
79e0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
79f0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
7a00: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20  ue used by .    
7a10: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
7a20: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
7a30: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
7a40: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
7a50: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
7a60: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
7a70: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
7a80: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7a90: 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  .    ** is being
7aa0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
7ab0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
7ac0: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
7ad0: 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20  value.    ** of 
7ae0: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
7af0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
7b00: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
7b10: 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a  routine..    */.
7b20: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
7b30: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7b40: 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 26 69 53   jrnlOff+12, &iS
7b50: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 20 20  ectorSize);.    
7b60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7b70: 72 63 3b 0a 20 20 20 20 69 66 28 20 28 69 53 65  rc;.    if( (iSe
7b80: 63 74 6f 72 53 69 7a 65 26 28 69 53 65 63 74 6f  ctorSize&(iSecto
7b90: 72 53 69 7a 65 2d 31 29 29 0a 20 20 20 20 20 20  rSize-1)).      
7ba0: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35  || iSectorSize<5
7bb0: 31 32 0a 20 20 20 20 20 20 7c 7c 20 69 53 65 63  12.      || iSec
7bc0: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
7bd0: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 29 7b 0a 20  OR_SIZE.    ){. 
7be0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7bf0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
7c00: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
7c10: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
7c20: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
7c30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
7c40: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
7c50: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
7c60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7c70: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
7c80: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
7c90: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
7ca0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
7cb0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
7cc0: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
7cd0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
7ce0: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
7cf0: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
7d00: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
7d10: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
7d20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
7d30: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
7d40: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
7d50: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
7d60: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7d70: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
7d80: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
7d90: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
7da0: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
7db0: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
7dc0: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
7dd0: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
7de0: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
7df0: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
7e00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7e10: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
7e20: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
7e30: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
7e40: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
7e50: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
7e60: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
7e70: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
7e80: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
7e90: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
7ea0: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
7eb0: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
7ec0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a  ournal name..**.
7ed0: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
7ee0: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
7ef0: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
7f00: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
7f10: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
7f20: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
7f30: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7f40: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
7f50: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
7f60: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
7f70: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
7f80: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  t rc;.  int len;
7f90: 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36   .  int i; .  i6
7fa0: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34  4 jrnlOff;.  i64
7fb0: 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32   jrnlSize;.  u32
7fc0: 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68   cksum = 0;.  ch
7fd0: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61  ar zBuf[sizeof(a
7fe0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a  JournalMagic)+2*
7ff0: 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  4];..  if( !zMas
8000: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
8010: 65 74 4d 61 73 74 65 72 20 29 20 72 65 74 75 72  etMaster ) retur
8020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
8030: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
8040: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
8050: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
8060: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
8070: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
8080: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
8090: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
80a0: 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 3b  rlen30(zMaster);
80b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
80c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
80d0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
80e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
80f0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
8100: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
8110: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
8120: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
8130: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
8140: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
8150: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
8160: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
8170: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
8180: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
8190: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
81a0: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
81b0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
81c0: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
81d0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
81e0: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
81f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8200: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
8210: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
8220: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
8230: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
8240: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
8250: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
8260: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
8270: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8280: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
8290: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
82a0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
82b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
82c0: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
82d0: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
82e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
82f0: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
8300: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
8310: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
8320: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
8330: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
8340: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
8350: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
8360: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
8370: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
8380: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8390: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
83a0: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
83b0: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
83c0: 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  Off);.  jrnlOff 
83d0: 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  += 8+sizeof(aJou
83e0: 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50  rnalMagic);.  pP
83f0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8400: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
8410: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
8420: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
8430: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
8440: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
8450: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
8460: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
8470: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
8480: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
8490: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
84a0: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
84b0: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
84c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
84d0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
84e0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
84f0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
8500: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
8510: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
8520: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
8530: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
8540: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
8550: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
8560: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
8570: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
8580: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
8590: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
85a0: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
85b0: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
85c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
85d0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
85e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
85f0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
8600: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a  (rc==SQLITE_OK).
8610: 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
8620: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
8630: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
8640: 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  Size))==SQLITE_O
8650: 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  K.   && jrnlSize
8660: 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  >jrnlOff.  ){.  
8670: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8680: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
8690: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  >jfd, jrnlOff);.
86a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
86b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
86c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
86d0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
86e0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
86f0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
8700: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
8710: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
8720: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
8730: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
8740: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
8750: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
8760: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c   PgHdr *p;.  sql
8770: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
8780: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
8790: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
87a0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
87b0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
87c0: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
87d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
87e0: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
87f0: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
8800: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
8810: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
8820: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
8830: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
8840: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
8850: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
8860: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
8870: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
8880: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
8890: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
88a0: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
88b0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
88c0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
88d0: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
88e0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
88f0: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
8900: 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
8910: 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  PCache);.}../*.*
8920: 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
8930: 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
8940: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
8950: 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
8960: 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
8970: 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
8980: 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
8990: 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
89a0: 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
89b0: 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
89c0: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
89d0: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
89e0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
89f0: 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
8a00: 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
8a10: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
8a20: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
8a30: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
8a40: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
8a50: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
8a60: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
8a70: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
8a80: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
8a90: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
8aa0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
8ab0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8ac0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
8ad0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
8ae0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
8af0: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
8b00: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
8b10: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
8b20: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
8b30: 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
8b40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
8b50: 20 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20   the bit number 
8b60: 70 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65  pgno in the Page
8b70: 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
8b80: 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
8b90: 6f 66 0a 2a 2a 20 61 6c 6c 20 6f 70 65 6e 20 73  of.** all open s
8ba0: 61 76 65 70 6f 69 6e 74 73 2e 0a 2a 2f 0a 73 74  avepoints..*/.st
8bb0: 61 74 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61  atic int addToSa
8bc0: 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50  vepointBitvecs(P
8bd0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
8be0: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
8bf0: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
8c00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
8c10: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
8c20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
8c30: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
8c40: 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69  ode */..  for(ii
8c50: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
8c60: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
8c70: 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70  {.    PagerSavep
8c80: 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65  oint *p = &pPage
8c90: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8ca0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c  ];.    if( pgno<
8cb0: 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20  =p->nOrig ){.   
8cc0: 20 20 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33     rc |= sqlite3
8cd0: 42 69 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e  BitvecSet(p->pIn
8ce0: 53 61 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29  Savepoint, pgno)
8cf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8d00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
8d10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
8d20: 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  M );.    }.  }. 
8d30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8d40: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
8d50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a  database file. .
8d60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
8d70: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
8d80: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
8d90: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
8da0: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
8db0: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
8dc0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
8dd0: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
8de0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
8df0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
8e00: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
8e10: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
8e20: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
8e30: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
8e40: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
8e50: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
8e60: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
8e70: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
8e80: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
8e90: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
8ea0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
8eb0: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
8ec0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
8ed0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
8ee0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8ef0: 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e     int rc = osUn
8f00: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
8f10: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69   NO_LOCK);.    i
8f20: 66 28 20 72 63 20 29 20 70 50 61 67 65 72 2d 3e  f( rc ) pPager->
8f30: 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
8f40: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8f50: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 49  Valid = 0;.    I
8f60: 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  OTRACE(("UNLOCK 
8f70: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
8f80: 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63  .    /* Always c
8f90: 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lose the journal
8fa0: 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70   file when dropp
8fb0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
8fc0: 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74   lock..    ** Ot
8fd0: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
8fe0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
8ff0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
9000: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a  lete might.    *
9010: 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * delete the fil
9020: 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  e out from under
9030: 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   us..    */.    
9040: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9050: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
9060: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
9070: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
9080: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9090: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
90a0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
90b0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
90c0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
90d0: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
90e0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
90f0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
9100: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
9110: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
9120: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
9130: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
9140: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
9150: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
9160: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
9170: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
9180: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
9190: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
91a0: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
91b0: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
91c0: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
91d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
91e0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
91f0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
9200: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
9210: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
9220: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
9230: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
9240: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9250: 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72  LITE_OK ) pPager
9260: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
9270: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61 67  TE_OK;.      pag
9280: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
9290: 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 41  ;.      releaseA
92a0: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
92b0: 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
92c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
92d0: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
92e0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
92f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9300: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
9310: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  0;.    }..    pP
9320: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
9330: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
9340: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
9350: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
9360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
9370: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
9380: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9390: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
93a0: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
93b0: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
93c0: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
93d0: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
93e0: 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20  rror state, .** 
93f0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
9400: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he rollback..*/.
9410: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
9420: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
9430: 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ck(Pager *p){.  
9440: 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d  if( p->errCode==
9450: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
9460: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
9470: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
9480: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9490: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
94a0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
94b0: 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k(p);.    sqlite
94c0: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
94d0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
94e0: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a  unlock(p);.}../*
94f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9500: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
9510: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
9520: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
9530: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
9540: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
9550: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
9560: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9570: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
9580: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
9590: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
95a0: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
95b0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
95c0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
95d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
95e0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
95f0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
9600: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
9610: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
9620: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
9630: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
9640: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
9650: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
9660: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
9670: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
9680: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
9690: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
96a0: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
96b0: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
96c0: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
96d0: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
96e0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
96f0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
9700: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
9710: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
9720: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
9730: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
9740: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9750: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
9760: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
9770: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
9780: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
9790: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
97a0: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
97b0: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
97c0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
97d0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
97e0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
97f0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
9800: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
9810: 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
9820: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9830: 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  K;.  int rc2 = S
9840: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
9850: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
9860: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
9870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9880: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  E_OK;.  }.  rele
9890: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28  aseAllSavepoint(
98a0: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
98b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
98c0: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
98d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
98e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
98f0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
9900: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
9910: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
9920: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
9930: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
9940: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9950: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
9960: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9970: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
9980: 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f       if( !isMemo
9990: 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  ryJournal ){.   
99a0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
99b0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
99c0: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
99d0: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
99e0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
99f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
9a00: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a10: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
9a20: 41 54 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  ATE.         && 
9a30: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  (rc = sqlite3OsT
9a40: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9a50: 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45  jfd, 0))==SQLITE
9a60: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
9a70: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9a80: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9a90: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9aa0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9ab0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
9ac0: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
9ad0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9ae0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9af0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
9b00: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
9b10: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
9b20: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
9b30: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
9b40: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
9b50: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
9b60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9b70: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9b80: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9b90: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9ba0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9bb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9bc0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9bd0: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
9be0: 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c   rc );.      sql
9bf0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
9c00: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
9c10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9c20: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
9c30: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c40: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
9c50: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
9c60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
9c70: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
9c80: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
9c90: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
9ca0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9cb0: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
9cc0: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
9cd0: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
9ce0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
9cf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ;.    sqlite3Bit
9d00: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
9d10: 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
9d20: 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ck);.    pPager-
9d30: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
9d40: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
9d50: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9d60: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
9d70: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
9d80: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
9d90: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
9da0: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  h);.#endif.    s
9db0: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
9dc0: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
9dd0: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
9de0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
9df0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
9e00: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
9e10: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
9e20: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
9e30: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
9e40: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
9e50: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
9e60: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
9e70: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
9e80: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
9e90: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
9ea0: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
9eb0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
9ec0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
9ed0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
9ee0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
9ef0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
9f00: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
9f10: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
9f20: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
9f30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
9f40: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c  Sync = 0;.  /* l
9f50: 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
9f60: 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f  nced(pPager); */
9f70: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
9f80: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
9f90: 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
9fa0: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
9fb0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70   !MEMDB ){.    p
9fc0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
9fd0: 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  id = 0;.  }.  pP
9fe0: 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
9ff0: 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20   = 0;..  return 
a000: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
a010: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
a020: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
a030: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
a040: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
a050: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
a060: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
a070: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
a080: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
a090: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
a0a0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
a0b0: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
a0c0: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
a0d0: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
a0e0: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
a0f0: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
a100: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
a110: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
a120: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
a130: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
a140: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
a150: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
a160: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
a170: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
a180: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
a190: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
a1a0: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
a1b0: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
a1c0: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
a1d0: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
a1e0: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
a1f0: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
a200: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
a210: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
a220: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
a230: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
a240: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
a250: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
a260: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
a270: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
a280: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
a290: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
a2a0: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
a2b0: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
a2c0: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
a2d0: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
a2e0: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
a2f0: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
a300: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
a310: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
a320: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
a330: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
a340: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
a350: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
a360: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
a370: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
a380: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
a390: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
a3a0: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
a3b0: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
a3c0: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
a3d0: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
a3e0: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
a3f0: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
a400: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
a410: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
a420: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
a430: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
a440: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
a450: 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61  r, const u8 *aDa
a460: 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d  ta){.  u32 cksum
a470: 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
a480: 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Init;.  int i = 
a490: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a4a0: 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69  -200;.  while( i
a4b0: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
a4c0: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
a4d0: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
a4e0: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
a4f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
a500: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
a510: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
a520: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
a530: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
a540: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
a550: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
a560: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
a570: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
a580: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
a590: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
a5a0: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
a5b0: 66 69 6c 65 2e 20 20 54 68 65 20 20 2a 70 4f 66  file.  The  *pOf
a5c0: 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73  fset.** value is
a5d0: 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68   increased to th
a5e0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e  e start of the n
a5f0: 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
a600: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
a610: 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c  he isMainJrnl fl
a620: 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68  ag is true if th
a630: 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72  is is the main r
a640: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
a650: 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72  and.** false for
a660: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
a670: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69  ournal.  The mai
a680: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
a690: 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b  al uses.** check
a6a0: 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65  sums - the state
a6b0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  ment journal doe
a6c0: 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s not..**.** If 
a6d0: 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pDone is not NUL
a6e0: 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61 20  L, then it is a 
a6f0: 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73 20  record of pages 
a700: 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61 64  that have alread
a710: 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65 64  y.** been played
a720: 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20 70   back.  If the p
a730: 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74 20  age at *pOffset 
a740: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
a750: 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a 20   played back.** 
a760: 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f  (if the correspo
a770: 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74 20  nding pDone bit 
a780: 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b 69  is set) then ski
a790: 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e 0a  p the playback..
a7a0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
a7b0: 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72 65   pDone bit corre
a7c0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a7d0: 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69 73  *pOffset page is
a7e0: 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74 6f   set.** prior to
a7f0: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
a800: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a810: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
a820: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
a830: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
a840: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
a850: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
a860: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
a870: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
a880: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
a890: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
a8a0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
a8b0: 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20    i64 *pOffset, 
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
a8e0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
a8f0: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70  */.  int isSavep
a900: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
a910: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
a920: 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62   savepoint rollb
a930: 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ack */.  Bitvec 
a940: 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20  *pDone          
a950: 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63         /* Bitvec
a960: 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64   of pages alread
a970: 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f  y played back */
a980: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a990: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9b0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
a9c0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
a9d0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
a9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9f0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
aa00: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
aa10: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
aa20: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aa40: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
aa50: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
aa60: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
aa70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa80: 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72       /* Temporar
aa90: 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68  y storage for th
aaa0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69  e page */.  sqli
aab0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20  te3_file *jfd;  
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aad0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
aae0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
aaf0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
ab00: 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26  rt( (isMainJrnl&
ab10: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  ~1)==0 );      /
ab20: 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20  * isMainJrnl is 
ab30: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
ab40: 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e  rt( (isSavepnt&~
ab50: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f  1)==0 );       /
ab60: 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30  * isSavepnt is 0
ab70: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
ab80: 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c  t( isMainJrnl ||
ab90: 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a   pDone );     /*
aba0: 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73   pDone always us
abb0: 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61  ed on sub-journa
abc0: 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ls */.  assert( 
abd0: 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f  isSavepnt || pDo
abe0: 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44  ne==0 );   /* pD
abf0: 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f  one never used o
ac00: 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20  n non-savepoint 
ac10: 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28 75  */..  aData = (u
ac20: 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
ac30: 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20  pace;.  assert( 
ac40: 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20  aData );        
ac50: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
ac60: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
ac70: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
ac80: 64 20 2a 2f 0a 0a 20 20 6a 66 64 20 3d 20 69 73  d */..  jfd = is
ac90: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
aca0: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
acb0: 3e 73 6a 66 64 3b 0a 0a 20 20 72 63 20 3d 20 72  >sjfd;..  rc = r
acc0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
acd0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
ace0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
acf0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
ad00: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ad10: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
ad20: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
ad30: 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
ad40: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
ad50: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
ad60: 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
ad70: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
ad80: 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
ad90: 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
ada0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
adb0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
adc0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
add0: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
ade0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
adf0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
ae00: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
ae10: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
ae20: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
ae30: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
ae40: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
ae50: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
ae60: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
ae70: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
ae80: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
ae90: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
aea0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
aeb0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
aec0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
aed0: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
aee0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
aef0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
af00: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
af10: 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e  .  }.  if( pgno>
af20: 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
af30: 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42  Size || sqlite3B
af40: 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c  itvecTest(pDone,
af50: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65   pgno) ){.    re
af60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
af70: 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e    }.  if( isMain
af80: 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d  Jrnl ){.    rc =
af90: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
afa0: 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26   (*pOffset)-4, &
afb0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
afc0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
afd0: 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65 70      if( !isSavep
afe0: 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75  nt && pager_cksu
aff0: 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
b000: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
b010: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
b020: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
b030: 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72   if( pDone && (r
b040: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
b050: 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f  cSet(pDone, pgno
b060: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
b070: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
b080: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
b090: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
b0a0: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
b0b0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
b0c0: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
b0d0: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b0e0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
b0f0: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
b100: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
b110: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
b120: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
b130: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
b140: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
b150: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
b160: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
b170: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
b180: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
b190: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
b1a0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
b1b0: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
b1c0: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
b1d0: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
b1e0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
b1f0: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
b200: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
b210: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
b220: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
b230: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
b240: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
b250: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
b260: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
b270: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
b280: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
b290: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
b2a0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
b2b0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
b2c0: 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
b2d0: 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
b2e0: 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
b2f0: 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
b300: 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
b310: 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
b320: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
b330: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
b340: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
b350: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
b360: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
b370: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
b380: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
b390: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
b3a0: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
b3b0: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
b3c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
b3d0: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
b3e0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
b3f0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
b400: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
b410: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
b420: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
b430: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
b440: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
b450: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
b460: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
b470: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
b480: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
b490: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
b4a0: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
b4b0: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
b4c0: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
b4d0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
b4e0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
b4f0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
b500: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
b510: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
b520: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
b530: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
b540: 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
b550: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
b560: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
b570: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
b580: 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
b590: 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
b5a0: 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
b5b0: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
b5c0: 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
b5d0: 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
b5e0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
b5f0: 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
b600: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
b610: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
b620: 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
b630: 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
b640: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
b650: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
b660: 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
b670: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
b680: 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
b690: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
b6a0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
b6b0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
b6c0: 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
b6d0: 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
b6e0: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
b6f0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
b700: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
b710: 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
b720: 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
b730: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
b740: 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
b750: 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
b760: 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
b770: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
b780: 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
b790: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
b7a0: 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
b7b0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
b7c0: 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
b7d0: 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
b7e0: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
b7f0: 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
b800: 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
b810: 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
b820: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
b830: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
b840: 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  no);.  PAGERTRAC
b850: 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E(("PLAYBACK %d 
b860: 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
b870: 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  x) %s\n",.      
b880: 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
b890: 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20  (pPager), pgno, 
b8a0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
b8b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
b8c0: 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20 20   aData),.       
b8d0: 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a          (isMainJ
b8e0: 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61  rnl?"main-journa
b8f0: 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22  l":"sub-journal"
b900: 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 28 70  ).  ));.  if( (p
b910: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
b920: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
b930: 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20    && (pPg==0 || 
b940: 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  0==(pPg->flags&P
b950: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29  GHDR_NEED_SYNC))
b960: 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e  .   && (pPager->
b970: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20  fd->pMethods).  
b980: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20  ){.    i64 ofst 
b990: 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  = (pgno-1)*(i64)
b9a0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b9b0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
b9c0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b9d0: 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  ->fd, aData, pPa
b9e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
b9f0: 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 67  fst);.    if( pg
ba00: 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
ba10: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
ba20: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
ba30: 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d 0a  e = pgno;.    }.
ba40: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d    }else if( !isM
ba50: 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d  ainJrnl && pPg==
ba60: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  0 ){.    /* If t
ba70: 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63  his is a rollbac
ba80: 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  k of a savepoint
ba90: 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f   and data was no
baa0: 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20  t written to.   
bab0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
bac0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
bad0: 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20   not in-memory, 
bae0: 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e  there is a poten
baf0: 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62  tial.    ** prob
bb00: 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61  lem. When the pa
bb10: 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68  ge is next fetch
bb20: 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65  ed by the b-tree
bb30: 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20   layer, it .    
bb40: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20  ** will be read 
bb50: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
bb60: 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61  e file, which ma
bb70: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
bb80: 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e  .    ** current.
bb90: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
bba0: 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70  There are a coup
bbb0: 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20  le of different 
bbc0: 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61  ways this can ha
bbd0: 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75  ppen. All are qu
bbe0: 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75  ite.    ** obscu
bbf0: 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67  re. When running
bc00: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   in synchronous 
bc10: 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f  mode, this can o
bc20: 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20  nly happen .    
bc30: 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ** if the page i
bc40: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
bc50: 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  st at the start 
bc60: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
bc70: 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
bc80: 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20  populated, then 
bc90: 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69  moved using sqli
bca0: 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
bcb0: 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
bcc0: 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69  * The solution i
bcd0: 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d  s to add an in-m
bce0: 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68  emory page to th
bcf0: 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69  e cache containi
bd00: 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  ng.    ** the da
bd10: 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ta just read fro
bd20: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
bd30: 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  l. Mark the page
bd40: 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a   as dirty .    *
bd50: 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67  * and if the pag
bd60: 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f  er requires a jo
bd70: 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e  urnal-sync, then
bd80: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
bd90: 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72  s .    ** requir
bda0: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79  ing a journal-sy
bdb0: 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  nc before it is 
bdc0: 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a  written..    */.
bdd0: 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61      assert( isSa
bde0: 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28  vepnt );.    if(
bdf0: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
be00: 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65  gerAcquire(pPage
be10: 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31  r, pgno, &pPg, 1
be20: 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  )) ){.      retu
be30: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
be40: 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
be50: 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
be60: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
be70: 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29  heMakeDirty(pPg)
be80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
be90: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
bea0: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
beb0: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
bec0: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
bed0: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
bee0: 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
bef0: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
bf00: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
bf10: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
bf20: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
bf30: 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
bf40: 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
bf50: 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
bf60: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
bf70: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
bf80: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
bf90: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
bfa0: 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
bfb0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61      ** sqlite3Pa
bfc0: 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20  gerRollback().. 
bfd0: 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a     */.    void *
bfe0: 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74 61  pData;.    pData
bff0: 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
c000: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
c010: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
c020: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
c030: 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
c040: 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50  iter ){.      pP
c050: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
c060: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
c070: 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 26  if( isMainJrnl &
c080: 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c 7c  & (!isSavepnt ||
c090: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c0a0: 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  Off<=pPager->jou
c0b0: 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
c0c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
c0d0: 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
c0e0: 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
c0f0: 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
c100: 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
c110: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
c120: 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
c130: 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
c140: 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
c150: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
c160: 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
c170: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
c180: 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
c190: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
c1a0: 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
c1b0: 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
c1c0: 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
c1d0: 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20  ut to the..     
c1e0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
c1f0: 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
c200: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
c210: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
c220: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
c230: 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
c240: 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
c250: 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
c260: 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
c270: 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
c280: 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
c290: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
c2a0: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
c2b0: 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
c2c0: 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
c2d0: 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
c2e0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
c2f0: 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
c300: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
c310: 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
c320: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
c330: 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
c340: 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
c350: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
c360: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
c370: 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
c380: 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
c390: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
c3a0: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
c3b0: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
c3c0: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
c3d0: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
c3e0: 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
c3f0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
c400: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
c410: 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
c420: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
c430: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
c440: 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
c450: 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
c460: 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
c470: 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
c480: 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
c490: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
c4a0: 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
c4b0: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
c4c0: 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
c4d0: 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
c4e0: 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
c4f0: 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
c500: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
c510: 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
c520: 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
c530: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
c540: 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
c550: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
c560: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
c570: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
c580: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
c590: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
c5a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
c5b0: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
c5c0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
c5d0: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
c5e0: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
c5f0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
c600: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
c610: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
c620: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
c630: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
c640: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
c650: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
c660: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
c670: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c680: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
c690: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
c6a0: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
c6b0: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
c6c0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
c6d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
c6e0: 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
c6f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c700: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
c710: 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
c720: 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52  ned(SQLITE_COVER
c730: 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  AGE_TEST)./*.** 
c740: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f  This routine loo
c750: 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74 68  ks ahead into th
c760: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  e main journal f
c770: 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69 6e  ile and determin
c780: 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72  es.** whether or
c790: 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72 65   not the next re
c7a0: 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72 64  cord (the record
c7b0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74 20   that begins at 
c7c0: 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70  file.** offset p
c7d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c7e0: 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72  f) is a well-for
c7f0: 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64 20  med page record 
c800: 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66  consisting.** of
c810: 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e 75   a valid page nu
c820: 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61 67  mber, pPage->pag
c830: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 63  eSize bytes of c
c840: 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64  ontent, followed
c850: 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20 63  .** by a valid c
c860: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54  hecksum..**.** T
c870: 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20 6e  he pager never n
c880: 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69  eeds to know thi
c890: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  s in order to do
c8a0: 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69 73   its job.   This
c8b0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  .** routine is o
c8c0: 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77 69  nly used from wi
c8d0: 74 68 20 61 73 73 65 72 74 28 29 20 61 6e 64 20  th assert() and 
c8e0: 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f  testcase() macro
c8f0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
c900: 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61   pagerNextJourna
c910: 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50 61 67  lPageIsValid(Pag
c920: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
c930: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
c940: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
c950: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
c960: 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  ge */.  u32 cksu
c970: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;           /* 
c980: 54 68 65 20 70 61 67 65 20 63 68 65 63 6b 73 75  The page checksu
c990: 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  m */.  int rc;  
c9a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
c9b0: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
c9c0: 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20  read operations 
c9d0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
c9e0: 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65  e *fd;    /* The
c9f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ca00: 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61   from which we a
ca10: 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20  re reading */.  
ca20: 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  u8 *aData;      
ca30: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
ca40: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a  of the page */..
ca50: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61    /* Read the pa
ca60: 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72  ge number header
ca70: 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65   */.  fd = pPage
ca80: 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  r->jfd;.  rc = r
ca90: 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50  ead32bits(fd, pP
caa0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cab0: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
cac0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cad0: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cb00: 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20  NO_TEST*/.  if( 
cb10: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
cb20: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
cb30: 50 61 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e  Pager) ){ return
cb40: 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a   0; }         /*
cb50: 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20  NO_TEST*/.  if( 
cb60: 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65  pgno>(Pgno)pPage
cb70: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74  r->dbSize ){ ret
cb80: 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cba0: 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20  NO_TEST*/..  /* 
cbb0: 52 65 61 64 20 74 68 65 20 63 68 65 63 6b 73 75  Read the checksu
cbc0: 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64  m */.  rc = read
cbd0: 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67 65  32bits(fd, pPage
cbe0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50  r->journalOff+pP
cbf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
cc00: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
cc10: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cc20: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cc50: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a  *NO_TEST*/..  /*
cc60: 20 52 65 61 64 20 74 68 65 20 64 61 74 61 20 61   Read the data a
cc70: 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 63 68  nd verify the ch
cc80: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74  ecksum */.  aDat
cc90: 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d  a = (u8*)pPager-
cca0: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63  >pTmpSpace;.  rc
ccb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
ccc0: 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  (fd, aData, pPag
ccd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50  er->pageSize, pP
cce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ccf0: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
cd00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
cd10: 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
cd40: 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72  ST*/.  if( pager
cd50: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
cd60: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20  Data)!=cksum ){ 
cd70: 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
cd80: 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
cd90: 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68  ST*/..  /* Reach
cda0: 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79   this point only
cdb0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
cdc0: 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72  valid */.  retur
cdd0: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
cde0: 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
cdf0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
ce00: 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53  ITE_COVERAGE_TES
ce10: 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  T) */../*.** Par
ce20: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
ce30: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
ce40: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ce50: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
ce60: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
ce70: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
ce80: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ce90: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
cea0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
ceb0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
cec0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
ced0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
cee0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
cef0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
cf00: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
cf10: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  it is..**.** Arg
cf20: 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61  ument zMaster ma
cf30: 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72  y point to Pager
cf40: 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74  .pTmpSpace. So t
cf50: 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f  hat buffer is no
cf60: 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  t .** available 
cf70: 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20 74  for use within t
cf80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
cf90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
cfa0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
cfb0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
cfc0: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
cfd0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
cfe0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
cff0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
d000: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
d010: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
d020: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
d030: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
d040: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
d050: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
d060: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
d070: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
d080: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
d090: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
d0a0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
d0b0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
d0c0: 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
d0d0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
d0e0: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
d0f0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
d100: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
d110: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
d120: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
d130: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
d140: 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69  *pMaster;.  sqli
d150: 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e  te3_file *pJourn
d160: 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  al;.  char *zMas
d170: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
d180: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
d190: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d1a0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
d1b0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
d1c0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
d1d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d1e0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
d1f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
d200: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
d210: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
d220: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
d230: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
d240: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
d250: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
d260: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
d270: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70  erence..  */.  p
d280: 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
d290: 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
d2a0: 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f  Malloc(pVfs->szO
d2b0: 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a  sFile * 2);.  pJ
d2c0: 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65  ournal = (sqlite
d2d0: 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a  3_file *)(((u8 *
d2e0: 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73  )pMaster) + pVfs
d2f0: 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69  ->szOsFile);.  i
d300: 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20  f( !pMaster ){. 
d310: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
d320: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
d330: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
d340: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
d350: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
d360: 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29  _MASTER_JOURNAL)
d370: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d380: 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a  e3OsOpen(pVfs, z
d390: 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c  Master, pMaster,
d3a0: 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a   flags, 0);.  }.
d3b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d3c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
d3d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
d3e0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20  er_open = 1;..  
d3f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
d400: 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20  leSize(pMaster, 
d410: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
d420: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d430: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
d440: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
d450: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
d460: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
d470: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
d480: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
d490: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
d4a0: 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65 72  sterPtr = pPager
d4b0: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
d4c0: 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  me+1;..    /* Lo
d4d0: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
d4e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d4f0: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
d500: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
d510: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
d520: 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74  () and pointed t
d530: 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72  o by zMasterJour
d540: 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  nal. .    */.   
d550: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
d560: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
d570: 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61  3Malloc((int)nMa
d580: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d  sterJournal + nM
d590: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69  asterPtr);.    i
d5a0: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
d5b0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
d5c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d5d0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
d5e0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
d5f0: 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20     zMasterPtr = 
d600: 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b  &zMasterJournal[
d610: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b  nMasterJournal];
d620: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d630: 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c  3OsRead(pMaster,
d640: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
d650: 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75   (int)nMasterJou
d660: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  rnal, 0);.    if
d670: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d680: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
d690: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
d6a0: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
d6b0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
d6c0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
d6d0: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
d6e0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
d6f0: 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20     int exists;. 
d700: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d710: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
d720: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
d730: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
d740: 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20  &exists);.      
d750: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d760: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
d770: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
d780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d790: 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20  f( exists ){.   
d7a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
d7b0: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
d7c0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
d7d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
d7e0: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
d7f0: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
d800: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
d810: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
d820: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
d830: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
d840: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
d850: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d860: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
d870: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
d880: 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  c;.        int f
d890: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
d8a0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
d8b0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
d8c0: 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20  URNAL);.        
d8d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
d8e0: 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  en(pVfs, zJourna
d8f0: 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61  l, pJournal, fla
d900: 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  gs, 0);.        
d910: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d920: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
d930: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
d940: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
d950: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d        rc = readM
d960: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f  asterJournal(pJo
d970: 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74  urnal, zMasterPt
d980: 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a  r, nMasterPtr);.
d990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
d9a0: 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29  sClose(pJournal)
d9b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d9c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d9d0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
d9e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
d9f0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
da00: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30  c = zMasterPtr[0
da10: 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  ]!=0 && strcmp(z
da20: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
da30: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
da40: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
da50: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
da60: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
da70: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
da80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
da90: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
daa0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
dab0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dac0: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
dad0: 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
dae0: 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  n30(zJournal)+1)
daf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
db00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
db10: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
db20: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
db30: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
db40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
db50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
db60: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
db70: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
db80: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
db90: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
dba0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
dbb0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
dbc0: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
dbd0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
dbe0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
dbf0: 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
dc00: 20 61 6e 64 20 61 6e 20 65 78 63 6c 75 73 69 76   and an exclusiv
dc10: 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  e lock is held, 
dc20: 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68 65  .** truncate the
dc30: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
dc40: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
dc50: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6e   the specified n
dc60: 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 70 61 67  umber .** of pag
dc70: 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67  es..**.** It mig
dc80: 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65 20  ht might be the 
dc90: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66 69  case that the fi
dca0: 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d  le on disk is sm
dcb0: 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65  aller than nPage
dcc0: 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61  ..** This can ha
dcd0: 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c  ppen, for exampl
dce0: 65 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e 20  e, if we are in 
dcf0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20  the middle of a 
dd00: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
dd10: 68 69 63 68 20 68 61 73 20 65 78 74 65 6e 64 65  hich has extende
dd20: 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  d the file size 
dd30: 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67 65  and the new page
dd40: 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20  s are still all 
dd50: 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65  held.** in cache
dd60: 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54  , then an INSERT
dd70: 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73 20   or UPDATE does 
dd80: 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  a statement roll
dd90: 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f  back.  Some.** o
dda0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
ddb0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
ddc0: 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64  can get confused
ddd0: 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a   if you try to.*
dde0: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
ddf0: 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74  e to some size t
de00: 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
de10: 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20  an it currently 
de20: 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74  is,.** so detect
de30: 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
de40: 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
de50: 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65 20 65  ro byte to the e
de60: 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a  nd of the new.**
de70: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a   file instead..*
de80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
de90: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
dea0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
deb0: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
dec0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ded0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
dee0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
def0: 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  VE && pPager->fd
df00: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
df10: 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
df20: 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
df30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
df40: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
df50: 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
df60: 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
df70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
df80: 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
df90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dfa0: 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
dfb0: 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
dfc0: 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
dfd0: 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
dfe0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
dff0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
e000: 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
e010: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
e020: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
e030: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
e040: 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
e050: 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
e060: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
e070: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
e080: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
e090: 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
e0a0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
e0b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
e0c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e0d0: 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f  he sectorSize fo
e0e0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
e0f0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  r..**.** The sec
e100: 74 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c  tor size is at l
e110: 65 61 73 74 20 61 73 20 62 69 67 20 61 73 20 74  east as big as t
e120: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72  he sector size r
e130: 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71  eported.** by sq
e140: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
e150: 65 28 29 2e 20 54 68 65 20 6d 69 6e 69 6d 75 6d  e(). The minimum
e160: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
e170: 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  512..*/.static v
e180: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
e190: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
e1a0: 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  {.  assert(pPage
e1b0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
e1c0: 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
e1d0: 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  e);.  if( !pPage
e1e0: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
e1f0: 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
e200: 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
e210: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
e220: 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
e230: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
e240: 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
e250: 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63  ened yet, in whc
e260: 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ih case the OsSe
e270: 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
e280: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
e290: 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
e2a0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
e2b0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
e2c0: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
e2d0: 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
e2e0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
e2f0: 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70  ize<512 ){.    p
e300: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
e310: 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69  e = 512;.  }.  i
e320: 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
e330: 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
e340: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 70 50 61  _SIZE ){.    pPa
e350: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
e360: 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  = MAX_SECTOR_SIZ
e370: 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E;.  }.}../*.** 
e380: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
e390: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
e3a0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
e3b0: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
e3c0: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
e3d0: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
e3e0: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
e3f0: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
e400: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
e410: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
e420: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
e430: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
e440: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
e450: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
e460: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
e470: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
e480: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
e490: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
e4a0: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
e4b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
e4c0: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
e4d0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
e4e0: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
e4f0: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
e500: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
e510: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
e520: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
e530: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
e540: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
e550: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
e560: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
e570: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
e580: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
e590: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
e5a0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
e5b0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
e5c0: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
e5d0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
e5e0: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
e5f0: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
e600: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
e610: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
e620: 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
e630: 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a  .  The header.**
e640: 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d         is this m
e650: 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a  any bytes in siz
e660: 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79  e..**  (6)  4 by
e670: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
e680: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e690: 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a  he page case..**
e6a0: 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69 6e    (7)  4 byte in
e6b0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
e6c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
e6d0: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
e6e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
e6f0: 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c    name.  The val
e700: 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28  ue may be zero (
e710: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
e720: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
e730: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
e740: 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62  l.).**  (8)  N b
e750: 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74  ytes of the mast
e760: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
e770: 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20    The name will 
e780: 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  be nul-terminate
e790: 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d  d.**       and m
e7a0: 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20  ight be shorter 
e7b0: 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72  than the value r
e7c0: 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49  ead from (5).  I
e7d0: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
e7e0: 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65  .**       of the
e7f0: 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68   name is \000 th
e800: 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  en there is no m
e810: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20  aster journal.  
e820: 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20  The master.**   
e830: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65      journal name
e840: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54   is stored in UT
e850: 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65  F-8..**  (9)  Ze
e860: 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73  ro or more pages
e870: 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68   instances, each
e880: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
e890: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
e8a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a   page number..**
e8b0: 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65          +  pPage
e8c0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
e8d0: 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20  s of data..**   
e8e0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63       +  4 byte c
e8f0: 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68  hecksum.**.** Wh
e900: 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74  en we speak of t
e910: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
e920: 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66  r, we mean the f
e930: 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f  irst 8 items abo
e940: 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72  ve..** Each entr
e950: 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  y in the journal
e960: 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   is an instance 
e970: 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e  of the 9th item.
e980: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
e990: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73  value from the s
e9a0: 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52  econd bullet "nR
e9b0: 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68  ec".  nRec is th
e9c0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76  e number of.** v
e9d0: 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65  alid page entrie
e9e0: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
e9f0: 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  .  In most cases
ea00: 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74  , you can comput
ea10: 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f  e the.** value o
ea20: 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20  f nRec from the 
ea30: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
ea40: 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69  nal file.  But i
ea50: 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69  f a power.** fai
ea60: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68  lure occurred wh
ea70: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
ea80: 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65  was being writte
ea90: 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74  n, it could be t
eaa0: 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20  he.** case that 
eab0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
eac0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64  journal file had
ead0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
eae0: 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74  creased but.** t
eaf0: 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73  he extra entries
eb00: 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64   had not yet mad
eb10: 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64  e it safely to d
eb20: 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20  isk.  In such a 
eb30: 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c  case,.** the val
eb40: 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75  ue of nRec compu
eb50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ted from the fil
eb60: 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20  e size would be 
eb70: 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a  too large.  For.
eb80: 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20  ** that reason, 
eb90: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
eba0: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20  e nRec value in 
ebb0: 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a  the header..**.*
ebc0: 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61  * If the nRec va
ebd0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
ebe0: 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  f it means that 
ebf0: 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63  nRec should be c
ec00: 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  omputed.** from 
ec10: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20  the file size.  
ec20: 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73  This value is us
ec30: 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ed when the user
ec40: 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20   selects the.** 
ec50: 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66  no-sync option f
ec60: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  or the journal. 
ec70: 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   A power failure
ec80: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63   could lead to c
ec90: 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20  orruption.** in 
eca0: 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20  this case.  But 
ecb0: 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20  for things like 
ecc0: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
ecd0: 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a  (which will be.*
ece0: 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  * deleted when t
ecf0: 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  he power is rest
ed00: 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63  ored) we don't c
ed10: 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20  are.  .**.** If 
ed20: 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
ed30: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
ed40: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c  ile is not a wel
ed50: 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72  l-formed.** jour
ed60: 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c  nal file then al
ed70: 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68  l pages up to th
ed80: 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65  e first corrupte
ed90: 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65  d page are rolle
eda0: 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f  d.** back (or no
edb0: 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f   pages if the jo
edc0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
edd0: 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20  corrupted). The 
ede0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
edf0: 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20  is then deleted 
ee00: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
ee10: 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20  turned, just as 
ee20: 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e  if no corruption
ee30: 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63   had.** been enc
ee40: 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  ountered..**.** 
ee50: 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c  If an I/O or mal
ee60: 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75  loc() error occu
ee70: 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  rs, the journal-
ee80: 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65  file is not dele
ee90: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ted.** and an er
eea0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
eeb0: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
eec0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
eed0: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
eee0: 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20  , int isHot){.  
eef0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
ef00: 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
ef10: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  ;.  i64 szJ;    
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ef30: 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Size of the jour
ef40: 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65  nal file in byte
ef50: 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b  s */.  u32 nRec;
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
ef80: 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ords in the jour
ef90: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
efc0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
efd0: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
efe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
eff0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
f000: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
f010: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f030: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
f040: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
f050: 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
f060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
f070: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73  ue returned by s
f080: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29  qlite3OsAccess()
f090: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
f0a0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
f0b0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
f0c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
f0d0: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
f0e0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
f0f0: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
f100: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
f110: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
f120: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
f130: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
f140: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f150: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
f160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
f170: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
f180: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
f190: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f1a0: 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
f1b0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
f1c0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
f1d0: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
f1e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
f1f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
f200: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
f210: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
f220: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
f230: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
f240: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
f250: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
f260: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
f270: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
f280: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
f290: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
f2a0: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
f2b0: 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
f2c0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
f2d0: 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
f2e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
f2f0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
f300: 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
f310: 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
f320: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f330: 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
f340: 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
f350: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
f360: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
f370: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
f380: 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
f390: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
f3a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f3b0: 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
f3c0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
f3d0: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
f3e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
f3f0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
f400: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
f410: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
f420: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
f430: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
f440: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
f450: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
f460: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
f470: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
f480: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
f490: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
f4a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
f4b0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
f4c0: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
f4d0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
f4e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
f4f0: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
f500: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
f510: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
f520: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
f530: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
f540: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
f550: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
f560: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
f570: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
f580: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
f590: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
f5a0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
f5b0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
f5c0: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
f5d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
f5e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
f5f0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
f600: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
f610: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
f620: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
f630: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
f640: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
f650: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
f660: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
f670: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
f680: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
f690: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
f6a0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
f6b0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
f6c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
f6d0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
f6e0: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
f6f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
f700: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
f710: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
f720: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
f730: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
f740: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
f750: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
f760: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
f770: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
f780: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
f790: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
f7a0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
f7b0: 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
f7c0: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
f7d0: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
f7e0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
f7f0: 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
f800: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
f810: 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
f820: 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
f830: 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
f840: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
f850: 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
f860: 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
f870: 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
f880: 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
f890: 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
f8a0: 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
f8b0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
f8c0: 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
f8d0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
f8e0: 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
f8f0: 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
f900: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
f910: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
f920: 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
f930: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
f940: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
f950: 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
f960: 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
f970: 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
f980: 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
f990: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
f9a0: 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
f9b0: 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
f9c0: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
f9d0: 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
f9e0: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
f9f0: 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
fa00: 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
fa10: 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
fa20: 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
fa30: 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
fa40: 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
fa50: 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
fa60: 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
fa70: 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
fa80: 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
fa90: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
faa0: 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
fab0: 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
fac0: 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
fad0: 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
fae0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
faf0: 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
fb00: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
fb10: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
fb20: 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
fb30: 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
fb40: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
fb50: 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26 20  Hot.         && 
fb60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
fb70: 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
fb80: 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67 65  Z(pPager)!=pPage
fb90: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
fba0: 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a 20         && ((szJ 
fbb0: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
fbc0: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
fbd0: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e 30  PG_SZ(pPager))>0
fbe0: 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61 67  .         && pag
fbf0: 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67  erNextJournalPag
fc00: 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72 29  eIsValid(pPager)
fc10: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
fc20: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
fc30: 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50 61  t &&.        pPa
fc40: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b  ger->journalHdr+
fc50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
fc60: 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e  Pager)==pPager->
fc70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
fc80: 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29      nRec = (int)
fc90: 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
fca0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
fcb0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
fcc0: 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
fcd0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
fce0: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
fcf0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
fd00: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
fd10: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
fd20: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
fd30: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
fd40: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
fd50: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
fd60: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
fd70: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
fd80: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
fd90: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
fda0: 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20  r, mxPg);.      
fdb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fdc0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
fdd0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
fde0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
fdf0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
fe00: 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  xPg;.    }..    
fe10: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
fe20: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
fe30: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
fe40: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
fe50: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
fe60: 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20 75  /.    for(u=0; u
fe70: 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20 20  <nRec; u++){.   
fe80: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
fe90: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
fea0: 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
feb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
fec0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
fed0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
fee0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
fef0: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
ff00: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ff10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
ff20: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ff30: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
ff40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ff50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ff60: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77           /* If w
ff70: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
ff80: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74  rollback, then t
ff90: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70  he database is p
ffa0: 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20  robably.        
ffb0: 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e    ** going to en
ffc0: 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75  d up being corru
ffd0: 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75  pt.  It is corru
ffe0: 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77  pt to us, anyhow
fff0: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50  ..          ** P
10000 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20  erhaps the next 
10010 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20  process to come 
10020 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74  along can fix it
10030 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  .....          *
10040 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
10050 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10060 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
10070 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
10080 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
10090 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
100a0 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a   /*NOTREACHED*/.
100b0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a    assert( 0 );..
100c0 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  end_playback:.  
100d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
100e0 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
100f0 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
10100 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
10110 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
10120 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
10130 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
10140 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
10150 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  1);.  }.  if( rc
10160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10170 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
10180 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
10190 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d  ager, zMaster[0]
101a0 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69  !='\0');.  }.  i
101b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
101c0 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26   && zMaster[0] &
101d0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20  & res ){.    /* 
101e0 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
101f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
10200 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
10210 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
10220 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
10230 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
10240 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
10250 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
10260 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
10270 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70  ager_delmaster(p
10280 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
10290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
102a0 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
102b0 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
102c0 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
102d0 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
102e0 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
102f0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
10300 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
10310 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69  ferent sector si
10320 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ze.  ** value. R
10330 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
10340 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
10350 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
10360 20 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53   */.  setSectorS
10370 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ize(pPager);.  r
10380 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
10390 2a 2a 20 50 6c 61 79 62 61 63 6b 20 73 61 76 65  ** Playback save
103a0 70 6f 69 6e 74 20 70 53 61 76 65 70 6f 69 6e 74  point pSavepoint
103b0 2e 20 20 4f 72 2c 20 69 66 20 70 53 61 76 65 70  .  Or, if pSavep
103c0 6f 69 6e 74 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e  oint==NULL, then
103d0 20 70 6c 61 79 62 61 63 6b 0a 2a 2a 20 74 68 65   playback.** the
103e0 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
103f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
10400 2a 2a 20 54 68 65 20 63 61 73 65 20 70 53 61 76  ** The case pSav
10410 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
10420 75 72 73 20 77 68 65 6e 20 61 20 52 4f 4c 4c 42  urs when a ROLLB
10430 41 43 4b 20 54 4f 20 63 6f 6d 6d 61 6e 64 20 69  ACK TO command i
10440 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 6f 6e 20  s invoked.** on 
10450 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61 74  a SAVEPOINT that
10460 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
10470 6e 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  n savepoint..*/.
10480 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10490 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
104a0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
104b0 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
104c0 2a 70 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20  *pSavepoint){.  
104d0 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
104e0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65           /* Effe
104f0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
10500 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  e main journal *
10510 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
10520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10530 45 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67  End of first seg
10540 6d 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75  ment of main-jou
10550 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a  rnal records */.
10560 20 20 50 67 6e 6f 20 69 69 3b 20 20 20 20 20 20    Pgno ii;      
10570 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
10580 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
10590 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
105a0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
105b0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
105c0 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
105d0 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
105e0 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
105f0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
10600 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   once */..  /* A
10610 6c 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63  llocate a bitvec
10620 20 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65   to use to store
10630 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
10640 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f  s rolled back */
10650 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e  .  if( pSavepoin
10660 74 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d  t ){.    pDone =
10670 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
10680 65 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d  eate(pSavepoint-
10690 3e 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28  >nOrig);.    if(
106a0 20 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20   !pDone ){.     
106b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
106c0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
106d0 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74  .  /* Truncate t
106e0 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b  he database back
106f0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 69 74 20   to the size it 
10700 77 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 0a  was before the .
10710 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 62    ** savepoint b
10720 65 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61  eing reverted wa
10730 73 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  s opened..  */. 
10740 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
10750 3d 20 70 53 61 76 65 70 6f 69 6e 74 20 3f 20 70  = pSavepoint ? p
10760 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
10770 20 3a 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69   : pPager->dbOri
10780 67 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  gSize;.  assert(
10790 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
107a0 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
107b0 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72  .  /* Use pPager
107c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20  ->journalOff as 
107d0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69  the effective si
107e0 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72  ze of the main r
107f0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
10800 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61  rnal.  The actua
10810 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20  l file might be 
10820 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73  larger than this
10830 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a   in.  ** PAGER_J
10840 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
10850 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55  ATE or PAGER_JOU
10860 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
10870 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a  .  But anything.
10880 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72    ** past pPager
10890 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  ->journalOff is 
108a0 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73  off-limits to us
108b0 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
108c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
108d0 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  f;..  /* Begin b
108e0 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72  y rolling back r
108f0 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
10900 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61  main journal sta
10910 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61  rting at.  ** Pa
10920 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66  gerSavepoint.iOf
10930 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  fset and continu
10940 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ing to the next 
10950 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
10960 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74    ** There might
10970 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74   be records in t
10980 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
10990 74 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65  that have a page
109a0 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65   number.  ** gre
109b0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ater than the cu
109c0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73  rrent database s
109d0 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53  ize (pPager->dbS
109e0 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20  ize) but those. 
109f0 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70   ** will be skip
10a00 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ped automaticall
10a10 79 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64  y.  Pages are ad
10a20 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20  ded to pDone as 
10a30 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c  they.  ** are pl
10a40 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
10a50 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
10a60 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
10a70 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
10a80 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
10a90 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
10aa0 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
10ab0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
10ac0 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
10ad0 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
10ae0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10af0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
10b00 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
10b10 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
10b20 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
10b30 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  age(pPager, 1, &
10b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10b50 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
10b60 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
10b70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
10b80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
10b90 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
10ba0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
10bb0 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
10bc0 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
10bd0 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
10be0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
10bf0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
10c00 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
10c10 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
10c20 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
10c30 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
10c40 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
10c50 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
10c60 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
10c70 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
10c80 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
10c90 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
10ca0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
10cb0 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
10cc0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
10cd0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
10ce0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
10cf0 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
10d00 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
10d10 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
10d20 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
10d30 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
10d40 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
10d50 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
10d60 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
10d70 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
10d80 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20  QLITE_DONE );.. 
10d90 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
10da0 20 22 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   "pPager->journa
10db0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
10dc0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
10dd0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22  ger->journalOff"
10de0 0a 20 20 20 20 2a 2a 20 74 65 73 74 20 69 73 20  .    ** test is 
10df0 72 65 6c 61 74 65 64 20 74 6f 20 74 69 63 6b 65  related to ticke
10e00 74 20 23 32 35 36 35 2e 20 20 53 65 65 20 74 68  t #2565.  See th
10e10 65 20 64 69 73 63 75 73 73 69 6f 6e 20 69 6e 20  e discussion in 
10e20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
10e30 5f 70 6c 61 79 62 61 63 6b 28 29 20 66 75 6e 63  _playback() func
10e40 74 69 6f 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  tion for additio
10e50 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
10e60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
10e70 72 74 28 20 21 28 6e 4a 52 65 63 3d 3d 30 0a 20  rt( !(nJRec==0. 
10e80 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
10e90 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
10ea0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10eb0 67 65 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)!=pPager->jo
10ec0 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20  urnalOff.       
10ed0 20 20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61    && ((szJ - pPa
10ee0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
10ef0 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
10f00 28 70 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20  (pPager))>0.    
10f10 20 20 20 20 20 26 26 20 70 61 67 65 72 4e 65 78       && pagerNex
10f20 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61  tJournalPageIsVa
10f30 6c 69 64 28 70 50 61 67 65 72 29 29 0a 20 20 20  lid(pPager)).   
10f40 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4a 52 65   );.    if( nJRe
10f50 63 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 50  c==0 .     && pP
10f60 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
10f70 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
10f80 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
10f90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20  >journalOff.    
10fa0 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
10fb0 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
10fc0 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
10fd0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
10fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
10ff0 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
11000 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63  E_OK && ii<nJRec
11010 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
11020 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b  nalOff<szJ; ii++
11030 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
11040 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
11050 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c  _page(pPager, 1,
11060 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
11070 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  lOff, 1, pDone);
11080 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
11090 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
110a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
110b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
110c0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
110d0 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29  ournalOff==szJ )
110e0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  ;..  /* Finally,
110f0 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73    rollback pages
11100 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
11110 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61  urnal.  Page tha
11120 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76  t were.  ** prev
11130 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61  iously rolled ba
11140 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ck out of the ma
11150 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  in journal (and 
11160 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f  are hence in pDo
11170 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ne).  ** will be
11180 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f   skipped.  Out-o
11190 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72  f-range pages ar
111a0 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a  e also skipped..
111b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65    */.  if( pSave
111c0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 36 34  point ){.    i64
111d0 20 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70   offset = pSavep
111e0 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34  oint->iSubRec*(4
111f0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
11200 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70  e);.    for(ii=p
11210 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
11220 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
11230 4b 26 26 69 69 3c 28 75 33 32 29 70 50 61 67 65  K&&ii<(u32)pPage
11240 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 20 69 69 2b  r->stmtNRec; ii+
11250 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
11260 28 20 6f 66 66 73 65 74 20 3d 3d 20 69 69 2a 28  ( offset == ii*(
11270 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4+pPager->pageSi
11280 7a 65 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ze) );.      rc 
11290 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
112a0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
112b0 2c 20 30 2c 20 26 6f 66 66 73 65 74 2c 20 31 2c  , 0, &offset, 1,
112c0 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61   pDone);.      a
112d0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
112e0 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a  E_DONE );.    }.
112f0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 69    }..  sqlite3Bi
11300 74 76 65 63 44 65 73 74 72 6f 79 28 70 44 6f 6e  tvecDestroy(pDon
11310 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
11320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
11330 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11340 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 72  f = szJ;.  }.  r
11350 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11360 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
11370 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
11380 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
11390 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
113a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
113b0 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
113c0 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
113d0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
113e0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
113f0 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
11400 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61  r->pPCache, mxPa
11410 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  ge);.}../*.** Ad
11420 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
11430 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
11440 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
11450 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
11460 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
11470 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
11480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
11490 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
114a0 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
114b0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
114c0 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
114d0 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
114e0 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
114f0 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
11500 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
11510 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
11520 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11530 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
11540 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
11550 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
11560 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
11570 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
11580 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
11590 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
115a0 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
115b0 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
115c0 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
115d0 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
115e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
115f0 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
11600 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
11610 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
11620 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
11630 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
11640 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
11650 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
11660 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
11680 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
11690 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
116a0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
116b0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
116c0 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
116d0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
116e0 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
116f0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11700 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
11710 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
11720 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
11730 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
11740 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
11750 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
11760 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
11770 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11780 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
11790 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
117a0 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
117b0 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
117c0 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
117d0 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
117e0 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
11800 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
11810 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
11820 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
11830 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
11840 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
11850 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
11860 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
11870 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
11880 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
11890 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
118a0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
118b0 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
118c0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
118d0 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
118e0 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
118f0 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
11900 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
11910 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
11920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11930 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
11940 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
11950 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11960 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11970 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62  int level, int b
11980 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50  FullFsync){.  pP
11990 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20  ager->noSync =  
119a0 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61  (level==1 || pPa
119b0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f  ger->tempFile) ?
119c0 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  1:0;.  pPager->f
119d0 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76 65 6c  ullSync = (level
119e0 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
119f0 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a  tempFile) ?1:0;.
11a00 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
11a10 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
11a20 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
11a30 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
11a40 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
11a50 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
11a60 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
11a70 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
11a80 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
11a90 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
11aa0 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
11ab0 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
11ac0 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
11ad0 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
11ae0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
11af0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
11b00 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
11b10 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
11b20 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
11b30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
11b40 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
11b50 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
11b60 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
11b70 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
11b80 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
11b90 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
11ba0 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
11bb0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
11bc0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
11bd0 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
11be0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
11bf0 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
11c00 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
11c10 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
11c20 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68  orary.** file wh
11c30 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11c40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
11c50 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
11c60 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
11c70 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
11c80 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
11c90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
11ca0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
11cb0 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
11cc0 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
11cd0 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
11ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
11cf0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
11d00 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
11d10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
11d20 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11d30 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
11d40 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
11d50 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
11d60 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
11d70 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
11d80 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
11d90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11da0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
11db0 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
11dc0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11dd0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
11de0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
11df0 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
11e00 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
11e10 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
11e20 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
11e30 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
11e40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
11e50 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
11e60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11e70 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
11e80 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c  erStress(void *,
11e90 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  PgHdr *);../*.**
11ea0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
11eb0 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
11ec0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
11ed0 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
11ee0 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
11ef0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
11f00 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
11f10 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
11f20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
11f30 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
11f40 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
11f50 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
11f60 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
11f70 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
11f80 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
11f90 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
11fa0 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
11fb0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11fc0 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
11fd0 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
11fe0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
11ff0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
12000 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
12010 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
12020 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
12030 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
12040 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
12050 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
12060 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
12070 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
12080 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
12090 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
120a0 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
120b0 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
120c0 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
120d0 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
120e0 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
120f0 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
12100 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
12110 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
12120 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
12130 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
12140 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
12150 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
12160 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
12170 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
12180 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
12190 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
121a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
121b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
121c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
121d0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
121e0 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
121f0 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
12200 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
12210 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
12220 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12240 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
12250 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
12260 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
12270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
12280 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
12290 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
122a0 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
122b0 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
122c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
122d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
122e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
122f0 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
12300 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
12310 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
12320 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
12330 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
12340 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
12350 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
12360 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
12370 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
12380 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
12390 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
123a0 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63  leSize;.  int pc
123b0 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
123c0 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a  e3PcacheSize();.
123d0 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74    int szPageDflt
123e0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
123f0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
12400 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
12410 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   0;.  int nPathn
12420 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
12430 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
12440 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
12450 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
12460 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
12470 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
12480 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
12490 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
124a0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
124b0 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75   = sqlite3MemJou
124c0 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a  rnalSize();.  }.
124d0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
124e0 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55  t return is a NU
124f0 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  LL pointer */.  
12500 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
12510 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
12520 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
12530 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
12540 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
12550 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
12560 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
12570 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
12580 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
12590 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
125a0 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
125b0 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
125c0 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
125d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
125e0 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
125f0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
12600 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
12610 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
12620 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
12630 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
12640 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
12650 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
12660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
12670 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12680 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
12690 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
126a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
126b0 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
126c0 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
126d0 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
126e0 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
126f0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
12700 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
12710 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
12720 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
12730 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
12740 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
12750 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
12760 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12770 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12780 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
12790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
127a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
127b0 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
127c0 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61  Strlen30(zPathna
127d0 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
127e0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
127f0 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
12800 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
12810 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
12820 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
12830 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
12840 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
12850 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
12860 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20    pcacheSize    
12870 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
12880 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
12890 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
128a0 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
128b0 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
128c0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
128d0 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
128e0 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20 20  OsFile  +       
128f0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
12900 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
12910 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
12920 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68   2 +       /* Th
12930 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
12940 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50  les */ .    3*nP
12950 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20  athname + 40    
12960 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
12970 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79  name, zDirectory
12980 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  , zJournal */.  
12990 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
129a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
129b0 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
129c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
129d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
129e0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
129f0 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70 50 61  = (PCache *)&pPa
12a00 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20 3d  ger[1];.  pPtr =
12a10 20 28 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b   ((u8 *)&pPager[
12a20 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a 65  1]) + pcacheSize
12a30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
12a40 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
12a50 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
12a60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
12a70 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
12a80 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72  ile*0];.  pPager
12a90 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  ->sjfd = (sqlite
12aa0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
12ab0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a 20  fs->szOsFile];. 
12ac0 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28   pPager->jfd = (
12ad0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
12ae0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
12af0 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  le+journalFileSi
12b00 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
12b10 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
12b20 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
12b30 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e 61 6c  OsFile+2*journal
12b40 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
12b50 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
12b60 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
12b70 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
12b80 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
12b90 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
12ba0 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
12bb0 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
12bc0 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
12bd0 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
12be0 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
12bf0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
12c00 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
12c10 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73  thname+1);.    s
12c20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
12c30 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
12c40 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
12c50 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
12c60 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
12c70 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
12c80 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
12c90 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
12ca0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 28  ->mxPathname - (
12cb0 69 6e 74 29 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  int)sizeof("-jou
12cc0 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20 20 20  rnal")) ){.     
12cd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
12ce0 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c 73 65  TOPEN;.    }else
12cf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74  {.      int fout
12d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
12d10 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
12d20 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  Vfs, pPager->zFi
12d30 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72 2d 3e  lename, pPager->
12d40 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
12d60 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c 20 26  ger->vfsFlags, &
12d70 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 61  fout);.      rea
12d80 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51  dOnly = (fout&SQ
12d90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
12da0 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  LY);..      /* I
12db0 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 73  f the file was s
12dc0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
12dd0 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  ed for read/writ
12de0 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20 20 20  e access,.      
12df0 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
12e00 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
12e10 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
12e20 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
12e30 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
12e40 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  le. The default 
12e50 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65  page size is the
12e60 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20   maximum of:.   
12e70 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
12e80 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46 41 55    + SQLITE_DEFAU
12e90 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20  LT_PAGE_SIZE,.  
12ea0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
12eb0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
12ec0 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
12ed0 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20 2a 2a  rSize().      **
12ee0 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65 73      + The larges
12ef0 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61 74  t page size that
12f00 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
12f10 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20 20  atomically..    
12f20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
12f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
12f40 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  !readOnly ){.   
12f50 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
12f60 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
12f70 20 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66      if( szPageDf
12f80 6c 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  lt<pPager->secto
12f90 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
12fa0 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
12fb0 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12fc0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
12fd0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12fe0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
12ff0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
13000 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
13010 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
13020 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
13030 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
13040 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
13050 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
13060 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
13070 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
13080 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
13090 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
130a0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
130b0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
130c0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
130d0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
130e0 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
130f0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
13100 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
13110 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
13120 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
13130 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
13140 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
13150 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
13160 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65  ii>>8)) ) szPage
13170 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
13180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13190 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
131a0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53  if( szPageDflt>S
131b0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
131c0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
131d0 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
131e0 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
131f0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
13200 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
13210 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
13220 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
13230 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
13240 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
13250 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
13260 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
13270 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
13280 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
13290 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
132a0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
132b0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
132c0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
132d0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
132e0 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
132f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
13300 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
13310 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
13320 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
13330 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
13340 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
13350 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
13360 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
13370 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
13380 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
13390 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
133a0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
133b0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
133c0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
133d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
133e0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
133f0 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
13400 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
13410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13420 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
13430 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
13440 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c  Malloc(szPageDfl
13450 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
13460 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
13470 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
13480 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
13490 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
134a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
134b0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
134c0 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
134d0 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
134e0 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
134f0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
13500 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
13510 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
13520 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
13530 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
13540 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
13550 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
13560 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
13570 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13580 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
13590 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
135a0 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
135b0 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45  EM:rc);.  }.  nE
135c0 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
135d0 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
135e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
135f0 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
13600 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
13630 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
13640 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
13650 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
13660 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e  AGERTRACE(("OPEN
13670 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
13680 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
13690 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
136a0 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52  lename));.  IOTR
136b0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
136c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
136d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
136e0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
136f0 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b  ager.zDirectory[
13700 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
13710 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13720 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
13730 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
13740 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  );.  for(i=sqlit
13750 65 33 53 74 72 6c 65 6e 33 30 28 70 50 61 67 65  e3Strlen30(pPage
13760 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20  r->zDirectory); 
13770 0a 20 20 20 20 20 20 69 3e 30 20 26 26 20 70 50  .      i>0 && pP
13780 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
13790 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
137a0 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
137b0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
137c0 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f  y[i-1] = 0;..  /
137d0 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
137e0 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20  zJournal[] */.  
137f0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
13800 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
13810 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
13820 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
13830 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
13840 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
13850 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
13860 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
13870 2c 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 9);.  }else{. 
13880 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
13890 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nal = 0;.  }..  
138a0 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
138b0 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
138c0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
138d0 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75  nal = (u8)useJou
138e0 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
138f0 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f  noReadlock = (no
13900 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
13910 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a  Only) ?1:0;.  /*
13920 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
13930 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  n = 0; */.  /* p
13940 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
13950 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
13960 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20  ager->nRef = 0; 
13970 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  */.  pPager->dbS
13980 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d  izeValid = (u8)m
13990 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
139a0 70 61 67 65 53 69 7a 65 20 3d 20 73 7a 50 61 67  pageSize = szPag
139b0 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67  eDflt;.  /* pPag
139c0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
139d0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
139e0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
139f0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
13a00 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
13a10 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
13a20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
13a30 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
13a40 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
13a50 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
13a60 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
13a70 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  CK; */.  assert(
13a80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
13a90 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41  = (tempFile ? PA
13aa0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20  GER_EXCLUSIVE : 
13ab0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b  PAGER_UNLOCK) );
13ac0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
13ad0 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
13ae0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13af0 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b   = (u8)tempFile;
13b00 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46  .  assert( tempF
13b10 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
13b20 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20  NGMODE_NORMAL . 
13b30 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70           || temp
13b40 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
13b50 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
13b60 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
13b70 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
13b80 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b  _EXCLUSIVE==1 );
13b90 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
13ba0 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74  siveMode = (u8)t
13bb0 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
13bc0 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29  er->memDb = (u8)
13bd0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
13be0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29  >readOnly = (u8)
13bf0 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
13c00 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13c10 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
13c20 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67  ->noSync = (pPag
13c30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
13c40 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a  !useJournal) ?1:
13c50 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  0;.  pPager->ful
13c60 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  lSync = pPager->
13c70 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70  noSync ?0:1;.  p
13c80 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
13c90 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
13ca0 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
13cb0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
13cc0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
13cd0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
13ce0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
13cf0 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
13d00 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
13d10 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50  a = nExtra;.  pP
13d20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
13d30 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
13d40 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
13d50 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
13d60 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
13d70 3e 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d 70 46  >pMethods||tempF
13d80 69 6c 65 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  ile);.  setSecto
13d90 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
13da0 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
13db0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13dc0 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
13dd0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
13de0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
13df0 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
13e00 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
13e10 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13e20 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  rArg = 0; */.  /
13e30 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d  * memset(pPager-
13e40 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
13e50 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
13e60 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  ); */.  *ppPager
13e70 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74   = pPager;.  ret
13e80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13e90 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
13ea0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
13eb0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
13ec0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
13ed0 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
13ee0 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
13ef0 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65  nt (*xBusyHandle
13f00 72 29 28 76 6f 69 64 20 2a 29 2c 0a 20 20 76 6f  r)(void *),.  vo
13f10 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  id *pBusyHandler
13f20 41 72 67 0a 29 7b 20 20 0a 20 20 70 50 61 67 65  Arg.){  .  pPage
13f30 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20  r->xBusyHandler 
13f40 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a  = xBusyHandler;.
13f50 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
13f60 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73  andlerArg = pBus
13f70 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a  yHandlerArg;.}..
13f80 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
13f90 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
13fa0 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
13fb0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
13fc0 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
13fd0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
13fe0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
13ff0 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
14000 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
14010 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
14020 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
14030 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
14040 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
14050 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
14060 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
14070 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
14080 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
14090 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
140a0 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
140b0 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
140c0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
140d0 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
140e0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
140f0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
14100 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  *)){.  pPager->x
14110 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e  Reiniter = xRein
14120 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  it;.}../*.** Set
14130 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74   the page size t
14140 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66  o *pPageSize. If
14150 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
14160 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a   page size is.**
14170 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
14180 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
14190 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
141a0 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20   set to that.** 
141b0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
141c0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  urning..*/.int s
141d0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
141e0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
141f0 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65  ager, u16 *pPage
14200 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Size){.  int rc 
14210 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
14220 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  e;.  if( rc==SQL
14230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31  ITE_OK ){.    u1
14240 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50  6 pageSize = *pP
14250 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73  ageSize;.    ass
14260 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
14270 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
14280 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
14290 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
142a0 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28  SIZE) );.    if(
142b0 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67   pageSize && pag
142c0 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70  eSize!=pPager->p
142d0 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26 26  ageSize .     &&
142e0 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d   (pPager->memDb=
142f0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  =0 || pPager->db
14300 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26  Size==0).     &&
14310 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
14320 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
14330 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
14340 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  ){.      char *p
14350 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
14360 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
14370 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14380 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20   if( !pNew ){.  
14390 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
143a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
143b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61  else{.        pa
143c0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
143d0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
143e0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
143f0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
14400 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d  if( !pPager->mem
14410 44 62 20 29 20 73 65 74 53 65 63 74 6f 72 53 69  Db ) setSectorSi
14420 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
14430 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
14440 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
14450 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
14460 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
14470 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
14480 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
14490 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
144a0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
144b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
144c0 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
144d0 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
144e0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
144f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14500 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
14510 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
14520 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
14530 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
14540 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
14550 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
14560 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
14570 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
14580 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
14590 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
145a0 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
145b0 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
145c0 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
145d0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
145e0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
145f0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
14600 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
14610 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
14620 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
14630 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
14640 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
14650 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
14660 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
14670 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
14680 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
14690 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
146a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
146b0 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
146c0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
146d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
146e0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
146f0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
14700 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
14710 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
14720 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
14730 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
14740 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
14750 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
14760 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
14770 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
14780 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
14790 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
147a0 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
147b0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
147c0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
147d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
147e0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
147f0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
14800 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
14810 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
14820 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
14830 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
14840 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
14850 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
14860 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
14870 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
14880 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
14890 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
148a0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
148b0 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
148c0 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
148d0 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
148e0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
148f0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
14900 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
14910 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
14920 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
14930 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
14940 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
14950 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
14960 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
14970 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
14980 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
14990 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
149a0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
149b0 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
149c0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
149d0 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
149e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
149f0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
14a00 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
14a10 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
14a20 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
14a30 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
14a40 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
14a50 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
14a60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
14a70 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
14a80 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
14a90 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
14aa0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
14ab0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
14ac0 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
14ad0 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
14ae0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
14af0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
14b00 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
14b10 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
14b20 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
14b30 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
14b40 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
14b50 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
14b60 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
14b70 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
14b80 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
14b90 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72   .**.** No error
14ba0 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
14bb0 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20  e. The rational 
14bc0 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74  for this is that
14bd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   this function .
14be0 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  ** may be called
14bf0 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c   even if the fil
14c00 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  e does not exist
14c10 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65   or contain a he
14c20 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65  ader. In .** the
14c30 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33  se cases sqlite3
14c40 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65  OsRead() will re
14c50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74  turn an error, t
14c60 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72  o which the corr
14c70 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65  ect .** response
14c80 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20   is to zero the 
14c90 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20  memory at pDest 
14ca0 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41  and continue.  A
14cb0 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a   real IO error .
14cc0 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62  ** will presumab
14cd0 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20  ly recur and be 
14ce0 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20  picked up later 
14cf0 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f  (Todo: Think abo
14d00 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74  ut this)..*/.int
14d10 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
14d20 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  dFileheader(Page
14d30 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
14d40 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
14d50 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72  *pDest){.  int r
14d60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14d70 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30   memset(pDest, 0
14d80 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , N);.  assert(p
14d90 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
14da0 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
14db0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50  pFile);.  if( pP
14dc0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
14dd0 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43  ds ){.    IOTRAC
14de0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
14df0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
14e00 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
14e10 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
14e20 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30  >fd, pDest, N, 0
14e30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
14e40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
14e50 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
14e60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14e70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14e80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14e90 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
14ea0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
14eb0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
14ec0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
14ed0 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
14ee0 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
14ef0 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
14f00 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
14f10 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
14f20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
14f30 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
14f40 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
14f50 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
14f60 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
14f70 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
14f80 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
14f90 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
14fa0 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
14fb0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
14fc0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
14fd0 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
14fe0 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
14ff0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
15000 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
15010 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e  *pPager, int *pn
15020 50 61 67 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d  Page){.  i64 n =
15030 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
15040 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
15050 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
15060 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
15070 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
15080 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
15090 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
150a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
150b0 61 6c 69 64 20 29 7b 0a 20 20 20 20 6e 20 3d 20  alid ){.    n = 
150c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
150d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61    } else {.    a
150e0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
150f0 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
15100 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
15110 20 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e     if( (pPager->
15120 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20  fd->pMethods).  
15130 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
15140 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
15150 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d  ager->fd, &n))!=
15160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15170 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70     pager_error(p
15180 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
15190 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
151a0 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
151b0 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
151c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
151d0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
151e0 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
151f0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
15200 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
15210 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
15220 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
15230 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
15240 20 28 50 67 6e 6f 29 6e 3b 0a 20 20 20 20 20 20   (Pgno)n;.      
15250 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
15260 7a 65 20 3d 20 28 50 67 6e 6f 29 6e 3b 0a 20 20  ze = (Pgno)n;.  
15270 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
15280 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  zeValid = 1;.   
15290 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
152a0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
152b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
152c0 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
152d0 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
152e0 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
152f0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
15300 50 67 6e 6f 29 6e 3b 0a 20 20 7d 0a 20 20 69 66  Pgno)n;.  }.  if
15310 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ( pnPage ){.    
15320 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 6e  *pnPage = (int)n
15330 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
15340 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15350 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
15360 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
15370 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
15380 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
15390 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
153a0 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
153b0 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
153c0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
153d0 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
153e0 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
153f0 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
15400 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
15410 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
15420 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
15430 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
15440 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
15450 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15460 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
15470 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
15480 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
15490 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
154a0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
154b0 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
154c0 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
154d0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
154e0 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
154f0 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
15500 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
15510 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
15520 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
15530 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
15540 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
15550 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
15560 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
15570 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
15580 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
15590 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
155a0 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
155b0 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
155c0 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
155d0 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
155e0 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
155f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15600 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
15610 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
15620 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
15630 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15640 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65  >state>=locktype
15650 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
15660 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
15670 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
15680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
15690 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  ck(pPager->fd, l
156a0 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
156b0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
156c0 5f 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d  _BUSY && pPager-
156d0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  >xBusyHandler(pP
156e0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
156f0 65 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66  erArg) );.    if
15700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15710 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
15720 3e 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63  >state = (u8)loc
15730 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
15740 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
15750 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
15760 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
15770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15780 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15790 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
157a0 4d 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  M./*.** Truncate
157b0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
157c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
157d0 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
157e0 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
157f0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
15800 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
15810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15820 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
15830 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
15840 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
15850 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
15860 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
15870 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
15880 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
15890 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
158a0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
158b0 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
158c0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
158d0 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
158e0 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
158f0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
15900 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
15910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
15920 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
15930 67 65 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ge );.  pPager->
15940 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
15950 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15960 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
15970 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15980 20 66 69 6c 65 20 69 6d 61 67 65 20 69 6e 20 70   file image in p
15990 61 67 65 73 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ages. This.** fu
159a0 6e 63 74 69 6f 6e 20 64 69 66 66 65 72 73 20 66  nction differs f
159b0 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 67 65 72  rom sqlite3Pager
159c0 50 61 67 65 63 6f 75 6e 74 28 29 20 69 6e 20 74  Pagecount() in t
159d0 77 6f 20 77 61 79 73 3a 0a 2a 2a 0a 2a 2a 20 20  wo ways:.**.**  
159e0 61 29 20 49 74 20 6d 61 79 20 6f 6e 6c 79 20 62  a) It may only b
159f0 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 74  e called when at
15a00 20 6c 65 61 73 74 20 6f 6e 65 20 72 65 66 65 72   least one refer
15a10 65 6e 63 65 20 74 6f 20 61 20 64 61 74 61 62 61  ence to a databa
15a20 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65 20 69  se.**     page i
15a30 73 20 68 65 6c 64 2e 20 54 68 69 73 20 67 75 61  s held. This gua
15a40 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
15a50 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 69   database size i
15a60 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 20 20 20  s already.**    
15a70 20 6b 6e 6f 77 6e 20 61 6e 64 20 61 20 63 61 6c   known and a cal
15a80 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 46 69  l to sqlite3OsFi
15a90 6c 65 53 69 7a 65 28 29 20 69 73 20 6e 6f 74 20  leSize() is not 
15aa0 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
15ab0 20 62 29 20 54 68 65 20 72 65 74 75 72 6e 20 76   b) The return v
15ac0 61 6c 75 65 20 69 73 20 6e 6f 74 20 61 64 6a 75  alue is not adju
15ad0 73 74 65 64 20 66 6f 72 20 74 68 65 20 6c 6f 63  sted for the loc
15ae0 6b 69 6e 67 20 70 61 67 65 2e 0a 2a 2f 0a 50 67  king page..*/.Pg
15af0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  no sqlite3PagerI
15b00 6d 61 67 65 53 69 7a 65 28 50 61 67 65 72 20 2a  mageSize(Pager *
15b10 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
15b20 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
15b30 65 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  eValid );.  retu
15b40 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  rn pPager->dbSiz
15b50 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20  e;.}.#endif  /* 
15b60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15b70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
15b80 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
15b90 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
15ba0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
15bb0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
15bc0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
15bd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
15be0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
15bf0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
15c00 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
15c10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
15c20 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
15c30 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
15c40 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
15c50 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
15c60 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
15c70 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
15c80 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
15c90 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
15ca0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
15cb0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
15cc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
15cd0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
15ce0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
15cf0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
15d00 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
15d10 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
15d20 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
15d30 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
15d40 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
15d50 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
15d60 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
15d70 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
15d80 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
15d90 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
15da0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
15db0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
15dc0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
15dd0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
15de0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
15df0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
15e00 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  er){..  disable_
15e10 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
15e20 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
15e30 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
15e40 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
15e50 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
15e60 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
15e70 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
15e80 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
15e90 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
15ea0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
15eb0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
15ec0 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
15ed0 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
15ee0 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
15ef0 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
15f00 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
15f10 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
15f20 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
15f30 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
15f40 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
15f50 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
15f60 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
15f70 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
15f80 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
15f90 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
15fa0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
15fb0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
15fc0 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
15fd0 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
15fe0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
15ff0 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
16000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
16010 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
16020 20 2d 31 3b 0a 20 20 20 20 70 61 67 65 72 55 6e   -1;.    pagerUn
16030 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
16040 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 65  pPager);.  }.  e
16050 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
16060 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
16070 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
16080 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45 52  alloc();.  PAGER
16090 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64  TRACE(("CLOSE %d
160a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
160b0 67 65 72 29 29 29 3b 0a 20 20 49 4f 54 52 41 43  ger)));.  IOTRAC
160c0 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
160d0 20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20   pPager)).  if( 
160e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
160f0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
16100 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
16110 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
16120 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
16130 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
16140 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  urnal);.  sqlite
16150 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
16160 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
16170 6c 6c 62 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61  llback);.  relea
16180 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70  seAllSavepoint(p
16190 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  Pager);.  sqlite
161a0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
161b0 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
161c0 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
161d0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
161e0 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
161f0 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
16200 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
16210 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
16220 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
16230 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20  ;.  ** }.  */.. 
16240 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
16250 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
16260 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
16270 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
16280 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73 71  ->pPCache);.  sq
16290 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
162a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
162b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
162c0 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
162d0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
162e0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
162f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
16300 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76  mber for the giv
16310 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  en page data..*/
16320 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
16330 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
16340 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  age *p){.  retur
16350 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e  n p->pgno;.}.#en
16360 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
16370 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
16380 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
16390 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
163a0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
163b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
163c0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
163d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
163e0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
163f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
16400 52 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  Ref(pPg);.  retu
16410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16420 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
16430 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
16440 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
16450 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
16460 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
16470 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
16480 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
16490 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
164a0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
164b0 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
164c0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
164d0 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
164e0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
164f0 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
16500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
16510 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
16520 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
16530 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
16540 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
16550 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
16560 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
16570 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
16580 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
16590 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
165a0 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
165b0 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
165c0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
165d0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
165e0 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
165f0 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
16600 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
16610 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
16620 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
16630 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
16640 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
16650 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
16660 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
16670 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
16680 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
16690 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
166a0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
166b0 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
166c0 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
166d0 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
166e0 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
166f0 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
16700 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
16710 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
16720 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
16730 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
16740 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
16750 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
16760 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
16770 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
16780 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
16790 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
167a0 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79  ailure, so no sy
167b0 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
167c0 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
167d0 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69 73  QUENTIAL flag is
167e0 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72   set for the per
167f0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e  sistent media on
16800 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64 61   which.** the da
16810 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65 64  tabase is stored
16820 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29 20  , then OsSync() 
16830 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20  is never called 
16840 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  on the journal.*
16850 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73 20  * file. In this 
16860 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69 73  case all that is
16870 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f 20   required is to 
16880 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  update the nRec 
16890 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20  field in.** the 
168a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
168b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
168c0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
168d0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
168e0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
168f0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
16900 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
16910 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
16920 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16930 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16940 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
16950 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
16960 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
16970 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
16980 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
16990 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
169a0 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
169b0 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
169c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
169d0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
169e0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
169f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
16a00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
16a10 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
16a20 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
16a30 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
16a40 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
16a50 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
16a60 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
16a70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16a80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16a90 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69  Open );..      i
16aa0 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
16ab0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
16ac0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
16ad0 69 36 34 20 6a 72 6e 6c 4f 66 66 20 3d 20 6a 6f  i64 jrnlOff = jo
16ae0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
16af0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
16b00 75 38 20 7a 4d 61 67 69 63 5b 38 5d 3b 0a 0a 20  u8 zMagic[8];.. 
16b10 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
16b20 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20  lock deals with 
16b30 61 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c  an obscure probl
16b40 65 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20  em. If the last 
16b50 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20  connection.     
16b60 20 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65     ** that wrote
16b70 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
16b80 65 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20  e was operating 
16b90 69 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f  in persistent-jo
16ba0 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
16bb0 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
16bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79  journal file may
16bd0 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61   at this point a
16be0 63 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65  ctually be large
16bf0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  r.        ** tha
16c00 6e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  n Pager.journalO
16c10 66 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65  ff bytes. If the
16c20 20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74   next thing in t
16c30 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
16c40 20 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65     ** file happe
16c50 6e 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e  ns to be a journ
16c60 61 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74  al-header (writt
16c70 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  en as part of th
16c80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  e.        ** pre
16c90 76 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  vious connection
16ca0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20  s transaction), 
16cb0 61 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70  and a crash or p
16cc0 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20  ower-failure .  
16cd0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20        ** occurs 
16ce0 61 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70  after nRec is up
16cf0 64 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65  dated but before
16d00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
16d10 20 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20   writes .       
16d20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73   ** anything els
16d30 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
16d40 20 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74   file (or commit
16d50 73 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73  s/rolls back its
16d60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61   .        ** tra
16d70 6e 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20  nsaction), then 
16d80 53 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d  SQLite may becom
16d90 65 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20  e confused when 
16da0 64 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20  doing the .     
16db0 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61     ** hot-journa
16dc0 6c 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f  l rollback follo
16dd0 77 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49  wing recovery. I
16de0 74 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20  t may roll back 
16df0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  all.        ** o
16e00 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
16e10 6e 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72  ns data, then pr
16e20 6f 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67  oceed to rolling
16e30 20 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20   back the old,. 
16e40 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66         ** out-of
16e50 2d 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20  -date data that 
16e60 66 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61  follows it. Data
16e70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
16e80 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16e90 20 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61      ** To work a
16ea0 72 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74  round this, if t
16eb0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16ec0 64 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63  does appear to c
16ed0 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a  ontain.        *
16ee0 2a 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72  * a valid header
16ef0 20 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72   following Pager
16f00 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65  .journalOff, the
16f10 6e 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20  n write a 0x00. 
16f20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74         ** byte t
16f30 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69  o the start of i
16f40 74 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20  t to prevent it 
16f50 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67  from being recog
16f60 6e 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  nized..        *
16f70 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
16f80 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
16f90 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 67 69 63  ger->jfd, zMagic
16fa0 2c 20 38 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  , 8, jrnlOff);. 
16fb0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16fc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
16fd0 65 6d 63 6d 70 28 7a 4d 61 67 69 63 2c 20 61 4a  emcmp(zMagic, aJ
16fe0 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
16ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
17000 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
17010 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
17020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17030 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
17040 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
17050 20 31 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20   1, jrnlOff);.  
17060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17080 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
17090 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
170a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
170b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
170c0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
170d0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
170e0 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
170f0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
17100 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
17110 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
17120 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
17130 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
17140 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
17150 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
17160 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
17170 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
17180 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
17190 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
171a0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
171b0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
171c0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
171d0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
171e0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
171f0 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
17200 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
17210 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
17220 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
17230 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
17240 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
17250 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
17260 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
17270 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
17280 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
17290 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
172a0 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
172b0 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
172c0 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
172d0 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
172e0 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
172f0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
17300 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
17310 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
17320 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17330 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
17340 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
17350 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
17360 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
17370 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
17380 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
17390 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
173a0 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
173b0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
173c0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
173d0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
173e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
173f0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
17400 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
17410 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
17420 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
17430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17440 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a 72 6e    }..        jrn
17450 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
17460 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
17470 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
17480 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  );.        IOTRA
17490 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
174a0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
174b0 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b 0a 20   jrnlOff, 4));. 
174c0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
174d0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
174e0 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 50  jfd, jrnlOff, pP
174f0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
17500 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
17510 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17520 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
17530 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
17540 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
17550 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
17560 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E(("SYNC journal
17570 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
17580 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20  ID(pPager)));.  
17590 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
175a0 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
175b0 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72 63  ger)).        rc
175c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
175d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
175e0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
175f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 50  | .          (pP
17600 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
17610 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
17620 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  LL?SQLITE_SYNC_D
17630 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20 20  ATAONLY:0).     
17640 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
17650 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
17660 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
17670 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
17680 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
17690 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
176a0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
176b0 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
176c0 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
176d0 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
176e0 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
176f0 65 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e  e3PcacheClearSyn
17700 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70  cFlags(pPager->p
17710 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20  PCache);.  }..  
17720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17730 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
17740 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
17750 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
17760 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
17770 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
17780 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
17790 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
177a0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e 6f  atabase file. No
177b0 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65 0a   calls are made.
177c0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2d 63  ** to the page-c
177d0 61 63 68 65 20 74 6f 20 6d 61 72 6b 20 74 68 65  ache to mark the
177e0 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e   pages as clean.
177f0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
17800 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66 20  nsibility.** of 
17810 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75 73  the caller to us
17820 65 20 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e PcacheCleanAll
17830 28 29 20 6f 72 20 50 63 61 63 68 65 4d 61 6b 65  () or PcacheMake
17840 43 6c 65 61 6e 28 29 20 74 6f 20 6d 61 72 6b 0a  Clean() to mark.
17850 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 73 20  ** the pages as 
17860 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
17870 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
17880 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
17890 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
178a0 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
178b0 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
178c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
178d0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
178e0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
178f0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
17900 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
17910 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
17920 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
17930 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
17940 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
17950 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
17960 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
17970 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
17980 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
17990 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
179a0 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
179b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
179c0 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
179d0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
179e0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
179f0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
17a00 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
17a10 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
17a20 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
17a30 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
17a40 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
17a50 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
17a60 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
17a70 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
17a80 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
17a90 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
17aa0 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
17ab0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
17ac0 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
17ad0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
17ae0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
17af0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
17b00 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
17b10 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
17b20 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
17b30 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
17b40 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
17b50 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
17b60 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
17b70 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
17b80 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
17b90 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
17ba0 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
17bb0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
17bc0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
17bd0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
17be0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
17bf0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
17c00 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
17c10 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
17c20 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
17c30 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
17c40 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
17c50 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
17c60 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
17c70 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
17c80 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
17c90 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
17ca0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17cb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17cc0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
17cd0 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49 66  st ){..    /* If
17ce0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f   the file has no
17cf0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
17d00 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
17d10 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
17d20 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
17d30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
17d40 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
17d50 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
17d60 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
17d70 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67  emp(pPager, pPag
17d80 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
17d90 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  vfsFlags);.     
17da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
17db0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
17dc0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
17dd0 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
17de0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
17df0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
17e00 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
17e10 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
17e20 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
17e30 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
17e40 65 49 6d 61 67 65 28 29 20 77 61 73 20 63 61 6c  eImage() was cal
17e50 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
17e60 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
17e70 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
17e80 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
17e90 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
17ea0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
17eb0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
17ec0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17ed0 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
17ee0 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
17ef0 20 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66   && 0==(pList->f
17f00 6c 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f  lags&PGHDR_DONT_
17f10 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20  WRITE) ){.      
17f20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c  i64 offset = (pL
17f30 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
17f40 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
17f50 7a 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ze;.      char *
17f60 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
17f70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
17f80 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ata, pList->pgno
17f90 2c 20 36 29 3b 0a 0a 20 20 20 20 20 20 50 41 47  , 6);..      PAG
17fa0 45 52 54 52 41 43 45 28 28 22 53 54 4f 52 45 20  ERTRACE(("STORE 
17fb0 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
17fc0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
17fe0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
17ff0 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  ist->pgno, pager
18000 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
18010 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
18020 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c  E(("PGOUT %p %d\
18030 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73  n", pPager, pLis
18040 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  t->pgno));.     
18050 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
18060 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
18070 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
18080 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
18090 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
180a0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
180b0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
180c0 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
180d0 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
180e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
180f0 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
18100 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
18110 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
18120 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
18130 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
18140 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
18150 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18160 4c 69 73 74 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  List->pgno>pPage
18170 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b  r->dbFileSize ){
18180 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18190 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 4c  >dbFileSize = pL
181a0 69 73 74 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  ist->pgno;.     
181b0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
181c0 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
181d0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
181e0 43 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE(("NOSTORE %d 
181f0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
18200 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
18210 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  st->pgno));.    
18220 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
18230 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
18240 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
18250 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
18260 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
18270 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
18280 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
18290 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
182a0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20  ->pDirty;.  }.. 
182b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
182c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
182d0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
182e0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 74 20  sub-journal. It 
182f0 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
18300 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f  esponsibility to
18310 0a 2a 2a 20 75 73 65 20 73 75 62 6a 52 65 71 75  .** use subjRequ
18320 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63 68  iresPage() to ch
18330 65 63 6b 20 74 68 61 74 20 69 74 20 69 73 20 72  eck that it is r
18340 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62  eally required b
18350 65 66 6f 72 65 20 0a 2a 2a 20 63 61 6c 6c 69 6e  efore .** callin
18360 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
18370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18380 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67  ubjournalPage(Pg
18390 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74  Hdr *pPg){.  int
183a0 20 72 63 3b 0a 20 20 76 6f 69 64 20 2a 70 44 61   rc;.  void *pDa
183b0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
183c0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
183d0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
183e0 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 70    i64 offset = p
183f0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2a  Pager->stmtNRec*
18400 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
18410 69 7a 65 29 3b 0a 20 20 63 68 61 72 20 2a 70 44  ize);.  char *pD
18420 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
18430 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
18440 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 0a 20 20 50  ->pgno, 7);..  P
18450 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54  AGERTRACE(("STMT
18460 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
18470 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18480 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
18490 6e 6f 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  no));..  assert(
184a0 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
184b0 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
184c0 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
184d0 69 7a 65 20 29 3b 0a 20 20 72 63 20 3d 20 77 72  ize );.  rc = wr
184e0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
184f0 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
18500 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg->pgno);.  if
18510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18520 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18530 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
18540 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
18550 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18560 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
18570 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
18580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
18590 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
185a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
185b0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e  ger->nSavepoint>
185c0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64  0 );.    rc = ad
185d0 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
185e0 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
185f0 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  >pgno);.  }.  re
18600 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
18610 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18620 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
18630 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77  e pcache layer w
18640 68 65 6e 20 69 74 20 68 61 73 20 72 65 61 63 68  hen it has reach
18650 65 64 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20  ed some.** soft 
18660 6d 65 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68  memory limit. Th
18670 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  e argument is a 
18680 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72  pointer to a pur
18690 67 65 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a  geable Pager .**
186a0 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75   object. This fu
186b0 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
186c0 74 6f 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65  to make a single
186d0 20 64 69 72 74 79 20 70 61 67 65 20 74 68 61 74   dirty page that
186e0 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74   has no.** outst
186f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
18700 73 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73  s (if one exists
18710 29 20 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20  ) clean so that 
18720 69 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c  it can be recycl
18730 65 64 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63  ed .** by the pc
18740 61 63 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  ache layer..*/.s
18750 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
18760 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
18770 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
18780 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
18790 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
187a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
187b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
187c0 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20  oNotSync ){.    
187d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
187e0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
187f0 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
18800 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28  R_DIRTY );.  if(
18810 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
18820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18830 20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67     if( pPg->flag
18840 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
18850 43 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  C ){.      rc = 
18860 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
18870 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
18880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18890 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
188a0 20 26 26 20 0a 20 20 20 20 20 20 20 20 21 28 70   && .        !(p
188b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
188c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
188d0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26  LMODE_MEMORY) &&
188e0 0a 20 20 20 20 20 20 20 20 21 28 73 71 6c 69 74  .        !(sqlit
188f0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
18900 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
18910 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
18920 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
18930 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
18940 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
18950 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
18960 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
18970 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
18980 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
189a0 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
189b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
189c0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
189d0 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75 62  r->dbSize && sub
189e0 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
189f0 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  g) ){.        rc
18a00 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
18a10 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
18a20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18a40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
18a50 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
18a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18a70 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18a80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18a90 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
18aa0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
18ab0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
18ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
18ad0 41 47 45 52 54 52 41 43 45 28 28 22 53 54 52 45  AGERTRACE(("STRE
18ae0 53 53 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  SS %d page %d\n"
18af0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18b00 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
18b10 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
18b20 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
18b30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18b40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
18b50 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69 73  rn 1 if there is
18b60 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
18b70 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
18b80 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
18b90 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
18ba0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
18bb0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
18bc0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
18bd0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
18be0 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
18bf0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
18c00 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
18c10 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
18c20 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
18c30 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
18c40 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
18c50 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
18c60 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
18c70 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
18c80 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
18c90 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 64  e if unable to d
18ca0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74 61  etermine the sta
18cb0 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tus of the journ
18cc0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  al..**.** This r
18cd0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
18ce0 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
18cf0 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65   file to examine
18d00 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 2e   its.** content.
18d10 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f 75    Hence, the jou
18d20 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
18d30 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  in the name of a
18d40 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
18d50 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61 73  al file that has
18d60 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 61   been deleted, a
18d70 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65 20  nd hence not be 
18d80 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 20  hot.  Or.** the 
18d90 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  header of the jo
18da0 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20 7a  urnal might be z
18db0 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69 73  eroed out.  This
18dc0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73   routine.** does
18dd0 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74 68   not discover th
18de0 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20 6e  ese cases of a n
18df0 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 2d  on-hot journal -
18e00 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   if the.** journ
18e10 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
18e20 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 20  nd is not empty 
18e30 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73 73  this routine ass
18e40 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68 6f  umes it.** is ho
18e50 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70 6c  t.  The pager_pl
18e60 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
18e70 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20 74   will discover t
18e80 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  hat the.** journ
18e90 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72  al file is not r
18ea0 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77 69  eally hot and wi
18eb0 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ll no-op..*/.sta
18ec0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
18ed0 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
18ee0 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74  ger, int *pExist
18ef0 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
18f00 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
18f10 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
18f20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18f30 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30 3b 0a  int exists = 0;.
18f40 20 20 69 6e 74 20 6c 6f 63 6b 65 64 20 3d 20 30    int locked = 0
18f50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18f60 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
18f70 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
18f80 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
18f90 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
18fa0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 2a 70 45  Methods );.  *pE
18fb0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20  xists = 0;.  rc 
18fc0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
18fd0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
18fe0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
18ff0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
19000 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20  &exists);.  if( 
19010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19020 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 72   exists ){.    r
19030 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
19040 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
19050 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
19060 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ed);.  }.  if( r
19070 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19080 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63 6b 65  exists && !locke
19090 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61  d ){.    int nPa
190a0 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ge;.    rc = sql
190b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
190c0 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
190d0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
190e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
190f0 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
19100 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19110 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
19120 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19130 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
19140 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 78 69  e{.        *pExi
19150 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  sts = 1;.      }
19160 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
19170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19180 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
19190 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
191a0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
191b0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
191c0 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
191d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
191e0 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
191f0 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
19200 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a  ;.  i64 offset;.
19210 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
19220 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  =0 );.  assert(p
19230 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
19240 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
19250 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
19260 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
19270 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
19280 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
19290 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
192a0 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
192b0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
192c0 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
192d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
192e0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
192f0 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
19300 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
19310 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
19320 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
19330 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
19340 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
19350 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
19360 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
19370 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
19380 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  ));.  if( pgno==
19390 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
193a0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
193b0 65 72 73 2c 20 26 28 28 75 38 2a 29 70 50 67 2d  ers, &((u8*)pPg-
193c0 3e 70 44 61 74 61 29 5b 32 34 5d 2c 0a 20 20 20  >pData)[24],.   
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
19400 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
19410 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
19420 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
19430 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
19440 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54  no, 3);.  PAGERT
19450 52 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20  RACE(("FETCH %d 
19460 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
19470 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
19480 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
19490 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
194a0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
194b0 28 70 50 67 29 29 29 3b 0a 20 20 72 65 74 75 72  (pPg)));.  retur
194c0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
194d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
194e0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
194f0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
19500 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
19510 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
19520 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
19530 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
19540 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
19550 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
19560 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
19570 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
19580 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
19590 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
195a0 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
195b0 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
195c0 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
195d0 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
195e0 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
195f0 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
19600 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
19610 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
19620 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
19630 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
19640 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
19650 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
19660 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
19670 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19680 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73    int isErrorRes
19690 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  et = 0;..  /* If
196a0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
196b0 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63  s opened for exc
196c0 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68  lusive access, h
196d0 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  as no outstandin
196e0 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66  g .  ** page ref
196f0 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69  erences and is i
19700 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65  n an error-state
19710 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61  , now is the cha
19720 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a  nce to clear.  *
19730 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73  * the error. Dis
19740 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
19750 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63  s of the pager-c
19760 61 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61  ache and treat a
19770 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75  ny.  ** open jou
19780 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68  rnal file as a h
19790 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  ot-journal..  */
197a0 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
197b0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
197c0 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 73 71  veMode .   && sq
197d0 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
197e0 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
197f0 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65  che)==0 && pPage
19800 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20 29 7b  r->errCode .  ){
19810 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19820 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
19830 20 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73        isErrorRes
19840 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  et = 1;.    }.  
19850 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
19860 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
19870 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
19880 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
19890 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
198a0 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72  s still in an er
198b0 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f  ror state, do no
198c0 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65  t proceed. The e
198d0 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65  rror .  ** state
198e0 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64   will be cleared
198f0 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   at some point i
19900 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65  n the future whe
19910 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a  n all page .  **
19920 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20   references are 
19930 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20  dropped and the 
19940 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
19950 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  carded..  */.  i
19960 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19970 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
19980 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
19990 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
199a0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
199b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
199c0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
199d0 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72  R_UNLOCK || isEr
199e0 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  rorReset ){.    
199f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
19a00 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
19a10 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a  ;.    int isHotJ
19a20 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
19a30 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
19a40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
19a50 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
19a60 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
19a70 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69  che)==0 );.    i
19a80 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65  f( !pPager->noRe
19a90 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  adlock ){.      
19aa0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
19ab0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
19ac0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
19ad0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19ae0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19af0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19b00 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
19b10 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  LOCK );.        
19b20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
19b30 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
19b40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
19b50 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
19b60 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19b70 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
19b80 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
19b90 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
19ba0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19bb0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
19bc0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  _LOCK );..    /*
19bd0 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
19be0 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
19bf0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
19c00 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
19c10 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
19c20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
19c30 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
19c40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
19c50 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
19c60 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
19c70 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72  Reset ){.      r
19c80 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  c = hasHotJourna
19c90 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74  l(pPager, &isHot
19ca0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
19cb0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19cc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
19cd0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
19ce0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19cf0 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20  isErrorReset || 
19d00 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  isHotJournal ){.
19d10 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
19d20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
19d30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19d40 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
19d50 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a  nt it is.      *
19d60 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
19d70 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
19d80 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
19d90 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
19da0 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  he.      ** EXCL
19db0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
19dc0 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
19dd0 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
19de0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  en the.      ** 
19df0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
19e00 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
19e10 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
19e20 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
19e30 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
19e40 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
19e50 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
19e60 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
19e70 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 2a  ling it .      *
19e80 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a  * back..      **
19e90 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75   .      ** Becau
19ea0 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69  se the intermedi
19eb0 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  ate RESERVED loc
19ec0 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74  k is not request
19ed0 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ed, the.      **
19ee0 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20   second process 
19ef0 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73  will get to this
19f00 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f   point in the co
19f10 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20  de and fail to. 
19f20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
19f30 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
19f40 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19f50 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
19f60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
19f70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
19f80 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
19f90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19fa0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
19fb0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
19fc0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
19fd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
19ff0 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
1a000 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1a010 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1a020 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
1a030 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1a040 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
1a050 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
1a060 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
1a070 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
1a080 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
1a090 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1a0a0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
1a0b0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1a0c0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
1a0d0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
1a0e0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
1a0f0 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
1a100 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
1a110 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
1a120 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
1a130 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
1a140 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
1a150 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
1a160 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
1a170 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
1a180 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
1a190 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
1a1a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1a1b0 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
1a1c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1a1d0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20  nalOpen==0 ){.  
1a1e0 20 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20        int res;. 
1a1f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a200 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
1a210 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  ,pPager->zJourna
1a220 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  l,SQLITE_ACCESS_
1a230 45 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20  EXISTS,&res);.  
1a240 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a250 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a260 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a       if( res ){.
1a270 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1a280 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fout = 0;.      
1a290 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51        int f = SQ
1a2a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1a2b0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
1a2c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20  MAIN_JOURNAL;.  
1a2d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1a2e0 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
1a2f0 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
1a300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a310 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1a320 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
1a330 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66  ager->jfd, f, &f
1a340 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  out);.          
1a350 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1a360 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1a370 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
1a380 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
1a390 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a3a0 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45  K && fout&SQLITE
1a3b0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29  _OPEN_READONLY )
1a3c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1a3d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54  rc = SQLITE_CANT
1a3e0 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  OPEN;.          
1a3f0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
1a400 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
1a410 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1a420 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1a440 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
1a450 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1a460 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74  at means some ot
1a470 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
1a480 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
1a490 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74  lready rolled it
1a4a0 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   back */.       
1a4b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1a4c0 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
1a4d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1a4e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a4f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a500 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1a510 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
1a520 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1a530 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
1a540 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a550 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1a560 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1a570 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
1a580 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
1a590 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ter = 0;.      p
1a5a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1a5b0 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f  r = 0;. .      /
1a5c0 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
1a5d0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1a5e0 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
1a5f0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
1a600 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
1a610 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
1a620 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20 74 68 65   lock. Purge the
1a630 20 63 61 63 68 65 20 62 65 66 6f 72 65 0a 20 20   cache before.  
1a640 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62      ** playing b
1a650 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72  ack the hot-jour
1a660 6e 61 6c 20 73 6f 20 74 68 61 74 20 77 65 20 64  nal so that we d
1a670 6f 6e 27 74 20 65 6e 64 20 75 70 20 77 69 74 68  on't end up with
1a680 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63  .      ** an inc
1a690 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
1a6a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1a6b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65  sqlite3PcacheCle
1a6c0 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ar(pPager->pPCac
1a6d0 68 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  he);.      rc = 
1a6e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1a6f0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
1a700 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a710 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
1a720 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
1a730 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
1a740 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
1a750 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1a760 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
1a770 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1a780 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
1a790 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
1a7a0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
1a7b0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
1a7c0 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
1a7d0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
1a7e0 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
1a7f0 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
1a800 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
1a810 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
1a820 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
1a830 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
1a840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1a850 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
1a860 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
1a870 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1a880 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
1a890 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
1a8a0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
1a8b0 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
1a8c0 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
1a8d0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
1a8e0 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1a8f0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
1a900 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
1a910 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
1a920 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
1a930 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
1a940 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
1a950 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
1a960 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
1a970 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
1a980 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
1a990 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
1a9a0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
1a9b0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
1a9c0 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
1a9d0 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
1a9e0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
1a9f0 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
1aa00 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
1aa10 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
1aa20 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
1aa30 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
1aa40 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
1aa50 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
1aa60 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
1aa70 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
1aa80 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
1aa90 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
1aaa0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
1aab0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
1aac0 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
1aad0 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
1aae0 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
1aaf0 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
1ab00 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
1ab10 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
1ab20 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
1ab30 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
1ab40 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1ab50 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
1ab60 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ab70 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a  nt(pPager, 0);..
1ab80 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1ab90 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1aba0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
1abb0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
1abc0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
1abd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
1abe0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1abf0 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
1ac00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ac10 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
1ac20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
1ac30 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
1ac40 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
1ac50 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
1ac60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ac70 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1ac80 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
1ac90 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
1aca0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
1acb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1acc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1acd0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1ace0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1acf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1ad00 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
1ad10 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
1ad20 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
1ad30 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
1ad40 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
1ad50 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
1ad60 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1ad70 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
1ad80 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1ad90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1ada0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1adb0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
1adc0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
1add0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1ade0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a  _SHARED );.  }..
1adf0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
1ae00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ae10 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
1ae20 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1ae30 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
1ae40 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
1ae50 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
1ae60 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1ae70 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1ae80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ae90 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
1aea0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
1aeb0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
1aec0 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
1aed0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
1aee0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1aef0 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
1af00 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
1af10 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
1af20 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
1af30 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
1af40 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
1af50 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
1af60 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
1af70 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
1af80 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
1af90 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
1afa0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
1afb0 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
1afc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1afd0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1afe0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1aff0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1b000 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 20 29  GHDR_NEED_READ )
1b010 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72  {.    int rc = r
1b020 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e 70  eadDbPage(pPg->p
1b030 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67 2d  Pager, pPg, pPg-
1b040 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20  >pgno);.    if( 
1b050 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b060 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1b070 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44  s &= ~PGHDR_NEED
1b080 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73 65  _READ;.    }else
1b090 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1b0a0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  c;.    }.  }.  r
1b0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
1b0d0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1b0e0 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65 72   has reached zer
1b0f0 6f 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  o, and the pager
1b100 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a   is not in the.*
1b110 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 77 72  * middle of a wr
1b120 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1b130 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20 65 78 63  or opened in exc
1b140 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 75 6e 6c  lusive mode, unl
1b150 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74 61 74  ock it..*/ .stat
1b160 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
1b170 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67 65  ockIfUnused(Page
1b180 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
1b190 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  ( (sqlite3Pcache
1b1a0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
1b1b0 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20 20  >pPCache)==0).  
1b1c0 20 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65    && (!pPager->e
1b1d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
1b1e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b1f0 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  ff>0) .  ){.    
1b200 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1b210 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1b220 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72 6f    }.}../*.** Dro
1b230 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  p a page from th
1b240 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 73 71  e cache using sq
1b250 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
1b260 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  )..**.** If this
1b270 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
1b280 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77 69   now no pages wi
1b290 74 68 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  th references to
1b2a0 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61 63   them, a rollbac
1b2b0 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64 20  k.** occurs and 
1b2c0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
1b2d0 64 61 74 61 62 61 73 65 20 69 73 20 72 65 6d 6f  database is remo
1b2e0 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ved..*/.static v
1b2f0 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50 61 67  oid pagerDropPag
1b300 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1b310 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1b320 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b330 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
1b340 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72  op(pPg);.  pager
1b350 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
1b360 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
1b370 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
1b380 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
1b390 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
1b3a0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
1b3b0 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
1b3c0 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
1b3d0 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
1b3e0 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
1b3f0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
1b400 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
1b410 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b420 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
1b430 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
1b440 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
1b450 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
1b460 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
1b470 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1b480 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
1b490 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
1b4a0 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
1b4b0 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
1b4c0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
1b4d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
1b4e0 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
1b4f0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
1b500 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
1b510 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
1b520 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
1b530 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
1b540 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
1b550 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
1b560 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
1b570 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
1b580 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
1b590 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
1b5a0 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
1b5b0 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
1b5c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1b5d0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1b5e0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
1b5f0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50  ee also sqlite3P
1b600 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42  agerLookup().  B
1b610 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oth this routine
1b620 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74   and Lookup() at
1b630 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64  tempt.** to find
1b640 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69   a page in the i
1b650 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66  n-memory cache f
1b660 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61  irst.  If the pa
1b670 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
1b680 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  y.** in memory, 
1b690 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65  this routine goe
1b6a0 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61  s to disk to rea
1b6b0 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20  d it in whereas 
1b6c0 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  Lookup().** just
1b6d0 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
1b6e0 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
1b6f0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
1b700 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
1b710 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
1b720 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
1b730 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
1b740 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
1b750 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
1b760 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65  ince Lookup() ne
1b770 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
1b780 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
1b790 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
1b7a0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
1b7b0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
1b7c0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c  noContent is fal
1b7d0 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e  se, the page con
1b7e0 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c  tents are actual
1b7f0 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ly read from dis
1b800 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  k..** If noConte
1b810 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
1b820 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
1b830 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
1b840 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
1b850 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
1b860 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e  is time, so do n
1b870 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61  ot do a disk rea
1b880 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  d.  Just fill in
1b890 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1b8a0 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e  tent with zeros.
1b8b0 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66    But mark the f
1b8c0 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65  act that we have
1b8d0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a   not read the.**
1b8e0 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74   content by sett
1b8f0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1b900 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61  edRead flag.  La
1b910 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73  ter on, if .** s
1b920 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1b930 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
1b940 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20  this page or if 
1b950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
1b960 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20  ** called again 
1b970 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1b980 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  0, that means th
1b990 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69  at the content i
1b9a0 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20  s needed.** and 
1b9b0 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68  the disk read sh
1b9c0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
1b9d0 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
1b9e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
1b9f0 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70  uire(.  Pager *p
1ba00 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54  Pager,      /* T
1ba10 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e  he pager open on
1ba20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ba30 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
1ba40 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  o,          /* P
1ba50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65  age number to fe
1ba60 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  tch */.  DbPage 
1ba70 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
1ba80 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20  Write a pointer 
1ba90 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65  to the page here
1baa0 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
1bab0 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ent       /* Do 
1bac0 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69  not bother readi
1bad0 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ng content from 
1bae0 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a  disk if true */.
1baf0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1bb00 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  = 0;.  int rc;..
1bb10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bb20 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
1bb30 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c 7c  NLOCK .       ||
1bb40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
1bb50 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
1bb60 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20 20  PCache)>0 .     
1bb70 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20 29    || pgno==1.  )
1bb80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  ;..  /* The maxi
1bb90 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20  mum page number 
1bba0 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20  is 2^31. Return 
1bbb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
1bbc0 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75  f a page.  ** nu
1bbd0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1bbe0 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c  n this, or zero,
1bbf0 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
1bc00 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50   */.  if( pgno>P
1bc10 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c  AGER_MAX_PGNO ||
1bc20 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
1bc30 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
1bc40 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
1bc50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1bc60 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1bc70 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
1bc80 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
1bc90 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
1bca0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
1bcb0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1bcc0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
1bcd0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1bce0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1bcf0 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67  accessed, then g
1bd00 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  et a SHARED lock
1bd10 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74  .  ** on the dat
1bd20 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65  abase file. page
1bd30 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73  rSharedLock() is
1bd40 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a   a no-op if .  *
1bd50 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63  * a database loc
1bd60 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c  k is already hel
1bd70 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  d..  */.  rc = p
1bd80 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
1bd90 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
1bda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1bdb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1bdc0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1bdd0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1bde0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72 63  _UNLOCK );..  rc
1bdf0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1be00 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
1be10 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c 20  Cache, pgno, 1, 
1be20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 21  &pPg);.  if( rc!
1be30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1be40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1be50 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61 67  .  if( pPg->pPag
1be60 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  er==0 ){.    /* 
1be70 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  The pager cache 
1be80 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e 65  has created a ne
1be90 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e 74  w page. Its cont
1bea0 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20 20  ent needs to .  
1beb0 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c 69    ** be initiali
1bec0 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  zed..    */.    
1bed0 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50 41  int nMax;.    PA
1bee0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1bef0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50 67  >nMiss);.    pPg
1bf00 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
1bf10 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  r;.    memset(pP
1bf20 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70 50  g->pExtra, 0, pP
1bf30 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 0a  ager->nExtra);..
1bf40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bf50 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1bf60 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a 20  Pager, &nMax);. 
1bf70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bf80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1bf90 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1bfa0 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pPg);.      retu
1bfb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1bfc0 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
1bfd0 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
1bfe0 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
1bff0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1c000 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1c010 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1c020 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1c030 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1c040 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1c050 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
1c060 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70  pPg->pData, 0, p
1c070 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c080 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 6f  ;.      if( noCo
1c090 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ntent ){.       
1c0a0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1c0b0 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
1c0c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
1c0d0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
1c0e0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1c0f0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1c100 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1c110 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
1c120 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
1c130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c140 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1c150 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1c160 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  AD ){.        /*
1c170 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1c180 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20 20 20  ef(pPg); */.    
1c190 20 20 20 20 70 61 67 65 72 44 72 6f 70 50 61 67      pagerDropPag
1c1a0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1c1b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c1c0 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
1c1d0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1c1e0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
1c1f0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1c200 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1c210 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1c220 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1c230 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
1c240 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1c250 20 20 20 61 73 73 65 72 74 28 73 71 6c 69 74 65     assert(sqlite
1c260 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
1c270 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1c280 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a  >0 || pgno==1);.
1c290 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1c2a0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
1c2b0 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74    if( !noContent
1c2c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c2d0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1c2e0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
1c2f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73   rc ){.        s
1c300 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1c310 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
1c320 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c330 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  }.    }.  }..  *
1c340 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20  ppPage = pPg;.  
1c350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c360 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
1c370 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
1c380 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1c390 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1c3a0 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
1c3b0 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
1c3c0 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
1c3d0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1c3e0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
1c3f0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1c400 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
1c410 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1c420 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
1c430 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1c440 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
1c450 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
1c460 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
1c470 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
1c480 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
1c490 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
1c4a0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
1c4b0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1c4c0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
1c4d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1c4e0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
1c4f0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1c500 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
1c510 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
1c520 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
1c530 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
1c540 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1c550 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1c560 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1c570 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
1c580 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1c590 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1c5a0 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28  gno!=0 );..  if(
1c5b0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21   (pPager->state!
1c5c0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a 20  =PAGER_UNLOCK). 
1c5d0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65 72    && (pPager->er
1c5e0 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
1c5f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
1c600 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
1c610 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
1c620 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
1c630 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
1c640 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20  gno, 0, &pPg);. 
1c650 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 67   }..  return pPg
1c660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
1c670 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
1c680 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
1c690 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1c6a0 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
1c6b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
1c6c0 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
1c6d0 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
1c6e0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
1c6f0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
1c700 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
1c710 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
1c720 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
1c730 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1c740 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
1c750 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c760 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
1c770 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  ge *pPg){.  if( 
1c780 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72  pPg ){.    Pager
1c790 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1c7a0 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69  pPager;.    sqli
1c7b0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
1c7c0 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72  (pPg);.    pager
1c7d0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
1c7e0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
1c7f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c800 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1c810 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
1c820 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1c830 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75 72  en opened, ensur
1c840 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73 75  e that the.** su
1c850 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b-journal file i
1c860 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20 74  s open too. If t
1c870 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1c880 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a 20  is not open,.** 
1c890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c8a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1c8b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c8c0 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74 68  urned if everyth
1c8d0 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64 69  ing goes accordi
1c8e0 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a  ng to plan. An .
1c8f0 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ** SQLITE_IOERR_
1c900 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
1c910 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1c920 65 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71  e call to .** sq
1c930 6c 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61  lite3OsOpen() fa
1c940 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ils..*/.static i
1c950 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61  nt openSubJourna
1c960 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1c970 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1c980 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
1c990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c9a0 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 6a  n && !pPager->sj
1c9b0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1c9c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1c9d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
1c9e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1c9f0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
1ca00 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1ca10 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1ca20 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
1ca30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ca40 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
1ca50 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
1ca60 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  jfd, SQLITE_OPEN
1ca70 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  _SUBJOURNAL);.  
1ca80 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ca90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
1caa0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
1cab0 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
1cac0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
1cad0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
1cae0 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
1caf0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1cb00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
1cb10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1cb20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
1cb30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1cb40 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
1cb50 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
1cb60 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
1cb70 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
1cb80 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
1cb90 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
1cba0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1cbb0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
1cbc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1cbd0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1cbe0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
1cbf0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
1cc00 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
1cc10 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
1cc20 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
1cc30 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1cc40 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
1cc50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1cc60 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1cc70 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
1cc80 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
1cc90 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
1cca0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1ccb0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
1ccc0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1ccd0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nt(pPager, 0);. 
1cce0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1ccf0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
1cd00 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
1cd10 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28  ->dbSize);.  if(
1cd20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1cd30 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
1cd40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1cd50 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
1cd60 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
1cd70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1cd80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1cd90 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
1cda0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1cdb0 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
1cdc0 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
1cdd0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
1cde0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1cdf0 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73  URNAL);.    }els
1ce00 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  e{.      flags |
1ce10 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
1ce20 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
1ce30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
1ce40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1ce50 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1ce60 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
1ce70 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75     sqlite3MemJou
1ce80 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d  rnalOpen(pPager-
1ce90 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 72 63 20  >jfd);.      rc 
1cea0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1ceb0 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
1cec0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
1ced0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
1cee0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
1cef0 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
1cf00 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
1cf10 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
1cf20 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
1cf30 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
1cf40 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23  ager).      );.#
1cf50 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
1cf60 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
1cf70 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
1cf80 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
1cf90 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
1cfa0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61  ndif.    }.    a
1cfb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
1cfc0 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
1cfd0 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b  jfd->pMethods );
1cfe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1cff0 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
1d000 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
1d010 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  er = 0;.    pPag
1d020 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
1d030 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   0;.    if( rc!=
1d040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d050 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1d060 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
1d070 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1d080 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
1d090 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
1d0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
1d0b0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1d0c0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a  _journal;.    }.
1d0d0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
1d0e0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
1d0f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d100 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
1d110 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1d120 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1d130 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
1d140 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1d150 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
1d160 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
1d170 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1d180 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1d190 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
1d1a0 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  gSize = pPager->
1d1b0 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
1d1c0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1d1d0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
1d1e0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1d1f0 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  nt && rc==SQLITE
1d200 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1d210 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70  openSubJournal(p
1d220 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
1d230 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d240 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
1d250 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c 49 54  MEM && rc!=SQLIT
1d260 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
1d270 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d280 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1d290 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
1d2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2b0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d2c0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1d2d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d2e0 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
1d2f0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
1d300 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
1d310 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
1d320 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
1d330 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
1d340 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1d350 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1d360 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
1d370 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1d380 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f  The lock is remo
1d390 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ved when.** the 
1d3a0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1d3b0 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a  wing happen:.**.
1d3c0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1d3d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1d3e0 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  wo() is called..
1d3f0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1d400 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69  agerRollback() i
1d410 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1d420 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
1d430 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
1d440 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
1d450 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1d460 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
1d470 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
1d480 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
1d490 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
1d4a0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
1d4b0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d4c0 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
1d4d0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1d4e0 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
1d4f0 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
1d500 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
1d510 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
1d520 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
1d530 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
1d540 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
1d550 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
1d560 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
1d570 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
1d580 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1d590 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
1d5a0 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
1d5b0 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
1d5c0 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
1d5d0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
1d5e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1d5f0 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
1d600 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
1d610 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
1d620 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
1d630 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
1d640 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
1d650 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
1d660 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
1d670 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
1d680 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
1d690 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1d6a0 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
1d6b0 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
1d6c0 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
1d6d0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
1d6e0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
1d6f0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
1d700 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
1d710 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
1d720 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1d730 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
1d740 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
1d750 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
1d760 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1d770 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
1d780 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
1d790 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
1d7a0 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
1d7b0 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
1d7c0 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
1d7d0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
1d7e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
1d7f0 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
1d800 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1d810 72 42 65 67 69 6e 28 44 62 50 61 67 65 20 2a 70  rBegin(DbPage *p
1d820 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  Pg, int exFlag){
1d830 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1d840 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1d850 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d860 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
1d870 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
1d880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d890 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
1d8a0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
1d8b0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1d8c0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
1d8d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d8e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1d8f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
1d900 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  EMDB );.    rc =
1d910 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1d920 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1d930 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  VED_LOCK);.    i
1d940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d950 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1d960 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1d970 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
1d980 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
1d990 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d9a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1d9b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1d9c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
1d9d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1d9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d9f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1da00 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1da10 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
1da20 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1da30 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
1da40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1da50 67 65 72 29 29 29 3b 0a 20 20 20 20 69 66 28 20  ger)));.    if( 
1da60 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1da70 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  al && !pPager->t
1da80 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20  empFile.        
1da90 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
1daa0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1dab0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
1dac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1dad0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1dae0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
1daf0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
1db00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1db10 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1db20 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
1db30 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73   /* This happens
1db40 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
1db50 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  was in exclusive
1db60 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
1db70 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d   last.    ** tim
1db80 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69  e a (read or wri
1db90 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  te) transaction 
1dba0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1dbb0 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a   concluded.    *
1dbc0 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63  * by this connec
1dbd0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66  tion. Instead of
1dbe0 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f   deleting the jo
1dbf0 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61  urnal file it wa
1dc00 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f  s .    ** kept o
1dc10 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77  pen and either w
1dc20 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
1dc30 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68  0 bytes or its h
1dc40 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a  eader was.    **
1dc50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74   overwritten wit
1dc60 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
1dc70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1dc80 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
1dc90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1dca0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30  r->dbOrigSize==0
1dcb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1dcc0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1dcd0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  al==0 );.    sql
1dce0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1dcf0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  nt(pPager, 0);. 
1dd00 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
1dd10 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
1dd20 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50 61  itvecCreate( pPa
1dd30 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20  ger->dbSize );. 
1dd40 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1dd50 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  pInJournal ){.  
1dd60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dd70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
1dd80 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1dd90 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61  dbOrigSize = pPa
1dda0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1ddb0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
1ddc0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1ddd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
1dde0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f  ert( !pPager->jo
1ddf0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
1de00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1de10 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
1de20 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  OK );.  return r
1de30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
1de40 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
1de50 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
1de60 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
1de70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1de80 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
1de90 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1dea0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1deb0 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
1dec0 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
1ded0 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
1dee0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1def0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1df00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1df10 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
1df20 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
1df30 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
1df40 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1df50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1df60 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
1df70 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
1df80 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
1df90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1dfa0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
1dfb0 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1dfc0 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
1dfd0 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
1dfe0 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
1dff0 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
1e000 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
1e010 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
1e020 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e030 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1e040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
1e050 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
1e060 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
1e070 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
1e080 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
1e090 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e0a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
1e0b0 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
1e0c0 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
1e0d0 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
1e0e0 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
1e0f0 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
1e100 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
1e110 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
1e120 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
1e130 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
1e140 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1e150 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
1e160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e170 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
1e180 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
1e190 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1e1a0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
1e1b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e1c0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e1d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1e1e0 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
1e1f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
1e200 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
1e210 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1e220 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1e230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
1e240 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
1e250 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
1e260 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
1e270 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1e280 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
1e290 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1e2a0 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77 61   If this page wa
1e2b0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  s previously acq
1e2c0 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1e2d0 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65  tent==1, that me
1e2e0 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e  ans.  ** we didn
1e2f0 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20 69  't really read i
1e300 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
1e310 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
1e320 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a   can happen.  **
1e330 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20 77   (for example) w
1e340 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
1e350 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74  being moved to t
1e360 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42 75  he freelist.  Bu
1e370 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72  t.  ** now we ar
1e380 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76 69  e (perhaps) movi
1e390 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66 20  ng the page off 
1e3a0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
1e3b0 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20 61  for.  ** reuse a
1e3c0 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e  nd we need to kn
1e3d0 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  ow its original 
1e3e0 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74 20  content so that 
1e3f0 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e  content.  ** can
1e400 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
1e410 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1e420 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20 72  al.  So do the r
1e430 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a  ead at this.  **
1e440 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   time..  */.  rc
1e450 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1e460 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28  tent(pPg);.  if(
1e470 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1e480 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
1e490 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1e4a0 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
1e4b0 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
1e4c0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
1e4d0 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
1e4e0 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
1e4f0 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
1e500 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50  .  */.  sqlite3P
1e510 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
1e520 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49  Pg);.  if( pageI
1e530 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26  nJournal(pPg) &&
1e540 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61   !subjRequiresPa
1e550 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70  ge(pPg) ){.    p
1e560 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1e570 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1e580 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
1e590 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
1e5a0 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
1e5b0 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
1e5c0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1e5d0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1e5e0 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
1e5f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1e600 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
1e610 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
1e620 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
1e630 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1e640 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
1e650 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1e660 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
1e670 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
1e680 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
1e690 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
1e6a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e6b0 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1e6c0 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
1e6d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e6e0 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
1e6f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e700 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1e710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1e720 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1e730 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1e740 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1e750 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1e760 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1e770 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20  er->useJournal. 
1e780 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67           && pPag
1e790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
1e7a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1e7b0 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  DE_OFF ){.      
1e7c0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
1e7d0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
1e7e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e7f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1e800 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e810 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1e820 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  he = 1;.    pPag
1e830 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
1e840 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
1e850 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1e860 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
1e870 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
1e880 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
1e890 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1e8a0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
1e8b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1e8c0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
1e8d0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
1e8e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1e8f0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
1e900 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
1e910 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
1e920 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
1e930 61 6c 28 70 50 67 29 20 26 26 20 70 50 61 67 65  al(pPg) && pPage
1e940 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1e950 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  {.      if( pPg-
1e960 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
1e970 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
1e980 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
1e990 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1e9a0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
1e9b0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
1e9c0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
1e9d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
1e9e0 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
1e9f0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1ea00 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
1ea10 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1ea20 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
1ea30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
1ea40 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
1ea50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ea60 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
1ea70 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1ea80 29 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61  );.        pData
1ea90 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1eaa0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1eab0 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1eac0 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63   cksum = pager_c
1ead0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38  ksum(pPager, (u8
1eae0 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20  *)pData2);.     
1eaf0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
1eb00 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
1eb10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1eb20 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
1eb30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1eb40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1eb50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1eb60 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1eb70 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
1eb80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1eb90 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ebc0 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20  Off + 4);.      
1ebd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1ebe0 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
1ebf0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20  ->pageSize+4;.  
1ec00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ec10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ec20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ec30 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
1ec40 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
1ec50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1ec60 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20   cksum);.       
1ec70 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1ec80 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
1ec90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
1eca0 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1ecb0 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1ecc0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1ecd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ece0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1ecf0 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e  nalOff, pPager->
1ed00 70 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20  pageSize));.    
1ed10 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1ed20 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
1ed30 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  tej_count);.    
1ed40 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1ed50 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1ed60 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
1ed70 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1ed90 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1eda0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20  ->pgno, .       
1edb0 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61        ((pPg->fla
1edc0 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
1edd0 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f  NC)?1:0), pager_
1ede0 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b  pagehash(pPg)));
1edf0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65  ..        /* Eve
1ee00 6e 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69  n if an IO or di
1ee10 73 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63  skfull error occ
1ee20 75 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72  urred while jour
1ee30 6e 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20  nalling the.    
1ee40 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
1ee50 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20  he block above, 
1ee60 73 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e  set the need-syn
1ee70 63 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70  c flag for the p
1ee80 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  age..        ** 
1ee90 4f 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20  Otherwise, when 
1eea0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1eeb0 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  is rolled back, 
1eec0 74 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20  the logic in.   
1eed0 20 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b       ** playback
1eee0 5f 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c  _one_page() will
1eef0 20 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20   think that the 
1ef00 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
1ef10 20 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20   restored.      
1ef20 20 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61    ** in the data
1ef30 62 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69  base file. And i
1ef40 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
1ef50 63 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67  curs while doing
1ef60 20 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20   so,.        ** 
1ef70 74 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20  then corruption 
1ef80 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20  may follow..    
1ef90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1efa0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1efb0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
1efc0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1efd0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
1efe0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1eff0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1f000 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1f010 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1f020 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1f030 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1f040 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1f050 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1f060 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1f070 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1f080 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1f090 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1f0a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1f0c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1f0d0 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
1f0e0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
1f0f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f100 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1f110 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
1f120 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
1f130 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
1f140 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
1f150 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f160 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
1f170 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
1f180 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1f190 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
1f1a0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
1f1b0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
1f1c0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
1f1d0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
1f1e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1f1f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f200 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1f210 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
1f220 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
1f230 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f240 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1f250 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1f260 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1f270 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
1f280 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1f290 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
1f2a0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
1f2b0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
1f2c0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1f2d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
1f2e0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1f2f0 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
1f300 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1f310 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1f320 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1f330 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1f340 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1f350 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
1f360 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
1f370 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
1f380 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1f390 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1f3a0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1f3b0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1f3c0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1f3d0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1f3e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1f3f0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1f400 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1f410 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1f420 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1f430 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1f440 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1f450 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1f460 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1f470 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1f480 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1f490 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1f4a0 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
1f4b0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
1f4c0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
1f4d0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1f4e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f4f0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1f500 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1f510 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1f520 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1f530 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1f540 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1f550 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
1f560 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1f570 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
1f580 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  gno;.    if( pPa
1f590 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 50 41  ger->dbSize==(PA
1f5a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1f5b0 65 72 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  er)-1) ){.      
1f5c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
1f5d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1f5e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f5f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f600 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20  is used to mark 
1f610 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77  a data-page as w
1f620 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73  ritable. It uses
1f630 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65   .** pager_write
1f640 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75  () to open a jou
1f650 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74  rnal file (if it
1f660 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1f670 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69  open).** and wri
1f680 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61  te the page *pDa
1f690 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ta to the journa
1f6a0 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66  l..**.** The dif
1f6b0 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1f6c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e  this function an
1f6d0 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  d pager_write() 
1f6e0 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
1f6f0 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65  function also de
1f700 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65  als with the spe
1f710 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20  cial case where 
1f720 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a  2 or more pages.
1f730 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67  ** fit on a sing
1f740 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20  le disk sector. 
1f750 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c  In this case all
1f760 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67   co-resident pag
1f770 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20  es.** must have 
1f780 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f790 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f7a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1f7b0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
1f7c0 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61  3PagerWrite(DbPa
1f7d0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1f7e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f7f0 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50  OK;..  PgHdr *pP
1f800 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50  g = pDbPage;.  P
1f810 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1f820 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
1f830 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f  no nPagePerSecto
1f840 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63  r = (pPager->sec
1f850 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e  torSize/pPager->
1f860 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66  pageSize);..  if
1f870 28 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ( nPagePerSector
1f880 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1f890 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1f8a0 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1f8b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1f8c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1f8d0 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f8f0 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1f900 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1f910 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1f920 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f940 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1f950 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1f960 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1f970 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1f980 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
1f990 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
1f9a0 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1f9b0 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
1f9c0 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
1f9d0 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
1f9e0 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
1f9f0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
1fa00 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
1fa10 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
1fa20 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
1fa30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  /.    assert( !M
1fa40 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65  EMDB );.    asse
1fa50 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
1fa60 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
1fa70 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1fa80 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54  c = 1;..    /* T
1fa90 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65  his trick assume
1faa0 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20  s that both the 
1fab0 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65  page-size and se
1fac0 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20  ctor-size are.  
1fad0 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20    ** an integer 
1fae0 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73  power of 2. It s
1faf0 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31  ets variable pg1
1fb00 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69   to the identifi
1fb10 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  er.    ** of the
1fb20 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
1fb30 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
1fb40 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20   located on..   
1fb50 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28   */.    pg1 = ((
1fb60 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e  pPg->pgno-1) & ~
1fb70 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  (nPagePerSector-
1fb80 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71  1)) + 1;..    sq
1fb90 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1fba0 75 6e 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74  unt(pPager, (int
1fbb0 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b   *)&nPageCount);
1fbc0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
1fbd0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
1fbe0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
1fbf0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
1fc00 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
1fc10 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
1fc20 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
1fc30 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1fc40 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
1fc50 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
1fc60 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1fc70 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
1fc80 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1fc90 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
1fca0 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
1fcb0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
1fcc0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
1fcd0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
1fce0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1fcf0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1fd00 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
1fd10 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
1fd20 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
1fd30 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
1fd40 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1fd50 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
1fd60 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
1fd70 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
1fd80 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
1fd90 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1fda0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1fdb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fdc0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1fdd0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1fde0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1fdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fe00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1fe10 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1fe20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1fe30 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47   pPage->flags&PG
1fe40 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b  HDR_NEED_SYNC ){
1fe50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
1fe60 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1fe70 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1fe80 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
1fe90 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nc);.           
1fea0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
1feb0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fec0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1fed0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1fee0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1fef0 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
1ff00 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
1ff10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ff20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
1ff30 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1ff40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1ff50 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1ff60 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1ff70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1ff80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
1ff90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1ffa0 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f   the PGHDR_NEED_
1ffb0 53 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74  SYNC flag is set
1ffc0 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20   for any of the 
1ffd0 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20  nPage pages .   
1ffe0 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20   ** starting at 
1fff0 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65  pg1, then it nee
20000 64 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72  ds to be set for
20010 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65   all of them. Be
20020 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69  cause.    ** wri
20030 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74  ting to any of t
20040 68 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73  hese nPage pages
20050 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20   may damage the 
20060 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20  others, the.    
20070 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
20080 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e  must contain syn
20090 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20  c()ed copies of 
200a0 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20  all of them.    
200b0 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66  ** before any of
200c0 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69   them can be wri
200d0 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20  tten out to the 
200e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
200f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 32 30 30     **.    ** 200
20100 39 2d 30 31 2d 30 37 3a 20 20 54 68 69 73 20 62  9-01-07:  This b
20110 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 70 70  lock of code app
20120 65 61 72 73 20 74 6f 20 62 65 20 61 20 6e 6f 2d  ears to be a no-
20130 6f 70 2e 20 20 49 20 64 6f 20 6e 6f 74 0a 20 20  op.  I do not.  
20140 20 20 2a 2a 20 62 65 6c 69 65 76 65 20 69 74 20    ** believe it 
20150 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  is possible for 
20160 61 6e 79 20 70 61 67 65 20 6f 6e 20 74 68 65 20  any page on the 
20170 73 65 63 74 6f 72 20 74 6f 20 6e 6f 74 20 68 61  sector to not ha
20180 76 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 50 47  ve.    ** the PG
20190 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
201a0 61 67 20 73 65 74 2e 20 20 54 68 65 20 22 70 50  ag set.  The "pP
201b0 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  age->flags |= PG
201c0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 22 0a 20  HDR_NEED_SYNC". 
201d0 20 20 20 2a 2a 20 6c 69 6e 65 20 62 65 6c 6f 77     ** line below
201e0 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 2c 20 49   does nothing, I
201f0 20 74 68 69 6e 6b 2e 20 20 42 75 74 20 69 74 20   think.  But it 
20200 64 6f 65 73 20 6e 6f 20 68 61 72 6d 20 74 6f 20  does no harm to 
20210 6c 65 61 76 65 0a 20 20 20 20 2a 2a 20 74 68 69  leave.    ** thi
20220 73 20 63 6f 64 65 20 69 6e 20 70 6c 61 63 65 20  s code in place 
20230 75 6e 74 69 6c 20 77 65 20 63 61 6e 20 64 65 66  until we can def
20240 69 6e 69 74 69 76 65 6c 79 20 70 72 6f 76 65 20  initively prove 
20250 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
20260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20270 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
20280 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
20290 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
202a0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
202b0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
202c0 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
202d0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
202e0 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
202f0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
20300 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
20310 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
20320 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
20330 74 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20  t( pPage->flags 
20340 26 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  & PGHDR_NEED_SYN
20350 43 20 29 3b 20 2f 2a 20 32 30 30 39 2d 30 31 2d  C ); /* 2009-01-
20360 30 37 20 63 6f 6e 6a 65 63 74 75 72 65 20 2a 2f  07 conjecture */
20370 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
20380 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
20390 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
203a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
203b0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
203c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203d0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
203e0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
203f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
20400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
20410 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
20420 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
20430 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
20440 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20450 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
20460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
20480 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
20490 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
204a0 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
204b0 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
204c0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
204d0 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
204e0 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
204f0 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
20500 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
20510 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
20520 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
20530 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
20540 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
20550 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
20560 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
20570 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
20580 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
20590 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
205a0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
205b0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
205c0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
205d0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
205e0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
205f0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
20600 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
20610 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
20620 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
20630 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
20640 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
20650 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
20660 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
20670 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
20680 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
20690 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
206a0 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
206b0 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
206c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
206d0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
206e0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
206f0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
20700 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
20710 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
20720 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
20730 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
20740 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
20750 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
20760 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
20770 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
20780 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
20790 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
207a0 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
207b0 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
207c0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
207d0 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
207e0 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
207f0 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
20800 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
20810 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
20820 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
20830 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
20840 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
20850 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
20860 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
20870 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
20880 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
20890 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
208a0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
208b0 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
208c0 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
208d0 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
208e0 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
208f0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
20900 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
20910 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
20920 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
20930 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
20940 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
20950 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
20960 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
20970 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
20980 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
20990 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
209a0 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
209b0 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
209c0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
209d0 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
209e0 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
209f0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
20a00 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
20a10 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
20a20 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
20a30 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
20a40 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  Rollback() routi
20a50 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
20a60 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ut because the.*
20a70 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
20a80 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
20a90 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
20aa0 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a  be sure it gets.
20ab0 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ** rolled back i
20ac0 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73  n spite of the s
20ad0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
20ae0 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
20af0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20b00 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
20b10 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
20b20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
20b30 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
20b40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20b50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
20b60 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
20b70 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
20b80 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
20b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
20ba0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
20bb0 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3d 3d  AlwaysRollback==
20bc0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
20bd0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
20be0 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
20bf0 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
20c00 63 6b 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ck = sqlite3Bitv
20c10 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
20c20 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
20c30 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70    if( !pPager->p
20c40 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  AlwaysRollback )
20c50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
20c60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
20c70 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71   }.  }.  rc = sq
20c80 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
20c90 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
20ca0 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e 70 67 6e  llback, pPg->pgn
20cb0 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  o);..  if( rc==S
20cc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 67  QLITE_OK && (pPg
20cd0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
20ce0 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
20cf0 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
20d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20d10 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
20d20 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
20d30 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
20d40 7a 65 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 26 26  ze==pPg->pgno &&
20d50 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
20d60 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
20d70 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
20d80 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
20d90 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
20da0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
20db0 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
20dc0 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
20dd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
20de0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
20df0 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
20e00 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
20e10 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
20e20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
20e30 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
20e40 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
20e50 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
20e60 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
20e70 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
20e80 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
20e90 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
20ea0 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
20eb0 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
20ec0 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
20ed0 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
20ee0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
20ef0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
20f00 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
20f10 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
20f20 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
20f30 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
20f40 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
20f50 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
20f60 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
20f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f80 20 50 41 47 45 52 54 52 41 43 45 28 28 22 44 4f   PAGERTRACE(("DO
20f90 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64  NT_WRITE page %d
20fa0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
20fb0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
20fc0 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 49  ager)));.      I
20fd0 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
20fe0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
20ff0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
21000 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
21010 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
21020 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
21030 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
21040 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
21050 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
21060 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
21070 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
21090 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
210a0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
210b0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
210c0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
210d0 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
210e0 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
210f0 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
21100 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
21110 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
21120 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
21130 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
21140 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
21150 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
21160 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
21170 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65  **.** If we have
21180 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c   not yet actuall
21190 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65  y read the conte
211a0 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  nt of this page 
211b0 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72  (if.** the PgHdr
211c0 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69  .needRead flag i
211d0 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73  s set) then this
211e0 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
211f0 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68   a promise.** th
21200 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72  at we will never
21210 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   need to read th
21220 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69  e page content i
21230 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a  n the future..**
21240 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64   so the needRead
21250 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65   flag can be cle
21260 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69  ared at this poi
21270 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
21280 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
21290 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67  back(DbPage *pPg
212a0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
212b0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
212c0 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
212d0 74 20 72 63 3b 20 29 20 20 2f 2a 20 52 65 74 75  t rc; )  /* Retu
212e0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  rn value from sq
212f0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 29  lite3BitvecSet()
21300 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
21310 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
21320 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
21330 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75  .  /* If the jou
21340 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
21350 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74 57 72   open, or DontWr
21360 69 74 65 28 29 20 68 61 73 20 62 65 65 6e 20 63  ite() has been c
21370 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20 74 68  alled on.  ** th
21380 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57 72 69  is page (DontWri
21390 74 65 28 29 20 73 65 74 73 20 74 68 65 20 61 6c  te() sets the al
213a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
213b0 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20  g), then this.  
213c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
213d0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
213e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
213f0 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c  alOpen==0 .   ||
21400 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
21410 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  st(pPager->pAlwa
21420 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d  ysRollback, pPg-
21430 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67  >pgno).   || pPg
21440 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
21450 62 4f 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20  bOrigSize.  ){. 
21460 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
21470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
21480 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
21490 28 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ( sqlite3BitvecT
214a0 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
214b0 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
214c0 6f 29 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d  o)!=0.   || pPg-
214d0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
214e0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
214f0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
21500 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55  if..  /* If SECU
21510 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73  RE_DELETE is dis
21520 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72  abled, then ther
21530 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  e is no way that
21540 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69   this.  ** routi
21550 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
21560 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77   on a page for w
21570 68 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65  hich sqlite3Page
21580 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a  rDontWrite().  *
21590 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  * has not been p
215a0 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
215b0 20 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65   during the same
215c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
215d0 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72  ** And if DontWr
215e0 69 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f  ite() has previo
215f0 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  usly been called
21600 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
21610 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20    ** conditions 
21620 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a  must be met..  *
21630 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20  *.  ** (Later:) 
21640 20 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74   Not true.  If t
21650 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
21660 6f 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69  orrupted by havi
21670 6e 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a  ng duplicate.  *
21680 2a 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  * pages on the f
21690 72 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72  reelist (ex: cor
216a0 72 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e  rupt9.test) then
216b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
216c0 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
216d0 73 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a  sarily true:.  *
216e0 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21  /.  /* assert( !
216f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
21700 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
21710 20 3c 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72   <= pPager->dbOr
21720 69 67 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20  igSize ); */..  
21730 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21740 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
21750 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
21760 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
21770 44 3b 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65  D;..  /* Failure
21780 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
21790 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
217a0 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
217b0 20 62 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74   benign..  ** It
217c0 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
217d0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
217e0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
217f0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65  o journal a page
21800 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  .  ** that does 
21810 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
21820 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
21830 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
21840 20 74 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a   to test the.  *
21850 2a 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  * case where a m
21860 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
21870 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
21880 74 6f 20 73 65 74 20 61 20 62 69 74 20 69 6e 20  to set a bit in 
21890 61 20 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74  a .  ** bit vect
218a0 6f 72 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  or..  */.  sqlit
218b0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
218c0 6c 6f 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  loc();.  TESTONL
218d0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
218e0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
218f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
21900 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
21910 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
21920 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53  E_NOMEM );.  TES
21930 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
21940 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
21950 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
21960 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61  >pgno);.  testca
21970 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
21980 4f 4d 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65  OMEM );.  sqlite
21990 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
219a0 28 29 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41  ();...  PAGERTRA
219b0 43 45 28 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE(("DONT_ROLLBA
219c0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
219d0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
219e0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
219f0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
21a00 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
21a10 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
21a20 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  no)).}.../*.** T
21a30 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
21a40 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
21a50 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
21a60 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
21a70 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
21a80 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
21a90 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
21aa0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21ab0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
21ac0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
21ad0 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29  r, int isDirect)
21ae0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
21af0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
21b00 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
21b10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21b20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
21b30 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
21b40 54 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  TE.  assert( isD
21b50 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  irect==0 );  /* 
21b60 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79  isDirect is only
21b70 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63   true for atomic
21b80 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69   writes */.#endi
21b90 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  f.  if( !pPager-
21ba0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
21bb0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
21bc0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  ze>0 ){.    /* O
21bd0 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
21be0 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
21bf0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
21c00 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
21c10 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
21c20 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
21c30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21c40 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
21c50 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
21c60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21c70 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
21c80 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
21c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21ca0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
21cb0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
21cc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21cd0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
21ce0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
21cf0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
21d00 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
21d10 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
21d20 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
21d30 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
21d40 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
21d50 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
21d60 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
21d70 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
21d80 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
21d90 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
21da0 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
21db0 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66  ounter);..#ifdef
21dc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
21dd0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
21de0 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20  if( isDirect && 
21df0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
21e00 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  hods ){.      co
21e10 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
21e20 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
21e30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21e40 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
21e50 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
21e60 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
21e70 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
21e80 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21e90 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ze, 0);.    }.#e
21ea0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c  ndif..    /* Rel
21eb0 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
21ec0 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
21ed0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21ee0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
21ef0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
21f00 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
21f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21f20 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
21f30 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
21f40 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
21f50 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
21f60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21f70 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   rc;.  if( MEMDB
21f80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
21f90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
21fa0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21fb0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
21fc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
21fd0 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
21fe0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21ff0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
22000 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
22010 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
22020 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
22030 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
22040 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
22050 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
22060 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
22070 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
22080 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
22090 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
220a0 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
220b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
220c0 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
220d0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
220e0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
220f0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
22100 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
22110 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
22120 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
22130 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
22140 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
22150 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22170 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
22180 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
22190 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
221a0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
221b0 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
221c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
221d0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
221e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
221f0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
22200 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
22210 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
22220 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
22230 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
22240 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
22250 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
22260 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
22270 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
22280 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
22290 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
222a0 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
222b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
222c0 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
222d0 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
222e0 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
222f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
22300 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
22310 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
22320 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
22330 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
22340 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
22350 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
22360 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
22370 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
22380 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
22390 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
223a0 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73  *pPager, .  cons
223b0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
223c0 20 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29   .  int noSync.)
223d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
223e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
223f0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
22400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
22410 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22420 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68  }..  /* If no ch
22430 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
22440 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61  made, we can lea
22450 76 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ve the transacti
22460 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20  on early..  */. 
22470 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
22480 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20  odified==0 &&.  
22490 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a        (pPager->j
224a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
224b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
224c0 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20  LETE ||.        
224d0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
224e0 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20  iveMode!=0) ){. 
224f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22500 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
22510 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
22520 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
22530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22540 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
22550 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
22560 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
22570 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
22580 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
22590 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
225a0 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
225b0 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f  ->dbSize));..  /
225c0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
225d0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
225e0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
225f0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
22600 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
22610 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
22620 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
22630 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
22640 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22650 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
22660 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
22670 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
22680 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
22690 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20  r *pPg;..#ifdef 
226a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
226b0 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f  OMIC_WRITE.    /
226c0 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  * The atomic-wri
226d0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
226e0 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61  can be used if a
226f0 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ll of the.    **
22700 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
22710 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue:.    **.    
22720 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65  **    + The file
22730 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
22740 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
22750 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
22760 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
22770 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
22780 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ize, and.    ** 
22790 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74     + This commit
227a0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
227b0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
227c0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
227d0 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c    **    + Exactl
227e0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
227f0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
22800 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
22810 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
22820 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
22830 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
22840 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20  n be used, then 
22850 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22860 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20   will never.    
22870 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f  ** be created fo
22880 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
22890 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
228a0 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  nt useAtomicWrit
228b0 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e;.    pPg = sql
228c0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
228d0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
228e0 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f  che);.    useAto
228f0 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
22900 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
22910 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
22920 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
22930 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22940 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
22950 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
22960 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
22970 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
22980 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
22990 7a 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 28  ze && .        (
229a0 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  pPg==0 || pPg->p
229b0 44 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b  Dirty==0).    );
229c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
229d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
229e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
229f0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
22a00 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
22a10 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
22a20 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
22a30 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22a40 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
22a50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
22a60 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
22a70 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
22a80 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
22a90 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
22aa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
22ab0 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
22ac0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
22ad0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22ae0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
22af0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
22b00 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
22b10 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
22b20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
22b30 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
22b40 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
22b50 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
22b60 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
22b70 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
22b80 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
22b90 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
22ba0 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
22bb0 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
22bc0 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
22bd0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
22be0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
22bf0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
22c00 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
22c10 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
22c20 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
22c30 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
22c40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
22c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22c60 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
22c70 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
22c80 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
22c90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
22ca0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
22cb0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
22cc0 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
22cd0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
22ce0 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
22cf0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22d00 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
22d10 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
22d20 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
22d30 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
22d40 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
22d50 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
22d60 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
22d70 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
22d80 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
22d90 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
22da0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
22db0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
22dc0 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
22dd0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
22de0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
22df0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
22e00 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
22e10 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
22e20 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
22e30 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
22e40 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
22e50 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
22e60 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
22e70 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
22e80 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
22e90 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
22ea0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
22eb0 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
22ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22ed0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
22ee0 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  it;.      if( pP
22ef0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
22f00 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
22f10 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e  MODE_OFF ){.#ifn
22f20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22f30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
22f40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
22f50 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
22f60 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
22f70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
22f80 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
22f90 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
22fa0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
22fb0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
22fc0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
22fd0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
22fe0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
22ff0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
23000 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
23010 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
23020 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23030 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
23040 20 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20       Pgno iSkip 
23050 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
23060 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
23070 20 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d     Pgno dbSize =
23080 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
23090 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
230a0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
230b0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
230c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 69            for( i
230d0 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
230e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
230f0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
23100 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
23110 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
23120 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
23130 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
23140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23150 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23160 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
23170 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
23180 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23190 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
231a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
231b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
231c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
231d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
231e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
231f0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
23200 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23210 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
23220 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
23230 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23240 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 20      } .         
23250 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
23260 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
23270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
23280 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
23290 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
232a0 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
232b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
232c0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
232d0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
232e0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
232f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
23300 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
23310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23320 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
23330 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
23340 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
23350 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
23360 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
23370 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
23380 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
23390 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63  pPCache);.    rc
233a0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
233b0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
233c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
233d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
233e0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
233f0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
23400 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72  .      /* The er
23410 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c  ror might have l
23420 65 66 74 20 74 68 65 20 64 69 72 74 79 20 6c 69  eft the dirty li
23430 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70  st all fouled up
23440 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20   here,.      ** 
23450 62 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  but that does no
23460 74 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65  t matter because
23470 20 69 66 20 74 68 65 20 69 66 20 74 68 65 20 64   if the if the d
23480 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20  irty list did.  
23490 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75      ** get corru
234a0 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74  pted, then the t
234b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
234c0 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20  roll back and.  
234d0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74      ** discard t
234e0 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20  he dirty list.  
234f0 54 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 65  There is an asse
23500 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70  rt in.      ** p
23510 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
23520 74 79 5f 70 61 67 65 73 28 29 20 74 68 61 74 20  ty_pages() that 
23530 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f  verifies that no
23540 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a   attempt.      *
23550 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65  * is made to use
23560 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74   an invalid dirt
23570 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f  y list..      */
23580 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63  .      goto sync
23590 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
235a0 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
235b0 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
235c0 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 69 66  PCache);..    if
235d0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
235e0 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  <pPager->dbFileS
235f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
23600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
23610 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
23620 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  IVE );.      rc 
23630 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
23640 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
23650 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
23660 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23670 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
23680 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
23690 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
236a0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
236b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
236c0 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
236d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
236e0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
236f0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
23700 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
23710 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
23720 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
23730 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
23740 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
23750 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
23760 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
23770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
23780 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
23790 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
237a0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
237b0 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
237c0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
237d0 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
237e0 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
237f0 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
23800 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
23810 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
23820 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
23830 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
23840 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
23850 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
23860 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
23870 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
23880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
23890 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
238a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
238b0 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
238c0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
238d0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
238e0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
238f0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
23900 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
23910 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
23920 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
23930 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
23940 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
23950 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
23960 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
23970 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
23980 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
23990 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
239a0 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
239b0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
239c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
239d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
239e0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
239f0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
23a00 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
23a10 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
23a20 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
23a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23a40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23a50 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
23a60 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ied==0 &&.      
23a70 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e    (pPager->journ
23a80 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
23a90 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
23aa0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50   ||.          pP
23ab0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
23ac0 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  ode!=0) ){.    a
23ad0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23ae0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
23af0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23b00 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  pen==0 );.    re
23b10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23b20 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
23b30 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
23b40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23b50 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
23b60 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
23b70 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
23b80 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
23b90 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
23ba0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23bb0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23bc0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
23bd0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ter);.  rc = pag
23be0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23bf0 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   rc);.  return r
23c00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
23c10 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
23c20 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
23c30 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
23c40 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
23c50 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
23c60 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
23c70 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
23c80 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
23c90 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
23ca0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
23cb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23cc0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
23cd0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
23ce0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
23cf0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
23d00 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
23d10 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
23d20 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
23d30 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
23d40 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
23d50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23d60 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
23d70 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
23d80 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
23d90 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
23da0 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
23db0 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
23dc0 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
23dd0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
23de0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
23df0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
23e00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23e10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23e20 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
23e30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
23e40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23e50 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
23e60 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
23e70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23e80 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
23e90 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
23ea0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
23eb0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
23ec0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
23ed0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
23ee0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
23ef0 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
23f00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
23f10 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
23f20 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
23f30 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
23f40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
23f50 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
23f60 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
23f70 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
23f80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
23f90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
23fa0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
23fb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23fc0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
23fd0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
23fe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23ff0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
24000 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
24010 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
24020 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
24030 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
24040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24060 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
24070 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
24080 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
24090 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
240a0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
240b0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
240c0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
240d0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
240e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
240f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
24100 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
24110 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
24120 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
24130 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
24140 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
24150 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
24160 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
24170 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
24180 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
24190 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
241a0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
241b0 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
241c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
241d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
241e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
241f0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
24200 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
24210 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
24220 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
24230 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
24240 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
24250 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
24260 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24270 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24280 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
24290 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
242a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
242b0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
242c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
242d0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
242e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
242f0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
24300 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
24310 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
24320 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24330 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
24340 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
24350 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
24360 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24370 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
24380 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
24390 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
243a0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
243b0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
243c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
243d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
243e0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
243f0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
24400 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
24410 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
24420 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
24430 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
24440 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
24450 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24460 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
24470 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
24480 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
24490 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
244a0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
244b0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
244c0 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
244d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
244e0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
244f0 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
24500 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
24510 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
24520 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
24530 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
24540 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
24550 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
24560 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
24570 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
24580 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
24590 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
245a0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
245b0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
245c0 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
245d0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
245e0 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
245f0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
24600 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24610 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
24620 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
24630 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
24640 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
24650 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
24660 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ts open..*/.int 
24670 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
24680 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
24690 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
246a0 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
246b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
246c0 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
246d0 74 3e 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t>pPager->nSavep
246e0 6f 69 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  oint && pPager->
246f0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
24700 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61    int ii;.    Pa
24710 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
24720 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68  ew;..    /* Eith
24730 65 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  er the sub-journ
24740 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 74 68  al is open or th
24750 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
24760 65 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 2a 2f  e savepoints. */
24770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24780 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
24790 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a  =0 || pPager->sj
247a0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
247b0 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65  .    /* Grow the
247c0 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
247d0 74 20 61 72 72 61 79 20 75 73 69 6e 67 20 72 65  t array using re
247e0 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20  alloc(). Return 
247f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20  SQLITE_NOMEM.   
24800 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63   ** if the alloc
24810 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68  ation fails. Oth
24820 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65  erwise, zero the
24830 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20   new portion in 
24840 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d  case a .    ** m
24850 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63  alloc failure oc
24860 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c  curs while popul
24870 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20  ating it in the 
24880 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65  for(...) loop be
24890 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  low..    */.    
248a0 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53 61 76  aNew = (PagerSav
248b0 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33  epoint *)sqlite3
248c0 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  Realloc(.       
248d0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
248e0 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65  int, sizeof(Page
248f0 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76  rSavepoint)*nSav
24900 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20  epoint.    );.  
24910 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20    if( !aNew ){. 
24920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24930 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
24940 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
24950 5b 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  [pPager->nSavepo
24960 69 6e 74 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20  int], 0,.       
24970 20 28 6e 53 61 76 65 70 6f 69 6e 74 20 2d 20 70   (nSavepoint - p
24980 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
24990 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65  t) * sizeof(Page
249a0 72 53 61 76 65 70 6f 69 6e 74 29 0a 20 20 20 20  rSavepoint).    
249b0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
249c0 53 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77  Savepoint = aNew
249d0 3b 0a 20 20 20 20 69 69 20 3d 20 70 50 61 67 65  ;.    ii = pPage
249e0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 20  r->nSavepoint;. 
249f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
24a00 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69  point = nSavepoi
24a10 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75  nt;..    /* Popu
24a20 6c 61 74 65 20 74 68 65 20 50 61 67 65 72 53 61  late the PagerSa
24a30 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
24a40 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65  es just allocate
24a50 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 2f 2a  d. */.    for(/*
24a60 20 6e 6f 2d 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53   no-op */; ii<nS
24a70 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b  avepoint; ii++){
24a80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
24aa0 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77  id );.      aNew
24ab0 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61  [ii].nOrig = pPa
24ac0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
24ad0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
24ae0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
24af0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
24b00 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e  >0 ){.        aN
24b10 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d  ew[ii].iOffset =
24b20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24b30 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Off;.      }else
24b40 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
24b50 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55  i].iOffset = JOU
24b60 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
24b70 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
24b80 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62     aNew[ii].iSub
24b90 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
24ba0 6d 74 4e 52 65 63 3b 0a 20 20 20 20 20 20 61 4e  mtNRec;.      aN
24bb0 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f  ew[ii].pInSavepo
24bc0 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  int = sqlite3Bit
24bd0 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72  vecCreate(pPager
24be0 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20  ->dbSize);.     
24bf0 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70   if( !aNew[ii].p
24c00 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20  InSavepoint ){. 
24c10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
24c20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
24c30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
24c40 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  * Open the sub-j
24c50 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
24c60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
24c70 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ned. */.    rc =
24c80 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28   openSubJournal(
24c90 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
24ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24cb0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f 70  .** Parameter op
24cc0 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68 65   is always eithe
24cd0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  r SAVEPOINT_ROLL
24ce0 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49 4e  BACK or SAVEPOIN
24cf0 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49 66  T_RELEASE..** If
24d00 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
24d10 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 72  _RELEASE, then r
24d20 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74 72  elease and destr
24d30 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  oy the savepoint
24d40 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20 69   with.** index i
24d50 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69 74  Savepoint. If it
24d60 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f   is SAVEPOINT_RO
24d70 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f 6c  LLBACK, then rol
24d80 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
24d90 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 6f  s.** that have o
24da0 63 63 75 72 65 64 20 73 69 6e 63 65 20 73 61 76  ccured since sav
24db0 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  epoint iSavepoin
24dc0 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a  t was created..*
24dd0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
24de0 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f 69  ase, all savepoi
24df0 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64 65  nts with an inde
24e00 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 69  x greater than i
24e10 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61 72  Savepoint .** ar
24e20 65 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  e destroyed..**.
24e30 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
24e40 6c 65 73 73 20 74 68 61 6e 20 28 69 53 61 76 65  less than (iSave
24e50 70 6f 69 6e 74 2b 31 29 20 61 63 74 69 76 65 20  point+1) active 
24e60 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 6e 20  savepoints when 
24e70 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
24e80 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20 69  n is called it i
24e90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 69  s a no-op..*/ .i
24ea0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
24eb0 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a  avepoint(Pager *
24ec0 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c 20  pPager, int op, 
24ed0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
24ee0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24ef0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
24f00 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
24f10 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
24f20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
24f30 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61 76  K );..  if( iSav
24f40 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e  epoint<pPager->n
24f50 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
24f60 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
24f70 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69   nNew = iSavepoi
24f80 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f  nt + (op==SAVEPO
24f90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  INT_ROLLBACK);. 
24fa0 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20     for(ii=nNew; 
24fb0 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65  ii<pPager->nSave
24fc0 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20  point; ii++){.  
24fd0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
24fe0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
24ff0 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
25000 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
25010 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
25020 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e  >nSavepoint = nN
25030 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 3d  ew;..    if( op=
25040 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
25050 41 43 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  ACK && pPager->j
25060 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
25070 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
25080 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
25090 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
250a0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
250b0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
250c0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
250d0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
250e0 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
250f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
25100 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
25110 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
25120 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
25130 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
25140 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
25150 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
25160 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
25170 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  nal. */.    if( 
25180 6e 4e 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53  nNew==0 && op==S
25190 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
251a0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 6a 66 64   && pPager->sjfd
251b0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
251c0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
251d0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
251e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
251f0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
25200 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->sjfd, 0);.    
25210 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
25220 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ec = 0;.    }.  
25230 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25240 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25250 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
25260 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
25270 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
25280 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
25290 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
252a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
252b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
252c0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
252d0 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
252e0 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
252f0 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
25300 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
25310 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
25320 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
25330 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
25340 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
25350 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
25360 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
25370 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
25380 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
25390 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
253a0 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
253b0 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
253c0 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
253d0 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
253e0 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
253f0 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
25400 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
25410 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
25420 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
25430 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
25440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25450 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
25460 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
25470 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
25480 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
25490 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
254a0 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
254b0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
254c0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
254d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
254e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
254f0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
25500 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
25510 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
25520 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
25530 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
25540 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
25550 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
25560 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
25570 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
25580 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
25590 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
255a0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
255b0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
255c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
255d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
255e0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
255f0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
25600 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
25610 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
25620 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
25630 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
25640 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
25650 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
25660 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
25670 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
25680 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
25690 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
256a0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
256b0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
256c0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
256d0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
256e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
256f0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
25700 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
25710 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
25720 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
25730 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
25740 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
25750 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
25760 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
25770 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
25780 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
25790 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
257a0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
257b0 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
257c0 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
257d0 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
257e0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
257f0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
25800 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
25810 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
25820 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
25830 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
25840 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
25850 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
25860 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
25870 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
25880 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
25890 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
258a0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
258b0 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
258c0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
258d0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
258e0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
258f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
25900 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
25910 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
25920 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
25930 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
25940 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
25950 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
25960 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
25970 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
25980 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
25990 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
259a0 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
259b0 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
259c0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
259d0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
259e0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
259f0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
25a00 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
25a10 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
25a20 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
25a30 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
25a40 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
25a50 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
25a60 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
25a70 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
25a80 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
25a90 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
25aa0 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
25ab0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
25ac0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
25ad0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
25ae0 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
25af0 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
25b00 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
25b10 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
25b20 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
25b30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
25b40 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
25b50 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
25b60 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
25b70 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
25b80 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
25b90 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  d;  /* The page 
25ba0 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
25bb0 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65  n. */.  Pgno nee
25bc0 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 20  dSyncPgno = 0;. 
25bd0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
25be0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
25bf0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
25c00 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64  page being moved
25c10 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68 61   is dirty and ha
25c20 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64  s not been saved
25c30 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20   by the latest. 
25c40 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74   ** savepoint, t
25c50 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75 72  hen save the cur
25c60 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
25c70 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
25c80 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75  he .  ** sub-jou
25c90 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69  rnal now. This i
25ca0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68 61  s required to ha
25cb0 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ndle the followi
25cc0 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a  ng scenario:.  *
25cd0 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a  *.  **   BEGIN;.
25ce0 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61    **     <journa
25cf0 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d  l page X, then m
25d00 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f  odify it in memo
25d10 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56  ry>.  **     SAV
25d20 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a  EPOINT one;.  **
25d30 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67         <Move pag
25d40 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  e X to location 
25d50 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c  Y>.  **     ROLL
25d60 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a  BACK TO one;.  *
25d70 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58  *.  ** If page X
25d80 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65   were not writte
25d90 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  n to the sub-jou
25da0 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f  rnal here, it wo
25db0 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20  uld not.  ** be 
25dc0 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74  possible to rest
25dd0 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  ore its contents
25de0 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42   when the "ROLLB
25df0 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a  ACK TO one".  **
25e00 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20   statement were 
25e10 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a  processed..  */.
25e20 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
25e30 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20  &PGHDR_DIRTY .  
25e40 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
25e50 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
25e60 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
25e70 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
25e80 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
25e90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
25ea0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
25eb0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
25ec0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
25ed0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
25ee0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
25ef0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
25f00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25f10 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
25f20 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
25f30 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
25f40 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
25f50 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
25f60 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
25f70 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20 2f  ntent(pPg);..  /
25f80 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
25f90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
25fa0 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61 67  c()ed before pag
25fb0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a  e pPg->pgno can.
25fc0 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
25fd0 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e 70  to, store pPg->p
25fe0 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  gno in local var
25ff0 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50 67  iable needSyncPg
26000 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  no..  **.  ** If
26010 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   the isCommit fl
26020 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72 65  ag is set, there
26030 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
26040 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20 2a  emember that.  *
26050 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
26060 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
26070 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
26080 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e  se page pPg->pgn
26090 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 77  o .  ** can be w
260a0 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
260b0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
260c0 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
260d0 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a 20  o write to it.. 
260e0 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d 3e   */.  if( (pPg->
260f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
26100 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f 6d  _SYNC) && !isCom
26110 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  mit ){.    needS
26120 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
26130 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
26140 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70   pageInJournal(p
26150 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  Pg) || pPg->pgno
26160 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  >pPager->dbOrigS
26170 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
26180 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  t( pPg->flags&PG
26190 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 20  HDR_DIRTY );.   
261a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
261b0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
261c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
261d0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
261e0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
261f0 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
26200 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
26210 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
26220 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
26230 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
26240 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
26250 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
26260 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
26270 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
26280 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
26290 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
262a0 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
262b0 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
262c0 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e   ~PGHDR_NEED_SYN
262d0 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  C;.  pPgOld = pa
262e0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
262f0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
26300 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70  rt( !pPgOld || p
26310 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29  PgOld->nRef==1 )
26320 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
26330 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73  {.    pPg->flags
26340 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61   |= (pPgOld->fla
26350 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
26360 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  NC);.  }..  sqli
26370 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50  te3PcacheMove(pP
26380 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  g, pgno);.  if( 
26390 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71  pPgOld ){.    sq
263a0 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28  lite3PcacheDrop(
263b0 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20  pPgOld);.  }..  
263c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
263d0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
263e0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
263f0 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  e = 1;.  pPager-
26400 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
26410 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
26420 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
26430 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
26440 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
26450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26460 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
26470 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
26480 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
26490 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
264a0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
264b0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
264c0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
264d0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
264e0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
264f0 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
26500 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
26510 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
26520 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
26530 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
26540 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
26550 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
26560 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
26570 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
26580 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
26590 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
265a0 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
265b0 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
265c0 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
265d0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
265e0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
265f0 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
26600 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
26610 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
26620 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
26630 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
26640 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
26650 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
26660 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
26670 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
26680 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
26690 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
266a0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
266b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
266c0 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
266d0 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
266e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
266f0 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
26700 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
26710 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
26720 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
26730 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
26740 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
26750 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
26760 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
26770 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
26780 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
26790 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
267a0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
267b0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
267c0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
267d0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
267e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
267f0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
26800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26810 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
26820 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
26830 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
26840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26850 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
26860 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
26870 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  & needSyncPgno<=
26880 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
26890 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ze ){.        sq
268a0 6c 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72  lite3BitvecClear
268b0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
268c0 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  nal, needSyncPgn
268d0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
268e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
268f0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
26900 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
26910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26920 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d  >noSync==0 && !M
26930 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48  EMDB );.    pPgH
26940 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  dr->flags |= PGH
26950 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
26960 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
26970 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
26980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
26990 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
269a0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
269b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
269c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
269d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
269e0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
269f0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
26a00 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
26a10 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
26a20 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
26a30 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
26a40 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
26a50 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
26a60 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
26a70 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
26a80 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
26a90 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
26aa0 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
26ab0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
26ac0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
26ad0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
26ae0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
26af0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
26b00 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
26b10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
26b20 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
26b30 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d  urn (pPager?pPg-
26b40 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f  >pExtra:0);.}../
26b50 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
26b60 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
26b70 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
26b80 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
26b90 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
26ba0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26bb0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
26bc0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
26bd0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
26be0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
26bf0 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
26c00 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
26c10 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
26c20 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
26c30 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
26c40 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
26c50 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
26c60 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
26c70 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
26c80 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
26c90 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26ca0 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
26cb0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
26cc0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
26cd0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
26ce0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
26cf0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
26d00 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
26d10 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
26d20 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
26d30 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
26d40 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
26d50 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
26d60 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
26d70 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
26d80 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
26d90 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26da0 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
26db0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
26dc0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
26dd0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
26de0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
26df0 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
26e00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
26e10 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
26e20 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
26e30 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
26e40 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
26e50 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
26e60 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20  e = (u8)eMode;. 
26e70 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
26e80 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
26e90 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
26ea0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
26eb0 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
26ec0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
26ed0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
26ee0 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
26ef0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
26f00 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20  MODE_QUERY.**   
26f10 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26f20 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  DE_DELETE.**    
26f30 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26f40 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  E_TRUNCATE.**   
26f50 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26f60 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20  DE_PERSIST.**   
26f70 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
26f80 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20  DE_OFF.**.** If 
26f90 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
26fa0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
26fb0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f  n the journal-mo
26fc0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
26fd0 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66  .** value specif
26fe0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
26ff0 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65  eturned indicate
27000 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
27010 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
27020 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e  ** journal-mode.
27030 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27040 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  agerJournalMode(
27050 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
27060 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28  nt eMode){.  if(
27070 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61   !MEMDB ){.    a
27080 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
27090 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
270a0 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
270b0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
270c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
270d0 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20  DELETE.         
270e0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
270f0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
27100 5f 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20  _TRUNCATE.      
27110 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
27120 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
27130 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
27140 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
27150 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
27160 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
27170 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
27180 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
27190 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20  MODE_MEMORY );. 
271a0 20 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52     assert( PAGER
271b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
271c0 52 59 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  RY<0 );.    if( 
271d0 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20  eMode>=0 ){.    
271e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
271f0 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  lMode = (u8)eMod
27200 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
27210 20 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64      assert( eMod
27220 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
27230 4d 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20  MODE_QUERY );.  
27240 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27250 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
27260 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  urnalMode;.}../*
27270 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
27280 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20  size-limit used 
27290 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
272a0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
272b0 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65  .i64 sqlite3Page
272c0 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  rJournalSizeLimi
272d0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
272e0 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20   i64 iLimit){.  
272f0 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29  if( iLimit>=-1 )
27300 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
27310 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d  urnalSizeLimit =
27320 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72   iLimit;.  }.  r
27330 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  eturn pPager->jo
27340 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a  urnalSizeLimit;.
27350 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
27360 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
27370 2a 2f 0a                                         */.