/ Hex Artifact Content
Login

Artifact 4c9c51dd73d778ba835a2f922b6c39b680a660d0:


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 38  : pager.c,v 1.58
0350: 34 20 32 30 30 39 2f 30 34 2f 33 30 20 30 39 3a  4 2009/04/30 09:
0360: 31 30 3a 33 38 20 64 61 6e 69 65 6c 6b 31 39 37  10:38 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
1180: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
1190: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
11a0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
11b0: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
11c0: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
11d0: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
11e0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
11f0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
1200: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
1210: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
1220: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
1230: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
1240: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
1250: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1260: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
1270: 77 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  wed sector size.
1280: 20 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53   16MB. If the xS
1290: 65 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68  ectorsize() meth
12a0: 6f 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  od .** returns a
12b0: 20 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68   value larger th
12c0: 61 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41  an this, then MA
12d0: 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73  X_SECTOR_SIZE is
12e0: 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
12f0: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e  * This could con
1300: 63 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63  ceivably cause c
1310: 6f 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77  orruption follow
1320: 69 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ing a power fail
1330: 75 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61  ure on.** such a
1340: 20 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73   system. This is
1350: 20 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e   currently an un
1360: 64 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74  documented limit
1370: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1380: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30  _SECTOR_SIZE 0x0
1390: 31 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e  100000../*.** An
13a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
13b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
13c0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
13d0: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
13e0: 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61  e.** savepoint a
13f0: 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  nd statement tra
1400: 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  nsaction in the 
1410: 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68  system. All such
1420: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61   structures.** a
1430: 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  re stored in the
1440: 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e   Pager.aSavepoin
1450: 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68  t[] array, which
1460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
1470: 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69  d.** resized usi
1480: 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  ng sqlite3Reallo
1490: 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  c()..**.** When 
14a0: 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63  a savepoint is c
14b0: 72 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65  reated, the Page
14c0: 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f  rSavepoint.iHdrO
14d0: 66 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a  ffset field is.*
14e0: 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61  * set to 0. If a
14f0: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
1500: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1510: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
1520: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61   while.** the sa
1530: 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1540: 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73  e, then iHdrOffs
1550: 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1560: 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a   byte offset .**
1570: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
1580: 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
1590: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
15a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
15b0: 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
15c0: 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e  before the journ
15d0: 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20  al-header. This 
15e0: 69 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69  is required duri
15f0: 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20  ng savepoint.** 
1600: 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61  rollback (see pa
1610: 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70  gerPlaybackSavep
1620: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65  oint())..*/.type
1630: 64 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72  def struct Pager
1640: 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53  Savepoint PagerS
1650: 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74  avepoint;.struct
1660: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
1670: 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b  {.  i64 iOffset;
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66   /* Starting off
16a0: 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72  set in main jour
16b0: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64  nal */.  i64 iHd
16c0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
16d0: 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
16e0: 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ve */.  Bitvec *
16f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20  pInSavepoint;   
1700: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70       /* Set of p
1710: 61 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76  ages in this sav
1720: 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f  epoint */.  Pgno
1730: 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20   nOrig;         
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1750: 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  inal number of p
1760: 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a  ages in file */.
1770: 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20    Pgno iSubRec; 
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74  * Index of first
17a0: 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a   record in sub-j
17b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ournal */.};../*
17c0: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
17d0: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
17e0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
17f0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1800: 0a 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a  .**.** errCode.*
1810: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72  *.**   Pager.err
1820: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
1830: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
1840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
1850: 20 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49   or.**   or SQLI
1860: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1870: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1880: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1890: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
18a0: 2a 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75  **   and is retu
18b0: 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75  rned as the resu
18c0: 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f  lt of every majo
18d0: 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c  r pager API call
18e0: 2e 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49  .  The.**   SQLI
18f0: 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63  TE_FULL return c
1900: 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20  ode is slightly 
1910: 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65  different. It pe
1920: 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69  rsists only unti
1930: 6c 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20  l the.**   next 
1940: 73 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62  successful rollb
1950: 61 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64  ack is performed
1960: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   on the pager ca
1970: 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20  che. Also,.**   
1980: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73  SQLITE_FULL does
1990: 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20   not affect the 
19a0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19b0: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67  ) and sqlite3Pag
19c0: 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20  erLookup().**   
19d0: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
19e0: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
19f0: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a  cessfully..**.**
1a00: 20 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62   dbSizeValid, db
1a10: 53 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65  Size, dbOrigSize
1a20: 2c 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a  , dbFileSize.**.
1a30: 2a 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68  **   Managing th
1a40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
1a50: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
1a60: 61 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ages is a little
1a70: 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a   complicated..**
1a80: 20 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20     The variable 
1a90: 50 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e  Pager.dbSize con
1aa0: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
1ab0: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1ac0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
1ad0: 20 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79   image currently
1ae0: 20 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68   contains. As th
1af0: 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
1b00: 20 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b   grows or shrink
1b10: 73 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69  s this.**   vari
1b20: 61 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e  able is updated.
1b30: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
1b40: 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63  ger.dbFileSize c
1b50: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62  ontains the numb
1b60: 65 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73  er.**   of pages
1b70: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1b80: 20 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20   file. This may 
1b90: 62 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  be different fro
1ba0: 6d 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a  m Pager.dbSize.*
1bb0: 2a 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65  *   if some page
1bc0: 73 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65  s have been appe
1bd0: 6e 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  nded to the data
1be0: 62 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e  base image but n
1bf0: 6f 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a  ot yet written.*
1c00: 2a 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65  *   out from the
1c10: 20 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63   cache to the ac
1c20: 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73  tual file on dis
1c30: 6b 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61  k. Or if the ima
1c40: 67 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20  ge has been.**  
1c50: 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e   truncated by an
1c60: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
1c70: 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  uum operation. T
1c80: 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53  he Pager.dbOrigS
1c90: 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ize variable.** 
1ca0: 20 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e    contains the n
1cb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1cc0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
1cd0: 6d 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75  mage when the cu
1ce0: 72 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73  rrent.**   trans
1cf0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
1d00: 64 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  d. The contents 
1d10: 6f 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20  of all three of 
1d20: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
1d30: 69 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61  is.**   only gua
1d40: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f  ranteed to be co
1d50: 72 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f  rrect if the boo
1d60: 6c 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  lean Pager.dbSiz
1d70: 65 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a  eValid is true..
1d80: 2a 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e  **.**   TODO: Un
1d90: 64 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69  der what conditi
1da0: 6f 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c  ons is dbSizeVal
1db0: 69 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f  id set? Cleared?
1dc0: 0a 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75  .**.** changeCou
1dd0: 6e 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54  ntDone.**.**   T
1de0: 68 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69  his boolean vari
1df0: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
1e00: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1e10: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
1e20: 72 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62  r .**   (the 4-b
1e30: 79 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  yte header field
1e40: 20 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20   at byte offset 
1e50: 32 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  24 of the databa
1e60: 73 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20  se file) is .** 
1e70: 20 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f    not updated mo
1e80: 72 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65  re often than ne
1e90: 63 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  cessary. .**.** 
1ea0: 20 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74    It is set to t
1eb0: 72 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61  rue when the cha
1ec0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c  nge-counter fiel
1ed0: 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68  d is updated, wh
1ee0: 69 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e  ich .**   can on
1ef0: 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20  ly happen if an 
1f00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69  exclusive lock i
1f10: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  s held on the da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
1f30: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
1f40: 28 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77  (set to false) w
1f50: 68 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75  henever an exclu
1f60: 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a  sive lock is .**
1f70: 20 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20     relinquished 
1f80: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1f90: 66 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20  file. Each time 
1fa0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1fb0: 20 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20   committed,.**  
1fc0: 20 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74   The changeCount
1fd0: 44 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73  Done flag is ins
1fe0: 70 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73  pected. If it is
1ff0: 20 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20   true, the work 
2000: 6f 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67  of.**   updating
2010: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2020: 74 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66  ter is omitted f
2030: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  or the current t
2040: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
2050: 2a 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69  *   This mechani
2060: 73 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68  sm means that wh
2070: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  en running in ex
2080: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20  clusive mode, a 
2090: 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20  connection .**  
20a0: 20 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74   need only updat
20b0: 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  e the change-cou
20c0: 6e 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74  nter once, for t
20d0: 68 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63  he first transac
20e0: 74 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74  tion.**   commit
20f0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64  ted..**.** dbMod
2100: 69 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68  ified.**.**   Th
2110: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
2120: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2130: 72 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  r a database pag
2140: 65 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a  e is dirtied..**
2150: 20 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64     It is cleared
2160: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
2170: 61 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ach transaction.
2180: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75  .**.**   It is u
2190: 73 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74  sed when committ
21a0: 69 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65  ing or otherwise
21b0: 20 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61   ending a transa
21c0: 63 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74  ction. If.**   t
21d0: 68 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c  he dbModified fl
21e0: 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
21f0: 20 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74   less work has t
2200: 6f 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  o be done..**.**
2210: 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a   journalStarted.
2220: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61  **.**   This fla
2230: 67 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65  g is set wheneve
2240: 72 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a  r the the main j
2250: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
2260: 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70  . .**.**   The p
2270: 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61  oint of this fla
2280: 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73  g is that it mus
2290: 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74  t be set after t
22a0: 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a  he .**   first j
22b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
22c0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
22d0: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
22e0: 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66  to disk..**   Af
22f0: 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70  ter this has hap
2300: 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73  pened, new pages
2310: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2320: 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20   database .**   
2330: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  do not need the 
2340: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2350: 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65  flag set, as the
2360: 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  y do not need.**
2370: 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61     to wait for a
2380: 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65   journal sync be
2390: 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65  fore they can be
23a0: 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
23b0: 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73  **   the databas
23c0: 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63  e file (see func
23d0: 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65  tion pager_write
23e0: 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65  ())..**   .** se
23f0: 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20  tMaster.**.**   
2400: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73  This variable is
2410: 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
2420: 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  that the master 
2430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
2440: 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20  e.**   (if any) 
2450: 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20  is only written 
2460: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2470: 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a   file once..**.*
2480: 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74  *   When committ
2490: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
24a0: 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  n, the master jo
24b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
24c0: 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61  (if any).**   ma
24d0: 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  y be written int
24e0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
24f0: 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  le while the pag
2500: 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a  er is still in.*
2510: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
2520: 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f  ED state (see Co
2530: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66  mmitPhaseOne() f
2540: 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20  or the action). 
2550: 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74  It.**   then att
2560: 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65  empts to upgrade
2570: 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
2580: 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61   lock. If this a
2590: 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c  ttempt.**   fail
25a0: 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42  s, then SQLITE_B
25b0: 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72  USY may be retur
25c0: 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
25d0: 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20  and the user.** 
25e0: 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f    may attempt to
25f0: 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
2600: 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61  saction again la
2610: 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20  ter (calling.** 
2620: 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65    CommitPhaseOne
2630: 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20  () again). This 
2640: 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20  flag is used to 
2650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2660: 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75  .**   master jou
2670: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c  rnal name is onl
2680: 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
2690: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
26a0: 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d  e first.**   tim
26b0: 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  e CommitPhaseOne
26c0: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
26d0: 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a  .** doNotSync.**
26e0: 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61  .**   This varia
26f0: 62 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63  ble is set and c
2700: 6c 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65  leared by sqlite
2710: 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a  3PagerWrite()..*
2720: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
2730: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
2740: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
2750: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
2760: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
2770: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
2780: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
2790: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
27a0: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
27b0: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
27c0: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
27d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
27e0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
27f0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
2800: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
2810: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
2820: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
2830: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
2840: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
2850: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
2860: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
2870: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
2880: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
2890: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
28a0: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
28b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
28c0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
28d0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
2900: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
2910: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2920: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2930: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2940: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2950: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2960: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2970: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2980: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2990: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
29a0: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
29b0: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29e0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29f0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
2a00: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
2a10: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a20: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a30: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a40: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a60: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a70: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a80: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2aa0: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2ab0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2ac0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ad0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ae0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2af0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2b00: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2b10: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b20: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b30: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b40: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b50: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b60: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b80: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b90: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2ba0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2bb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2bc0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bd0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2be0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bf0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2c00: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2c10: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c20: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c30: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c40: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c50: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c60: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c70: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c80: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c90: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2ca0: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2cb0: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2cc0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2ce0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cf0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2d00: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2d10: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d20: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d30: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d40: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d50: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d60: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d70: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d80: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d90: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2da0: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2db0: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2dc0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2dd0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2de0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2df0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2e00: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2e10: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e20: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e40: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e50: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e60: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e70: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e80: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e90: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2ea0: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2eb0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ec0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2ed0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ee0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ef0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2f00: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2f10: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f30: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f40: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f50: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f70: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f80: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f90: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2fa0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fc0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fd0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fe0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2ff0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3000: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3010: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3020: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3030: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3040: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3060: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3070: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
3080: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
3090: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
30a0: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
30b0: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
30c0: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
30f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3100: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
3110: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
3120: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
3130: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
3140: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
3150: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
3160: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3170: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
3180: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
3190: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
31a0: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
31b0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
31c0: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
31d0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
31e0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
31f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
3200: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
3210: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
3220: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
3230: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
3240: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
3250: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
3260: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
3270: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
3280: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
3290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32a0: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
32b0: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
32c0: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
32d0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
32e0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
32f0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
3300: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
3310: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
3320: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
3330: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
3340: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
3350: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
3360: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
3370: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
3380: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
3390: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
33a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
33b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
33c0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
33d0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
33e0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3400: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
3410: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
3420: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
3430: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
3450: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
3460: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
3470: 61 64 65 72 20 2a 2f 0a 20 20 50 61 67 65 72 53  ader */.  PagerS
3480: 61 76 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70  avepoint *aSavep
3490: 6f 69 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f  oint; /* Array o
34a0: 66 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  f active savepoi
34b0: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61  nts */.  int nSa
34c0: 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
34d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
34e0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53  f elements in aS
34f0: 61 76 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20  avepoint[] */.  
3500: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
3510: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
3520: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
3530: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3540: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 33 32 20 73  anges */.  u32 s
3550: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3560: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3570: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3580: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
3590: 0a 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  ..  int nExtra; 
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
35c0: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
35d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
35e0: 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b  .  u32 vfsFlags;
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3600: 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  * Flags for sqli
3610: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
3620: 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a  */.  int pageSiz
3630: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
3650: 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f  tes in a page */
3660: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3680: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3690: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
36a0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
36b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
36c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
36d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
36e0: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
36f0: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
3700: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
3710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3720: 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  e */.  int (*xBu
3730: 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a  syHandler)(void*
3740: 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ); /* Function t
3750: 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62 75 73 79  o call when busy
3760: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
3770: 79 48 61 6e 64 6c 65 72 41 72 67 3b 20 20 20 20  yHandlerArg;    
3780: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 61 72 67    /* Context arg
3790: 75 6d 65 6e 74 20 66 6f 72 20 78 42 75 73 79 48  ument for xBusyH
37a0: 61 6e 64 6c 65 72 20 2a 2f 0a 23 69 66 64 65 66  andler */.#ifdef
37b0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
37c0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
37e0: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
37f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
3800: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
3810: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3820: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
3830: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
3840: 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65   void (*xReinite
3850: 72 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20  r)(DbPage*); /* 
3860: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
3870: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
3880: 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66   pages */.#ifdef
3890: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
38a0: 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  C.  void *(*xCod
38b0: 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
38c0: 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f  Pgno,int); /* Ro
38d0: 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63  utine for en/dec
38e0: 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  oding data */.  
38f0: 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b  void *pCodecArg;
3900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3910: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
3920: 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e   xCodec() */.#en
3930: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
3940: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
3950: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
3960: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
3970: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
3980: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
3990: 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  izeLimit;       
39a0: 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20 66 6f  /* Size limit fo
39b0: 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
39c0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
39d0: 50 43 61 63 68 65 20 2a 70 50 43 61 63 68 65 3b  PCache *pPCache;
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39f0: 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 63  ointer to page c
3a00: 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ache object */. 
3a10: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
3a20: 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f 2a 20  *pBackup;    /* 
3a30: 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73 74 20  Pointer to list 
3a40: 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63 6b 75  of ongoing backu
3a50: 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f 0a 7d  p processes */.}
3a60: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ;../*.** The fol
3a70: 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
3a80: 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75  riables hold cou
3a90: 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a  nters used for.*
3aa0: 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  * testing purpos
3ab0: 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20  es only.  These 
3ac0: 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74  variables do not
3ad0: 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e   exist in.** a n
3ae0: 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64  on-testing build
3af0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
3b00: 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61  es are not threa
3b10: 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65  d-safe..*/.#ifde
3b20: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
3b30: 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
3b40: 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30  readdb_count = 0
3b50: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
3b60: 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61  f full pages rea
3b70: 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74  d from DB */.int
3b80: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
3b90: 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30  ritedb_count = 0
3ba0: 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
3bb0: 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74   full pages writ
3bc0: 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74  ten to DB */.int
3bd0: 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
3be0: 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b  ritej_count = 0;
3bf0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3c00: 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74   pages written t
3c10: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64  o journal */.# d
3c20: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
3c30: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
3c40: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3c50: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a  CR(v).#endif....
3c60: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
3c70: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
3c80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
3c90: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
3ca0: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
3cb0: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
3cc0: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
3cd0: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
3ce0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
3cf0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
3d00: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
3d10: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
3d20: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
3d30: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
3d40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
3d50: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
3d60: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
3d70: 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77  al is being.** w
3d80: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
3d90: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
3da0: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
3db0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
3dc0: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
3dd0: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
3de0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
3df0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
3e00: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
3e10: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
3e20: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
3e30: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
3e40: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
3e50: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
3e60: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
3e70: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
3e80: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
3e90: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
3ea0: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
3eb0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3ec0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
3ed0: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
3ee0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
3ef0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
3f00: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
3f10: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
3f20: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
3f30: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
3f40: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
3f50: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
3f60: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
3f70: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
3f80: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
3f90: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
3fa0: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
3fb0: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
3fc0: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
3fd0: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
3fe0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
3ff0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
4000: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
4010: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
4020: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
4030: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
4040: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
4050: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
4060: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
4070: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
4080: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
4090: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
40a0: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
40b0: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
40c0: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
40d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
40e0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
40f0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
4100: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
4110: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
4120: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
4130: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
4140: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
4150: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
4160: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
4170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
4180: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4190: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
41a0: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
41b0: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
41c0: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
41d0: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
41e0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
41f0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 72 65 63  of each page rec
4200: 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ord in the journ
4210: 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a  al is given by.*
4220: 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
4230: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66 69 6e  macro..*/.#defin
4240: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
4250: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
4260: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
4270: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
4280: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
4290: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
42a0: 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
42b0: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 73 69   the same .** si
42c0: 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65 20 64  ze as a single d
42d0: 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65 65 20  isk sector. See 
42e0: 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72 53 69  also setSectorSi
42f0: 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ze()..*/.#define
4300: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
4310: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
4320: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
4330: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
4340: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
4350: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
4360: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
4370: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
4380: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
4390: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
43a0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
43b0: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
43c0: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
43d0: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
43e0: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
43f0: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
4400: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
4410: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
4420: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
4430: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
4440: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
4450: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
4460: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
4470: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
4480: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
4490: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
44a0: 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
44b0: 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29 2e  r is (2^31 - 1).
44c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
44d0: 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37 34  R_MAX_PGNO 21474
44e0: 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66 20 4e  83647..#ifndef N
44f0: 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55 73 61  DEBUG ./*.** Usa
4500: 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65  ge:.**.**   asse
4510: 72 74 28 20 61 73 73 65 72 74 5f 70 61 67 65 72  rt( assert_pager
4520: 5f 73 74 61 74 65 28 70 50 61 67 65 72 29 20 29  _state(pPager) )
4530: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
4540: 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61  assert_pager_sta
4550: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
4560: 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d 70 2d  ){..  /* A temp-
4570: 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  file is always i
4580: 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
4590: 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e 43 45  E or PAGER_SYNCE
45a0: 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 61 73  D state. */.  as
45b0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65  sert( pPager->te
45c0: 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70 50 61  mpFile==0 || pPa
45d0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
45e0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
45f0: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67 65 43    /* The changeC
4600: 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 69 73  ountDone flag is
4610: 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f 72 20   always set for 
4620: 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a 20 20  temp-files */.  
4630: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
4640: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
4650: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
4660: 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72 65 74  ntDone );..  ret
4670: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
4680: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
4690: 75 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65  ue if it is nece
46a0: 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70  ssary to write p
46b0: 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68  age *pPg into th
46c0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a  e sub-journal..*
46d0: 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74  * A page needs t
46e0: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
46f0: 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
4700: 6c 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  l if there exist
4710: 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65  s one.** or more
4720: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
4730: 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a   for which:.**.*
4740: 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e  *   * The page-n
4750: 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68  umber is less th
4760: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50  an or equal to P
4770: 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f  agerSavepoint.nO
4780: 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  rig, and.**   * 
4790: 54 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f  The bit correspo
47a0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67  nding to the pag
47b0: 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20  e-number is not 
47c0: 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61  set in.**     Pa
47d0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
47e0: 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  Savepoint..*/.st
47f0: 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71  atic int subjReq
4800: 75 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20  uiresPage(PgHdr 
4810: 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67  *pPg){.  Pgno pg
4820: 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
4830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
4840: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
4850: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4860: 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  0; i<pPager->nSa
4870: 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  vepoint; i++){. 
4880: 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
4890: 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e  t *p = &pPager->
48a0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20  aSavepoint[i];. 
48b0: 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e     if( p->nOrig>
48c0: 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69  =pgno && 0==sqli
48d0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d  te3BitvecTest(p-
48e0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
48f0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65  gno) ){.      re
4900: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
4910: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4920: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
4930: 75 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ue if the page i
4940: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
4950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
4960: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4970: 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72  eInJournal(PgHdr
4980: 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
4990: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
49a0: 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  st(pPg->pPager->
49b0: 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
49c0: 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pgno);.}../*.**
49d0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
49e0: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
49f0: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4a00: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4a10: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4a20: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4a30: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4a40: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4a50: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
4a60: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
4a70: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4a80: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
4a90: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
4aa0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
4ab0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4ac0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4ad0: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
4ae0: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
4af0: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
4b00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4b10: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
4b20: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
4b30: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
4b40: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
4b50: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4b60: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
4b70: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
4b80: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
4b90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4ba0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4bb0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
4bc0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
4bd0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
4be0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
4bf0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
4c00: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
4c10: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
4c20: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4c30: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4c40: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4c50: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4c60: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4c70: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4c80: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4c90: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4ca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4cb0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
4cc0: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
4cd0: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
4ce0: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
4cf0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
4d00: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
4d10: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
4d20: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
4d30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
4d40: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
4d50: 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69 6c 65   macro is a file
4d60: 20 64 65 73 63 72 69 70 74 6f 72 20 28 74 79 70   descriptor (typ
4d70: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  e sqlite3_file*)
4d80: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 69 66  ..** Return 0 if
4d90: 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c   it is not open,
4da0: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28 62 75   or non-zero (bu
4db0: 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74 20 69  t not 1) if it i
4dc0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
4dd0: 20 73 6f 20 74 68 61 74 20 65 78 70 72 65 73 73   so that express
4de0: 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72 69 74  ions can be writ
4df0: 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ten as:.**.**   
4e00: 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
4e10: 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e 0a 2a  r->jfd) ){ ....*
4e20: 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 0a  *.** instead of.
4e30: 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50 61 67  **.**   if( pPag
4e40: 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64  er->jfd->pMethod
4e50: 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64 65 66  s ){ ....*/.#def
4e60: 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64 29 20  ine isOpen(pFd) 
4e70: 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f 64 73  ((pFd)->pMethods
4e80: 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65  )../*.** If file
4e90: 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61   pFd is open, ca
4ea0: 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  ll sqlite3OsUnlo
4eb0: 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73  ck() on it..*/.s
4ec0: 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f  tatic int osUnlo
4ed0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
4ee0: 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29  *pFd, int eLock)
4ef0: 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28  {.  if( !isOpen(
4f00: 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  pFd) ){.    retu
4f10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
4f30: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20  e3OsUnlock(pFd, 
4f40: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
4f50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
4f60: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
4f70: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
4f80: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
4f90: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
4fa0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
4fb0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
4fc0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
4fd0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
4fe0: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
4ff0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
5000: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
5010: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
5020: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
5030: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
5040: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
5050: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
5060: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
5070: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
5080: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
5090: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
50a0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
50b0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
50c0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
50d0: 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e 61 62  also always enab
50e0: 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  led for temporar
50f0: 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73 0a 2a  y files. It is.*
5100: 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61  * an error to ca
5110: 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
5120: 20 69 66 20 70 50 61 67 65 72 20 69 73 20 6f 70   if pPager is op
5130: 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d 6d 65  ened on an in-me
5140: 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
5150: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
5160: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e  ptimization cann
5170: 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69 73  ot be used, 0 is
5180: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
5190: 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a   can be used,.**
51a0: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
51b0: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
51c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
51d0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69 74  nal file when it
51e0: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c  .** contains rol
51f0: 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20 65  lback data for e
5200: 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e  xactly one page.
5210: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5220: 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
5230: 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e 74  WRITE.static int
5240: 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
5250: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5260: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
5270: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
5280: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
5290: 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20     int dc;      
52a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52b0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
52c0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
52d0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63 74 6f  /.    int nSecto
52e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
52f0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f          /* Secto
5300: 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e  r size */.    in
5310: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
5320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5330: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
5340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f  .    assert( isO
5350: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
5360: 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71 6c 69  );.    dc = sqli
5370: 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
5380: 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
5390: 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53 65 63  r->fd);.    nSec
53a0: 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73 65  tor = pPager->se
53b0: 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73 7a  ctorSize;.    sz
53c0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
53d0: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20 61 73  ageSize;..    as
53e0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
53f0: 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31  P_ATOMIC512==(51
5400: 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73 73 65  2>>8));.    asse
5410: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
5420: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
5430: 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66 28 20  6>>8));.    if( 
5440: 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45 5f 49  0==(dc&(SQLITE_I
5450: 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50  OCAP_ATOMIC|(szP
5460: 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53 65 63  age>>8)) || nSec
5470: 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b 0a 20  tor>szPage) ){. 
5480: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
5490: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
54a0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
54b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
54c0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
54d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
54e0: 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  ** If SQLITE_CHE
54f0: 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65 66 69  CK_PAGES is defi
5500: 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73  ned then we do s
5510: 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  ome sanity check
5520: 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61  ing.** on the ca
5530: 63 68 65 20 75 73 69 6e 67 20 61 20 68 61 73 68  che using a hash
5540: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
5550: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
5560: 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75  ting.** and debu
5570: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
5580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
5590: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
55a0: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
55b0: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
55c0: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
55d0: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
55e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74  ger_datahash(int
55f0: 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64   nByte, unsigned
5600: 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20   char *pData){. 
5610: 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20   u32 hash = 0;. 
5620: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5630: 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29  0; i<nByte; i++)
5640: 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  {.    hash = (ha
5650: 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61  sh*1039) + pData
5660: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [i];.  }.  retur
5670: 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63  n hash;.}.static
5680: 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65 68   u32 pager_pageh
5690: 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65  ash(PgHdr *pPage
56a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  ){.  return page
56b0: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
56c0: 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ->pPager->pageSi
56d0: 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ze, (unsigned ch
56e0: 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74  ar *)pPage->pDat
56f0: 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  a);.}.static voi
5700: 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  d pager_set_page
5710: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
5720: 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67  e){.  pPage->pag
5730: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
5740: 67 65 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d  gehash(pPage);.}
5750: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
5760: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
5770: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
5780: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
5790: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
57a0: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
57b0: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
57c0: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
57d0: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
57e0: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
57f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
5800: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
5810: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
5820: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
5830: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
5840: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
5850: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
5860: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
5870: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
5880: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
5890: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
58a0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
58b0: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
58c0: 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c  >errCode.      |
58d0: 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  | (pPg->flags&PG
58e0: 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50  HDR_DIRTY) || pP
58f0: 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67  g->pageHash==pag
5900: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
5910: 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65   );.}..#else.#de
5920: 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68  fine pager_datah
5930: 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66  ash(X,Y)  0.#def
5940: 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65 68 61  ine pager_pageha
5950: 73 68 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65  sh(X)  0.#define
5960: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
5970: 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45  endif  /* SQLITE
5980: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a  _CHECK_PAGES */.
5990: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
59a0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
59b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
59c0: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
59d0: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
59e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
59f0: 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61 20 6d  mpts to read a m
5a00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5a10: 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  le name from the
5a20: 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20   .** end of the 
5a30: 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73 75 63  file and, if suc
5a40: 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65 73 20  cessful, copies 
5a50: 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  it into memory s
5a60: 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79 20 74  upplied .** by t
5a70: 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65 20 63  he caller. See c
5a80: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 77 72  omments above wr
5a90: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
5aa0: 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72 6d 61  () for the forma
5ab0: 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74 6f  t.** used to sto
5ac0: 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  re a master jour
5ad0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 61 74  nal file name at
5ae0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
5af0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
5b00: 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70  * zMaster must p
5b10: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
5b20: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61   of at least nMa
5b30: 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63  ster bytes alloc
5b40: 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63  ated by.** the c
5b50: 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75  aller. This shou
5b60: 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66  ld be sqlite3_vf
5b70: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28  s.mxPathname+1 (
5b80: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20  to ensure there 
5b90: 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61  is.** enough spa
5ba0: 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ce to write the 
5bb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5bc0: 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73  ame). If the mas
5bd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e  ter journal.** n
5be0: 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ame in the journ
5bf0: 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61  al is longer tha
5c00: 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  n nMaster bytes 
5c10: 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20  (including a.** 
5c20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c  nul-terminator),
5c30: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61   then this is ha
5c40: 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d  ndled as if no m
5c50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5c60: 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  me.** were prese
5c70: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
5c80: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 61  l..**.** If a ma
5c90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5ca0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5cb0: 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
5cc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
5cd0: 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ile, then it is 
5ce0: 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
5cf0: 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
5d00: 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20 41 0a  o by zMaster. A.
5d10: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
5d20: 72 20 62 79 74 65 20 69 73 20 61 70 70 65 6e 64  r byte is append
5d30: 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ed to the buffer
5d40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6d   following the m
5d50: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
5d60: 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a   file name..**.*
5d70: 2a 20 49 66 20 69 74 20 69 73 20 64 65 74 65 72  * If it is deter
5d80: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6d 61  mined that no ma
5d90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5da0: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5db0: 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b 30 5d  t .** zMaster[0]
5dc0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
5dd0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
5de0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ned..**.** If an
5df0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
5e00: 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d  ile reading from
5e10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e20: 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  e, an SQLite.** 
5e30: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
5e40: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
5e50: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
5e60: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
5e70: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
5e80: 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33 32 20  r *zMaster, u32 
5e90: 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  nMaster){.  int 
5ea0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
5eb0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
5ec0: 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32 20 6c   code */.  u32 l
5ed0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
5ee0: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
5ef0: 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61 73 74  in bytes of mast
5f00: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
5f10: 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  */.  i64 szJ;   
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 69 6e  /* Total size in
5f40: 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72 6e 61   bytes of journa
5f50: 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a 2f 0a  l file pJrnl */.
5f60: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f80: 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75  MJ checksum valu
5f90: 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f 75 72  e read from jour
5fa0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20  nal */.  u32 u; 
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
5fd0: 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
5fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5ff0: 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f 2a 20  aMagic[8];   /* 
6000: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
6010: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
6020: 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 5b 30  r */.  zMaster[0
6030: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69 66 28  ] = '\0';..  if(
6040: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
6050: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
6060: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
6070: 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36 0a 20  ).   || szJ<16. 
6080: 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
6090: 28 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73  (rc = read32bits
60a0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
60b0: 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c 65 6e  &len)).   || len
60c0: 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20 7c 7c  >=nMaster .   ||
60d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
60e0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
60f0: 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73  nl, szJ-12, &cks
6100: 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  um)).   || SQLIT
6110: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
6120: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
6130: 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d   aMagic, 8, szJ-
6140: 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63 6d 70  8)).   || memcmp
6150: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6160: 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20 7c 7c  lMagic, 8).   ||
6170: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
6180: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
6190: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
61a0: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
61b0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
61c0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
61d0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
61e0: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
61f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6200: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30  ame */.  for(u=0
6210: 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20  ; u<len; u++){. 
6220: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73     cksum -= zMas
6230: 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20 69 66  ter[u];.  }.  if
6240: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
6250: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
6260: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
6270: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
6280: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
6290: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
62a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
62b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
62c0: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
62d0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
62e0: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
62f0: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
6300: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
6310: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
6320: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
6330: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
6340: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
6350: 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20    len = 0;.  }. 
6360: 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20   zMaster[len] = 
6370: 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75  '\0';.   .  retu
6380: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6390: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
63a0: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
63b0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
63c0: 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c  at or immediatel
63d0: 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  y .** following 
63e0: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 50 61  the value in pPa
63f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
6400: 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65 63 74   assuming a sect
6410: 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 70  or .** size of p
6420: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
6430: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 69  e bytes..**.** i
6440: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
6450: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
6460: 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75 72 6e  **   Pager.journ
6470: 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20 20 52  alOff          R
6480: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 20  eturn value.**  
6490: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64d0: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20 20 35          0.**   5
64e0: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
64f0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
6500: 20 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20    100           
6510: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
6520: 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20 20 20  **   2000       
6530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
6540: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
6550: 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72  c i64 journalHdr
6560: 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a 70 50  Offset(Pager *pP
6570: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
6580: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
6590: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
65a0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
65b0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
65c0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
65d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
65e0: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
65f0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
6600: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6610: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
6620: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
6630: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
6640: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
6650: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
6660: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6670: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 66 66   );.  return off
6680: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  set;.}../*.** Th
6690: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
66a0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
66b0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
66c0: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
66d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
66e0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
66f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
6700: 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74 74 65   not been writte
6710: 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e 20 74  n to.** within t
6720: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
6730: 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69 66 20  action (i.e. if 
6740: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6750: 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  ==0)..**.** If d
6760: 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e 6f 6e  oTruncate is non
6770: 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50 61 67  -zero or the Pag
6780: 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69  er.journalSizeLi
6790: 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69 73 0a  mit variable is.
67a0: 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74 68 65  ** set to 0, the
67b0: 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  n truncate the j
67c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 7a  ournal file to z
67d0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
67e0: 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  e. Otherwise,.**
67f0: 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62 79 74   zero the 28-byt
6800: 65 20 68 65 61 64 65 72 20 61 74 20 74 68 65 20  e header at the 
6810: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
6820: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20 65 69  rnal file. In ei
6830: 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a 20 69  ther case, .** i
6840: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  f the pager is n
6850: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
6860: 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
6870: 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65 64 69  rnal file immedi
6880: 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65 72 20  ately .** after 
6890: 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75 6e 63  writing or trunc
68a0: 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ating it..**.** 
68b0: 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  If Pager.journal
68c0: 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73 65 74  SizeLimit is set
68d0: 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65 2c 20   to a positive, 
68e0: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
68f0: 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  and.** following
6900: 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
6910: 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73 63 72  or zeroing descr
6920: 69 62 65 64 20 61 62 6f 76 65 20 74 68 65 20 73  ibed above the s
6930: 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6a  ize of the .** j
6940: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
6950: 79 74 65 73 20 69 73 20 6c 61 72 67 65 72 20 74  ytes is larger t
6960: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
6970: 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68  then truncate th
6980: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
6990: 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75 72 6e  e to Pager.journ
69a0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79 74 65  alSizeLimit byte
69b0: 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  s. The journal f
69c0: 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ile does.** not 
69d0: 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e 63 65  need to be synce
69e0: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  d following this
69f0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
6a00: 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
6a10: 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64 6f 6e   occurs, abandon
6a20: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20   processing and 
6a30: 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20 65 72  return the IO er
6a40: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f 74 68  ror code..** Oth
6a50: 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20 53  erwise, return S
6a60: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
6a70: 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72  tic int zeroJour
6a80: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
6a90: 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e  ager, int doTrun
6aa0: 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  cate){.  int rc 
6ab0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6ae0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61  turn code */.  a
6af0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
6b00: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
6b10: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6b20: 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 63 6f  nalOff ){.    co
6b30: 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74 20 3d  nst i64 iLimit =
6b40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6b50: 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 2f 2a  SizeLimit;    /*
6b60: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
6b70: 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f 54 52  jsl */..    IOTR
6b80: 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20 25  ACE(("JZEROHDR %
6b90: 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
6ba0: 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61 74     if( doTruncat
6bb0: 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29  e || iLimit==0 )
6bc0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6bd0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
6be0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
6bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c00: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
6c10: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
6c20: 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63 20 3d   {0};.      rc =
6c30: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6c40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 65 72  pPager->jfd, zer
6c50: 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 65 72  oHdr, sizeof(zer
6c60: 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20 20 7d  oHdr), 0);.    }
6c70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
6c80: 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65  ITE_OK && !pPage
6c90: 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
6ca0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6cb0: 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
6cc0: 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  d, SQLITE_SYNC_D
6cd0: 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72 2d 3e  ATAONLY|pPager->
6ce0: 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
6cf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
6d00: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74 72 61  is point the tra
6d10: 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d  nsaction is comm
6d20: 69 74 74 65 64 20 62 75 74 20 74 68 65 20 77 72  itted but the wr
6d30: 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  ite lock .    **
6d40: 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64 20 6f   is still held o
6d50: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74  n the file. If t
6d60: 68 65 72 65 20 69 73 20 61 20 73 69 7a 65 20 6c  here is a size l
6d70: 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65 64 20  imit configured 
6d80: 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  for .    ** the 
6d90: 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e  persistent journ
6da0: 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  al and the journ
6db0: 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  al file currentl
6dc0: 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72 65 0a  y consumes more.
6dd0: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74 68 61      ** space tha
6de0: 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61 6c 6c  n that limit all
6df0: 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63 61 74  ows for, truncat
6e00: 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72 65 20  e it now. There 
6e10: 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 2a  is no need.    *
6e20: 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20 66 69  * to sync the fi
6e30: 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  le following thi
6e40: 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20  s operation..   
6e50: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
6e60: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 69  SQLITE_OK && iLi
6e70: 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  mit>0 ){.      i
6e80: 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72 63 20  64 sz;.      rc 
6e90: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
6ea0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
6eb0: 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69 66 28   &sz);.      if(
6ec0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
6ed0: 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  & sz>iLimit ){. 
6ee0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
6ef0: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
6f00: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69  ager->jfd, iLimi
6f10: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
6f20: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6f30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6f50: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6f60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
6f70: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
6f80: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
6f90: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
6fa0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
6fb0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6fc0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
6fd0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
6fe0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
6ff0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7000: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
7010: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
7020: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
7030: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
7040: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
7050: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
7060: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
7070: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
7080: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
7090: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
70a0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
70b0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
70c0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
70d0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
70e0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
70f0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
7100: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
7110: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
7120: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
7130: 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61 74 61   - 4 bytes: Data
7140: 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 0a  base page size..
7150: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
7160: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
7170: 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 6f  SZ - 28) bytes o
7180: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
7190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
71a0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
71b0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
71c0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
71d0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
71e0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
71f0: 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 48  de */.  char *zH
7200: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
7210: 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a 20 54  pTmpSpace;  /* T
7220: 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65 20 75  emporary space u
7230: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68 65 61  sed to build hea
7240: 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 48 65  der */.  u32 nHe
7250: 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ader = pPager->p
7260: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ageSize;     /* 
7270: 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70  Size of buffer p
7280: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 48 65  ointed to by zHe
7290: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 57  ader */.  u32 nW
72a0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
72c0: 20 42 79 74 65 73 20 6f 66 20 68 65 61 64 65 72   Bytes of header
72d0: 20 73 65 63 74 6f 72 20 77 72 69 74 74 65 6e 20   sector written 
72e0: 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20  */.  int ii;    
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7310: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
7320: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
7330: 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20  ager->jfd) );   
7340: 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69     /* Journal fi
7350: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  le must be open.
7360: 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65 61 64   */..  if( nHead
7370: 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  er>JOURNAL_HDR_S
7380: 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
7390: 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e   nHeader = JOURN
73a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
73b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
73c0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
73d0: 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
73e0: 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65 72 65  any of them were
73f0: 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a 20 73   created .  ** s
7400: 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65  ince the most re
7410: 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  cent journal hea
7420: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2c  der was written,
7430: 20 75 70 64 61 74 65 20 74 68 65 20 0a 20 20 2a   update the .  *
7440: 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  * PagerSavepoint
7450: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
7460: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
7470: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
7480: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
7490: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
74a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
74b0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
74c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
74d0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
74e0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
74f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7500: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
7510: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7520: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
7530: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72  ournalOff = jour
7540: 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61  nalHdrOffset(pPa
7550: 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  ger);.  memcpy(z
7560: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
7570: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
7580: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
7590: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
75a0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
75b0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
75c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
75d0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
75e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
75f0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
7600: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
7610: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
7620: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
7630: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
7640: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
7650: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
7660: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
7670: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
7680: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
7690: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
76a0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
76b0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
76c0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
76d0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
76e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
76f0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
7700: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
7710: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
7720: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
7730: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
7740: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
7750: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
7760: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
7770: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
7780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7790: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
77a0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
77b0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
77c0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
77d0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
77e0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
77f0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
7800: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
7810: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
7820: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
7830: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
7840: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
7850: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
7860: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
7870: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
7880: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
7890: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
78a0: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
78b0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
78c0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
78d0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
78e0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
78f0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
7900: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
7910: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
7920: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
7930: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
7940: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
7950: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
7960: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
7970: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
7980: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
7990: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
79a0: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
79b0: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
79c0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
79d0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
79e0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
79f0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
7a00: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
7a10: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
7a20: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
7a30: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
7a40: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
7a50: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7a60: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7a70: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
7a80: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
7a90: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7aa0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7ab0: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
7ac0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
7ad0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
7ae0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
7af0: 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
7b00: 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67  ness(sizeof(pPag
7b10: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20  er->cksumInit), 
7b20: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
7b30: 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  it);.  put32bits
7b40: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7b50: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7b60: 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  4], pPager->cksu
7b70: 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65  mInit);.  /* The
7b80: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
7b90: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33  e size */.  put3
7ba0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7bb0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7bc0: 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d  gic)+8], pPager-
7bd0: 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20  >dbOrigSize);.  
7be0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
7bf0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
7c00: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
7c10: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7c20: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
7c30: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
7c40: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7c50: 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 70 61  e);..  /* The pa
7c60: 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  ge size */.  put
7c70: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
7c80: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7c90: 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65  agic)+16], pPage
7ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
7cb0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
7cc0: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
7cd0: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
7ce0: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
7cf0: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
7d00: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
7d10: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
7d20: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
7d30: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
7d40: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
7d50: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
7d60: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
7d70: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
7d80: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
7d90: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
7da0: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
7db0: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
7dc0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7dd0: 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+20], 0,.     
7de0: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
7df0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
7e00: 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a 20 49  c)+20));..  /* I
7e10: 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69 73 20  n theory, it is 
7e20: 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79 20 74  only necessary t
7e30: 6f 20 77 72 69 74 65 20 74 68 65 20 32 38 20 62  o write the 28 b
7e40: 79 74 65 73 20 74 68 61 74 20 74 68 65 20 0a 20  ytes that the . 
7e50: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
7e60: 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f 20 74  er consumes to t
7e70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7e80: 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63 72 65  here. Then incre
7e90: 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a 20 50  ment the .  ** P
7ea0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
7eb0: 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f 55 52  variable by JOUR
7ec0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20 74 68  NAL_HDR_SZ so th
7ed0: 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20 20 2a  at the next .  *
7ee0: 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72 69 74  * record is writ
7ef0: 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ten to the follo
7f00: 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c 65 61  wing sector (lea
7f10: 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20 74 68  ving a gap in th
7f20: 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68 61 74  e file.  ** that
7f30: 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69 63 69   will be implici
7f40: 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20 62 79  tly filled in by
7f50: 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a 0a 20   the OS)..  **. 
7f60: 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74 20 68   ** However it h
7f70: 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76 65 72  as been discover
7f80: 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d 65 20  ed that on some 
7f90: 73 79 73 74 65 6d 73 20 74 68 69 73 20 70 61 74  systems this pat
7fa0: 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a 20 62  tern can .  ** b
7fb0: 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20  e significantly 
7fc0: 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f 6e 74  slower than cont
7fd0: 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69 6e 67  iguously writing
7fe0: 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69 6c   data to the fil
7ff0: 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20  e,.  ** even if 
8000: 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70 6c 69  that means expli
8010: 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20 64 61  citly writing da
8020: 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63 6b 20  ta to the block 
8030: 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52 4e 41  of .  ** (JOURNA
8040: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
8050: 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c 20 6e  ytes that will n
8060: 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f 20 74  ot be used. So t
8070: 68 61 74 20 69 73 20 77 68 61 74 0a 20 20 2a 2a  hat is what.  **
8080: 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a 2a 0a   is done. .  **.
8090: 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20 69 73    ** The loop is
80a0: 20 72 65 71 75 69 72 65 64 20 68 65 72 65 20 69   required here i
80b0: 6e 20 63 61 73 65 20 74 68 65 20 73 65 63 74 6f  n case the secto
80c0: 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67 65 72  r-size is larger
80d0: 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20   than the .  ** 
80e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69  database page si
80f0: 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20 7a 48  ze. Since the zH
8100: 65 61 64 65 72 20 62 75 66 66 65 72 20 69 73 20  eader buffer is 
8110: 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67 65 53  only Pager.pageS
8120: 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  ize.  ** bytes i
8130: 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74 68 61  n size, more tha
8140: 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 73 71  n one call to sq
8150: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20 6d  lite3OsWrite() m
8160: 61 79 20 62 65 20 72 65 71 75 69 72 65 64 0a 20  ay be required. 
8170: 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74 65 20   ** to populate 
8180: 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e  the entire journ
8190: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
81a0: 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 6e 57  ..  */ .  for(nW
81b0: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
81c0: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
81d0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
81e0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
81f0: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
8200: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
8210: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
8220: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
8230: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
8240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8250: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8260: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
8270: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
8280: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
8290: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
82a0: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
82b0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
82c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
82d0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
82e0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
82f0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
8300: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8310: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
8320: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
8330: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
8340: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
8350: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
8360: 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72 65   file. The curre
8370: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
8380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8390: 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70  is given by.** p
83a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
83b0: 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  f. See comments 
83c0: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
83d0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
83e0: 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72 69   for.** a descri
83f0: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f 75  ption of the jou
8400: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
8410: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
8420: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
8430: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 70  successfully, *p
8440: 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  NRec is set to t
8450: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
8460: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
8470: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
8480: 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65 20  er and *pDbSize 
8490: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
84a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
84b0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
84c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
84d0: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
84e0: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
84f0: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
8500: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
8510: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
8520: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
8530: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
8540: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
8550: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
8560: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8570: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
8580: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
8590: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
85a0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52 65  turned and *pNRe
85b0: 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20 61  c and *PDbSize a
85c0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20 49  re undefined.  I
85d0: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
85e0: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
85f0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
8600: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
8610: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8620: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8630: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
8640: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
8650: 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
8660: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
8670: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
8680: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20  journalSize,    
8690: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
86a0: 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75   of the open jou
86b0: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
86c0: 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52  es */.  u32 *pNR
86d0: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
86e0: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c       /* OUT: Val
86f0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
8700: 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20   nRec field */. 
8710: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20   u32 *pDbSize   
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8730: 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f   OUT: Value of o
8740: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
8750: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29   size field */.)
8760: 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8790: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
87a0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20  ar aMagic[8];   
87b0: 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f    /* A buffer to
87c0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
87d0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
87e0: 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
87f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
8800: 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  et of journal he
8810: 61 64 65 72 20 62 65 69 6e 67 20 72 65 61 64 20  ader being read 
8820: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73  */..  assert( is
8830: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
8840: 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75  ) );      /* Jou
8850: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
8860: 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a  e open. */..  /*
8870: 20 41 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a   Advance Pager.j
8880: 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65  ournalOff to the
8890: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
88a0: 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68  xt sector. If th
88b0: 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  e.  ** journal f
88c0: 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c  ile is too small
88d0: 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
88e0: 20 61 20 68 65 61 64 65 72 20 73 74 6f 72 65 64   a header stored
88f0: 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f   at this.  ** po
8900: 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  int, return SQLI
8910: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20  TE_DONE..  */.  
8920: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8930: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8940: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
8950: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
8960: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
8970: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
8980: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
8990: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
89a0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48  E_DONE;.  }.  iH
89b0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
89c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
89d0: 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 66 69  * Read in the fi
89e0: 72 73 74 20 38 20 62 79 74 65 73 20 6f 66 20 74  rst 8 bytes of t
89f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
8a00: 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f  r. If they do no
8a10: 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65  t match.  ** the
8a20: 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66    magic string f
8a30: 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74 61 72  ound at the star
8a40: 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61  t of each journa
8a50: 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e  l header, return
8a60: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
8a70: 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  E. If an IO erro
8a80: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
8a90: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20   an error code. 
8aa0: 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20  Otherwise,.  ** 
8ab0: 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
8ac0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8ad0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
8ae0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
8af0: 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29  Magic), iHdrOff)
8b00: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
8b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
8b20: 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d  .  if( memcmp(aM
8b30: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8b40: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8b50: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ic))!=0 ){.    r
8b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8b70: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  E;.  }..  /* Rea
8b80: 64 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  d the first thre
8b90: 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20  e 32-bit fields 
8ba0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
8bb0: 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a  eader: The nRec.
8bc0: 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20    ** field, the 
8bd0: 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c  checksum-initial
8be0: 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64 61 74  izer and the dat
8bf0: 61 62 61 73 65 20 73 69 7a 65 20 61 74 20 74 68  abase size at th
8c00: 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20  e start.  ** of 
8c10: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
8c20: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
8c30: 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
8c40: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20  g goes wrong..  
8c50: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
8c60: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
8c70: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8c80: 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52  , iHdrOff+8, pNR
8c90: 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ec)).   || SQLIT
8ca0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8cb0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8cc0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20  fd, iHdrOff+12, 
8cd0: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
8ce0: 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  it)).   || SQLIT
8cf0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8d00: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8d10: 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20  fd, iHdrOff+16, 
8d20: 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20  pDbSize)).  ){. 
8d30: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
8d40: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
8d50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
8d60: 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67 65 53  {.    u32 iPageS
8d70: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8d80: 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20     /* Page-size 
8d90: 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c  field of journal
8da0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
8db0: 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20  32 iSectorSize; 
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8dd0: 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64  ector-size field
8de0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
8df0: 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50  er */.    u16 iP
8e00: 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20  ageSize16;      
8e10: 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
8e20: 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31  f iPageSize in 1
8e30: 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a  6-bit variable *
8e40: 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  /..    /* Read t
8e50: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
8e60: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75   sector-size jou
8e70: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c  rnal header fiel
8e80: 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53  ds. */.    if( S
8e90: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
8ea0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8eb0: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
8ec0: 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  20, &iSectorSize
8ed0: 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
8ee0: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8ef0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8f00: 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20  fd, iHdrOff+24, 
8f10: 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20  &iPageSize)).   
8f20: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
8f30: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
8f40: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
8f50: 65 20 76 61 6c 75 65 73 20 72 65 61 64 20 66 72  e values read fr
8f60: 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  om the page-size
8f70: 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
8f80: 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61   fields.    ** a
8f90: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
8fa0: 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65   To be 'in range
8fb0: 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e  ', both values n
8fc0: 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  eed to be a powe
8fd0: 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20  r.    ** of two 
8fe0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
8ff0: 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20 61 6e  equal to 512, an
9000: 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20 74 68  d not greater th
9010: 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20 2a 2a  an their .    **
9020: 20 72 65 73 70 65 63 74 69 76 65 20 63 6f 6d 70   respective comp
9030: 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d 75 6d  ile time maximum
9040: 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a 2f 0a   limits..    */.
9050: 20 20 20 20 69 66 28 20 69 50 61 67 65 53 69 7a      if( iPageSiz
9060: 65 3c 35 31 32 20 20 20 20 20 20 20 20 20 20 20  e<512           
9070: 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f         || iSecto
9080: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 7c  rSize<512.     |
9090: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
90a0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
90b0: 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e   || iSectorSize>
90c0: 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a  MAX_SECTOR_SIZE.
90d0: 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67 65 53       || ((iPageS
90e0: 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65  ize-1)&iPageSize
90f0: 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53 65 63  )!=0   || ((iSec
9100: 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65 63 74  torSize-1)&iSect
9110: 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20 20 20  orSize)!=0 .    
9120: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
9130: 68 65 20 65 69 74 68 65 72 20 74 68 65 20 70 61  he either the pa
9140: 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63 74 6f  ge-size or secto
9150: 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6a 6f  r-size in the jo
9160: 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20  urnal-header is 
9170: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61 6c 69  .      ** invali
9180: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  d, then the proc
9190: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
91a0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  he journal-heade
91b0: 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20 20 20  r must have .   
91c0: 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20 62 65     ** crashed be
91d0: 66 6f 72 65 20 74 68 65 20 68 65 61 64 65 72 20  fore the header 
91e0: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
91f0: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
9200: 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a 2a 20  ading .      ** 
9210: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9220: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   here..      */.
9230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9240: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
9250: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
9260: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74 6f 20  he page-size to 
9270: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9280: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
9290: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a 20 55  urnal. .    ** U
92a0: 73 65 20 61 20 74 65 73 74 63 61 73 65 28 29 20  se a testcase() 
92b0: 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20 73 75  macro to make su
92c0: 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63 20 66  re that malloc f
92d0: 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20 0a 20  ailure within . 
92e0: 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74 50 61     ** PagerSetPa
92f0: 67 65 73 69 7a 65 28 29 20 69 73 20 74 65 73 74  gesize() is test
9300: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
9310: 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28 75 31  PageSize16 = (u1
9320: 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  6)iPageSize;.   
9330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9340: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
9350: 61 67 65 72 2c 20 26 69 50 61 67 65 53 69 7a 65  ager, &iPageSize
9360: 31 36 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  16);.    testcas
9370: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
9380: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9390: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
93a0: 20 69 50 61 67 65 53 69 7a 65 31 36 3d 3d 28 75   iPageSize16==(u
93b0: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
93c0: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
93d0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
93e0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
93f0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
9400: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
9410: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
9420: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
9430: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
9440: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
9450: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
9460: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
9470: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
9480: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
9490: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
94a0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
94b0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
94c0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
94d0: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
94e0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
94f0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
9500: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
9510: 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
9520: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
9530: 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d  iSectorSize;.  }
9540: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
9550: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
9560: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9570: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
9580: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
9590: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
95a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
95b0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
95c0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
95d0: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
95e0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
95f0: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
9600: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
9610: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
9620: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
9630: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
9640: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9650: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9660: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
9670: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
9680: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
9690: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
96a0: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
96b0: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
96c0: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
96d0: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  mat is:.**.**   
96e0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
96f0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b  _MJ_PGNO..**   +
9700: 20 4e 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   N bytes: Master
9710: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
9720: 65 20 69 6e 20 75 74 66 2d 38 2e 0a 2a 2a 20 20  e in utf-8..**  
9730: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 20 28 6c   + 4 bytes: N (l
9740: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
9750: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 20  journal name in 
9760: 62 79 74 65 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65  bytes, no nul-te
9770: 72 6d 69 6e 61 74 6f 72 29 2e 0a 2a 2a 20 20 20  rminator)..**   
9780: 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65  + 4 bytes: Maste
9790: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63  r journal name c
97a0: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20  hecksum..**   + 
97b0: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
97c0: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
97d0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
97e0: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
97f0: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
9800: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
9810: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
9820: 6c 20 6e 61 6d 65 2c 20 77 68 65 72 65 20 65 61  l name, where ea
9830: 63 68 20 62 79 74 65 20 69 73 20 69 6e 74 65 72  ch byte is inter
9840: 70 72 65 74 65 64 20 61 73 20 61 20 73 69 67 6e  preted as a sign
9850: 65 64 20 38 2d 62 69 74 20 69 6e 74 65 67 65 72  ed 8-bit integer
9860: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
9870: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
9880: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
9890: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
98a0: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
98b0: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
98c0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
98d0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
98e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
98f0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
9900: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
9910: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
9940: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 73  de */.  int nMas
9950: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
9960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9970: 74 68 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  th of string zMa
9980: 73 74 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ster */.  i64 iH
9990: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
99a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
99b0: 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 69  fset of header i
99c0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  n journal file *
99d0: 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  /.  i64 jrnlSize
99e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
99f0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
9a00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 20  journal file on 
9a10: 64 69 73 6b 20 2a 2f 0a 20 20 75 33 32 20 63 6b  disk */.  u32 ck
9a20: 73 75 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  sum = 0;        
9a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
9a40: 65 63 6b 73 75 6d 20 6f 66 20 73 74 72 69 6e 67  ecksum of string
9a50: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 0a 20 20 69   zMaster */..  i
9a60: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
9a70: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9a80: 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  .   || pPager->j
9a90: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
9aa0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
9ab0: 4d 4f 52 59 20 0a 20 20 20 7c 7c 20 70 50 61 67  MORY .   || pPag
9ac0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9ad0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9ae0: 44 45 5f 4f 46 46 20 0a 20 20 29 7b 0a 20 20 20  DE_OFF .  ){.   
9af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9b00: 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
9b10: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
9b20: 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
9b30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
9b40: 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65  ..  /* Calculate
9b50: 20 74 68 65 20 6c 65 6e 67 74 68 20 69 6e 20 62   the length in b
9b60: 79 74 65 73 20 61 6e 64 20 74 68 65 20 63 68 65  ytes and the che
9b70: 63 6b 73 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72  cksum of zMaster
9b80: 20 2a 2f 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65   */.  for(nMaste
9b90: 72 3d 30 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61  r=0; zMaster[nMa
9ba0: 73 74 65 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b  ster]; nMaster++
9bb0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
9bc0: 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d  zMaster[nMaster]
9bd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
9be0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
9bf0: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
9c00: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
9c10: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
9c20: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
9c30: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
9c40: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
9c50: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
9c60: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
9c70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
9c80: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
9c90: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
9ca0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
9cb0: 63 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  c ){.    pPager-
9cc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
9cd0: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
9ce0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48  Pager);.  }.  iH
9cf0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
9d00: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
9d10: 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
9d20: 65 72 20 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20  er journal data 
9d30: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9d40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
9d50: 49 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  If.  ** an error
9d60: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9d70: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
9d80: 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  o the caller..  
9d90: 2a 2f 0a 20 20 69 66 28 20 28 30 20 21 3d 20 28  */.  if( (0 != (
9da0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
9db0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9dc0: 64 72 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f  drOff, PAGER_MJ_
9dd0: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 29 29 0a  PGNO(pPager)))).
9de0: 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
9df0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9e00: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
9e10: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20  aster, nMaster, 
9e20: 69 48 64 72 4f 66 66 2b 34 29 29 29 0a 20 20 20  iHdrOff+4))).   
9e30: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77  || (0 != (rc = w
9e40: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
9e50: 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b  r->jfd, iHdrOff+
9e60: 34 2b 6e 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74  4+nMaster, nMast
9e70: 65 72 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  er))).   || (0 !
9e80: 3d 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62  = (rc = write32b
9e90: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
9ea0: 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74   iHdrOff+4+nMast
9eb0: 65 72 2b 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20  er+4, cksum))). 
9ec0: 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d    || (0 != (rc =
9ed0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
9ee0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
9ef0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69  urnalMagic, 8, i
9f00: 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72  HdrOff+4+nMaster
9f10: 2b 38 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  +8))).  ){.    r
9f20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
9f30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9f40: 66 66 20 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32  ff += (nMaster+2
9f50: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  0);.  pPager->ne
9f60: 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
9f70: 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20  ->noSync;..  /* 
9f80: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
9f90: 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75  in peristent-jou
9fa0: 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20  rnal mode, then 
9fb0: 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20  the physical .  
9fc0: 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  ** journal-file 
9fd0: 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20  may extend past 
9fe0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d  the end of the m
9ff0: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61  aster-journal na
a000: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79  me.  ** and 8 by
a010: 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74  tes of magic dat
a020: 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74  a just written t
a030: 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73  o the file. This
a040: 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72   is .  ** danger
a050: 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20  ous because the 
a060: 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  code to rollback
a070: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
a080: 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ile.  ** will no
a090: 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e  t be able to fin
a0a0: 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  d the master-jou
a0b0: 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74  rnal name to det
a0c0: 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65  ermine .  ** whe
a0d0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
a0e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20  journal is hot. 
a0f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65  .  **.  ** Easie
a100: 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69  st thing to do i
a110: 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20  n this scenario 
a120: 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  is to truncate t
a130: 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
a140: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71   file to the req
a150: 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f  uired size..  */
a160: 20 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f   .  if( SQLITE_O
a170: 4b 3d 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K==(rc = sqlite3
a180: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
a190: 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
a1a0: 65 29 29 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69  e)).   && jrnlSi
a1b0: 7a 65 3e 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ze>pPager->journ
a1c0: 61 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  alOff.  ){.    r
a1d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
a1e0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
a1f0: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
a200: 61 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65  alOff);.  }.  re
a210: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
a220: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
a230: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
a240: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
a250: 75 6d 62 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a  umber. Return.**
a260: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
a270: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
a280: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
a290: 70 61 67 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  page is not .** 
a2a0: 61 6c 72 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72  already in memor
a2b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  y..*/.static PgH
a2c0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
a2d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a2e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
a2f0: 48 64 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Hdr *p;         
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a310: 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
a320: 2a 2f 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e  */..  /* It is n
a330: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
a340: 61 20 63 61 6c 6c 20 74 6f 20 50 63 61 63 68 65  a call to Pcache
a350: 46 65 74 63 68 28 29 20 77 69 74 68 20 63 72 65  Fetch() with cre
a360: 61 74 65 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20  ateFlag==0 to.  
a370: 2a 2a 20 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e  ** fail, since n
a380: 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c  o attempt to all
a390: 6f 63 61 74 65 20 64 79 6e 61 6d 69 63 20 6d 65  ocate dynamic me
a3a0: 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 6d 61 64  mory will be mad
a3b0: 65 2e 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29  e..  */.  (void)
a3c0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74  sqlite3PcacheFet
a3d0: 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ch(pPager->pPCac
a3e0: 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29  he, pgno, 0, &p)
a3f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
a400: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68  ./*.** Unless th
a410: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
a420: 72 6f 72 2d 73 74 61 74 65 2c 20 64 69 73 63 61  ror-state, disca
a430: 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  rd all in-memory
a440: 20 70 61 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68   pages. If.** th
a450: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 72  e pager is in er
a460: 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 65 6e 20  ror-state, then 
a470: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
a480: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  o-op..**.** TODO
a490: 3a 20 57 68 79 20 63 61 6e 20 77 65 20 6e 6f 74  : Why can we not
a4a0: 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72   reset the pager
a4b0: 20 77 68 69 6c 65 20 69 6e 20 65 72 72 6f 72 20   while in error 
a4c0: 73 74 61 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63  state?.*/.static
a4d0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
a4e0: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
a4f0: 7b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  {.  if( SQLITE_O
a500: 4b 3d 3d 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  K==pPager->errCo
a510: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
a520: 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
a530: 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
a540: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
a550: 68 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  heClear(pPager->
a560: 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 70 50  pPCache);.    pP
a570: 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
a580: 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 0;.  }.}../*
a590: 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72  .** Free all str
a5a0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 50  uctures in the P
a5b0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b  ager.aSavepoint[
a5c0: 5d 20 61 72 72 61 79 20 61 6e 64 20 73 65 74 20  ] array and set 
a5d0: 62 6f 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53  both.** Pager.aS
a5e0: 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67  avepoint and Pag
a5f0: 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f  er.nSavepoint to
a600: 20 7a 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65   zero. Close the
a610: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
a620: 69 66 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e  if it is open an
a630: 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e  d the pager is n
a640: 6f 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ot in exclusive 
a650: 6d 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mode..*/.static 
a660: 76 6f 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53  void releaseAllS
a670: 61 76 65 70 6f 69 6e 74 73 28 50 61 67 65 72 20  avepoints(Pager 
a680: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
a690: 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
a6a0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f    /* Iterator fo
a6b0: 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
a6c0: 68 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69  h Pager.aSavepoi
a6d0: 6e 74 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  nt */.  for(ii=0
a6e0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
a6f0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
a700: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
a710: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
a720: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
a730: 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
a740: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
a750: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
a760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
a770: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
a780: 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
a790: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
a7a0: 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
a7b0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
a7c0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
a7d0: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
a7e0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52  .  pPager->nSubR
a7f0: 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ec = 0;.}../*.**
a800: 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75 6d   Set the bit num
a810: 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ber pgno in the 
a820: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
a830: 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20  InSavepoint .** 
a840: 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20 6f  bitvecs of all o
a850: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
a860: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
a870: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 2a   if successful.*
a880: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  * or SQLITE_NOME
a890: 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61  M if a malloc fa
a8a0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a 2f  ilure occurs..*/
a8b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 54  .static int addT
a8c0: 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
a8d0: 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  s(Pager *pPager,
a8e0: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
a8f0: 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
a900: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
a910: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
a920: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a930: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
a940: 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f 72  t code */..  for
a950: 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72  (ii=0; ii<pPager
a960: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69  ->nSavepoint; ii
a970: 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61  ++){.    PagerSa
a980: 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50  vepoint *p = &pP
a990: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
a9a0: 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67  [ii];.    if( pg
a9b0: 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a  no<=p->nOrig ){.
a9c0: 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c 69        rc |= sqli
a9d0: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d 3e  te3BitvecSet(p->
a9e0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
a9f0: 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  no);.      testc
aa00: 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ase( rc==SQLITE_
aa10: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 61  NOMEM );.      a
aa20: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
aa30: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
aa40: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
aa50: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
aa60: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
aa70: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
aa80: 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  file. This funct
aa90: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
aaa0: 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 69  f the pager.** i
aab0: 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
aac0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ode..**.** If th
aad0: 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72 65  e pager is curre
aae0: 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74  ntly in error st
aaf0: 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68 65  ate, discard the
ab00: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a   contents of .**
ab10: 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
ab20: 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20 73  eset the Pager s
ab30: 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61  tructure interna
ab40: 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65 72  l state. If ther
ab50: 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20  e is.** an open 
ab60: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68  journal-file, th
ab70: 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  en the next time
ab80: 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
ab90: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e  s obtained.** on
aba0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
abb0: 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20  (by this or any 
abc0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20  other process), 
abd0: 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72  it will be.** tr
abe0: 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a  eated as a hot-j
abf0: 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65  ournal and rolle
ac00: 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  d back..*/.stati
ac10: 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c  c void pager_unl
ac20: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
ac30: 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
ac40: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
ac50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20   ){.    int rc; 
ac60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac70: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ac80: 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  ode */..    /* A
ac90: 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20  lways close the 
aca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
acb0: 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64  n dropping the d
acc0: 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20  atabase lock..  
acd0: 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
ace0: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
acf0: 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f  on with journal_
ad00: 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68  mode=delete migh
ad10: 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20  t.    ** delete 
ad20: 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f  the file out fro
ad30: 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20  m under us..    
ad40: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  */.    sqlite3Os
ad50: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
ad60: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  d);.    sqlite3B
ad70: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
ad80: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
ad90: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
ada0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
adb0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
adc0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
add0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
ade0: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
adf0: 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20 6d   somebody else m
ae00: 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e 20  ight change it. 
ae10: 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  The.    ** value
ae20: 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67 65  s stored in Page
ae30: 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d 69  r.dbSize etc. mi
ae40: 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  ght become inval
ae50: 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 69  id if.    ** thi
ae60: 73 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f 3a  s happens. TODO:
ae70: 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64 6f   Really, this do
ae80: 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62 65  esn't need to be
ae90: 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a 20   cleared.    ** 
aea0: 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67 65  until the change
aeb0: 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20 66  -counter check f
aec0: 61 69 6c 73 20 69 6e 20 70 61 67 65 72 53 68 61  ails in pagerSha
aed0: 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20 2a  redLock()..    *
aee0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  /.    pPager->db
aef0: 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 0a  SizeValid = 0;..
af00: 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
af10: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
af20: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
af30: 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  rc ){.      pPag
af40: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
af50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52  ;.    }.    IOTR
af60: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
af70: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20  n", pPager))..  
af80: 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65 72    /* If Pager.er
af90: 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74 68  rCode is set, th
afa0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
afb0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63 61  e pager cache ca
afc0: 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20 74  nnot be.    ** t
afd0: 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74  rusted. Now that
afe0: 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
aff0: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  is unlocked, the
b000: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b010: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61  .    ** cache ca
b020: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
b030: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
b040: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
b050: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b060: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b070: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
b080: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b090: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b0a0: 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
b0b0: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
b0c0: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
b0d0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
b0e0: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
b0f0: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
b100: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
b110: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
b120: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
b130: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
b140: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65  ld be called whe
b150: 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52 52  n an IOERR, CORR
b160: 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72 6f  UPT or FULL erro
b170: 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f 63  r.** may have oc
b180: 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72 73  curred. The firs
b190: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
b1a0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b1b0: 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74 75  ager .** structu
b1c0: 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 74  re, the second t
b1d0: 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62  he error-code ab
b1e0: 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e  out to be return
b1f0: 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a 2a  ed by a pager .*
b200: 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  * API function. 
b210: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
b220: 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  ed is a copy of 
b230: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
b240: 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73 20  ent .** to this 
b250: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
b260: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
b270: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
b280: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
b290: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
b2a0: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
b2b0: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
b2c0: 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74  sistent. Until t
b2d0: 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72 72  he persisten err
b2e0: 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a  or is cleared,.*
b2f0: 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  * subsequent API
b300: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
b310: 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69  ager will immedi
b320: 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65  ately return the
b330: 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20   same .** error 
b340: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65  code..**.** A pe
b350: 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69  rsistent error i
b360: 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
b370: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b380: 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a  e pager-cache .*
b390: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  * cannot be trus
b3a0: 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65 20  ted. This state 
b3b0: 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62  can be cleared b
b3c0: 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73  y completely dis
b3d0: 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20  carding .** the 
b3e0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
b3f0: 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20  pager-cache. If 
b400: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
b410: 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a  s active when.**
b420: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
b430: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20  error occurred, 
b440: 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  then the rollbac
b450: 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65  k journal may ne
b460: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c  ed.** to be repl
b470: 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20  ayed to restore 
b480: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
b490: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b4a0: 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20 77  e (as if.** it w
b4b0: 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ere a hot-journa
b4c0: 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l)..*/.static in
b4d0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
b4e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b4f0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
b500: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
b510: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
b520: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b530: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
b540: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
b550: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
b560: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
b570: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
b580: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
b590: 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  .  );.  if(.    
b5a0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
b5b0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
b5c0: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
b5d0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
b5e0: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
b5f0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
b600: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  rc;.    if( pPag
b610: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
b620: 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26  _UNLOCK .     &&
b630: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
b640: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
b650: 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
b660: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
b670: 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
b680: 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61  ady unlocked, ca
b690: 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ll pager_unlock(
b6a0: 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a  ) now to.      *
b6b0: 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  * clear the erro
b6c0: 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75  r state and ensu
b6d0: 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
b6e0: 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20  r-cache is .    
b6f0: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20    ** completely 
b700: 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  empty..      */.
b710: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
b720: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
b730: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
b740: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  c;.}../*.** Exec
b750: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
b760: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
b770: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
b780: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
b790: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
b7a0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
b7b0: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
b7c0: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
b7d0: 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74 65  ate, do not atte
b7e0: 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  mpt .** the roll
b7f0: 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69 6d  back at this tim
b800: 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67 65  e. Instead, page
b810: 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63 61  r_unlock() is ca
b820: 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61 6c  lled. The.** cal
b830: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
b840: 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72 64  k() will discard
b850: 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70   all in-memory p
b860: 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a 20  ages, unlock.** 
b870: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
b880: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
b890: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66 20  error state. If 
b8a0: 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a  this means that.
b8b0: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  ** there is a ho
b8c0: 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 69  t-journal left i
b8d0: 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
b8e0: 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e 6e  m, the next conn
b8f0: 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62 74  ection.** to obt
b900: 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f 63  ain a shared loc
b910: 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20 28  k on the pager (
b920: 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68 69  which may be thi
b930: 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20 72  s one) will.** r
b940: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
b950: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
b960: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
b970: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
b980: 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e 20  r state, but an 
b990: 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63 20  IO or.** malloc 
b9a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
b9b0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
b9c0: 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20 69  then this will i
b9d0: 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a 20  tself cause .** 
b9e0: 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74  the pager to ent
b9f0: 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  er the error sta
ba00: 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20 62  te. Which will b
ba10: 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68 65  e cleared by the
ba20: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67 65  .** call to page
ba30: 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20 64  r_unlock(), as d
ba40: 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e 0a  escribed above..
ba50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
ba60: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
ba70: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
ba80: 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
ba90: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
baa0: 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72  ITE_OK && pPager
bab0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
bac0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
bad0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
bae0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73  nMalloc();.    s
baf0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
bb00: 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
bb10: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
bb20: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20  nMalloc();.  }. 
bb30: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
bb40: 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
bb50: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
bb60: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
bb70: 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   A transaction i
bb80: 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64 20  s usually ended 
bb90: 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  by .** either a 
bba0: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
bbb0: 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  BACK operation. 
bbc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
bbd0: 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 61   be called .** a
bbe0: 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66  fter rollback of
bbf0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 20   a hot-journal, 
bc00: 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
bc10: 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
bc20: 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ing.** the journ
bc30: 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74 69  al file or writi
bc40: 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72 73  ng the very firs
bc50: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
bc60: 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61 73   of a.** databas
bc70: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
bc80: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
bc90: 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53  er is in PAGER_S
bca0: 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f 55  HARED or PAGER_U
bcb0: 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65 6e  NLOCK state when
bcc0: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
bcd0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
bce0: 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75 72  s a no-op (retur
bcf0: 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a  ns SQLITE_OK)..*
bd00: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
bd10: 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65 70  any active savep
bd20: 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61 73  oints are releas
bd30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
bd40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
bd50: 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 69   open, then it i
bd60: 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20 4f  s "finalized". O
bd70: 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a 2a  nce a journal .*
bd80: 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  * file has been 
bd90: 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73 20  finalized it is 
bda0: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
bdb0: 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20 62  use it to roll b
bdc0: 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73 61  ack a .** transa
bdd0: 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c 20  ction. Nor will 
bde0: 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  it be considered
bdf0: 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f 75   to be a hot-jou
be00: 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a 20  rnal by this.** 
be10: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61 74  or any other dat
be20: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
be30: 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61 20  . Exactly how a 
be40: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
be50: 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73 20  ized.** depends 
be60: 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
be70: 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  t the pager is r
be80: 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
be90: 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a 20  ive mode and.** 
bea0: 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75 72  the current jour
beb0: 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72 2e  nal-mode (Pager.
bec0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c 75  journalMode valu
bed0: 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  e), as follows:.
bee0: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
bef0: 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20 20  ode==MEMORY.**  
bf00: 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     Journal file 
bf10: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73 69  descriptor is si
bf20: 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68 69  mply closed. Thi
bf30: 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a 2a  s destroys an .*
bf40: 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20  *     in-memory 
bf50: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20  journal..**.**  
bf60: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54 52   journalMode==TR
bf70: 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a 6f  UNCATE.**     Jo
bf80: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74 72  urnal file is tr
bf90: 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
bfa0: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
bfb0: 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f  *.**   journalMo
bfc0: 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20 20  de==PERSIST.**  
bfd0: 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38 20     The first 28 
bfe0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75  bytes of the jou
bff0: 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a 65  rnal file are ze
c000: 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61 6c  roed. This inval
c010: 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74 68  idates.**     th
c020: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
c030: 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66 69  header in the fi
c040: 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74 68  le, and hence th
c050: 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
c060: 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41 6e  .**     file. An
c070: 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61 6c   invalid journal
c080: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20   file cannot be 
c090: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
c0a0: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
c0b0: 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 20  ==DELETE.**     
c0c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
c0d0: 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 64   is closed and d
c0e0: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71 6c  eleted using sql
c0f0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a  ite3OsDelete()..
c100: 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 65  **.**     If the
c110: 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
c120: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
c130: 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f 64  ode, this method
c140: 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a 2a   of finalizing.*
c150: 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61  *     the journa
c160: 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
c170: 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20 69  used. Instead, i
c180: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f 64  f the journalMod
c190: 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c 45  e is.**     DELE
c1a0: 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  TE and the pager
c1b0: 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65   is in exclusive
c1c0: 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68 6f   mode, the metho
c1d0: 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64 65  d described unde
c1e0: 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c  r.**     journal
c1f0: 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69 73  Mode==PERSIST is
c200: 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
c210: 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 6a  *.** After the j
c220: 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c 69  ournal is finali
c230: 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67 20  zed, if running 
c240: 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76 65  in non-exclusive
c250: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70 61   mode, the.** pa
c260: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41 47  ger moves to PAG
c270: 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 20  ER_SHARED state 
c280: 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73 20  (and downgrades 
c290: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
c2a0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c2b0: 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a 2a   accordingly)..*
c2c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
c2d0: 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
c2e0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
c2f0: 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f 53  nd is in PAGER_S
c300: 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a 20  YNCED state,.** 
c310: 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47 45  it moves to PAGE
c320: 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f 20  R_EXCLUSIVE. No 
c330: 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67 72  locks are downgr
c340: 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69 6e  aded when runnin
c350: 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69 76  g in.** exclusiv
c360: 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e mode..**.** SQ
c370: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
c380: 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
c390: 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
c3a0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
c3b0: 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65 20  g.** any of the 
c3c0: 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  IO operations to
c3d0: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
c3e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75 6e  urnal file or un
c3f0: 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61  lock the.** data
c400: 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49 4f  base then the IO
c410: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
c420: 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75  eturned to the u
c430: 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a 20  ser. If the .** 
c440: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69 6e  operation to fin
c450: 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61  alize the journa
c460: 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74 68  l file fails, th
c470: 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69 6c  en the code stil
c480: 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75 6e  l.** tries to un
c490: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
c4a0: 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69 6e  e file if not in
c4b0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c4c0: 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f 63   If the.** unloc
c4d0: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  k operation fail
c4e0: 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e 20  s as well, then 
c4f0: 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72 20  the first error 
c500: 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a 20  code related.** 
c510: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72 72  to the first err
c520: 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 28  or encountered (
c530: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61  the journal fina
c540: 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69 73  lization one) is
c550: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  .** returned..*/
c560: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
c570: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
c580: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
c590: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
c5a0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c5b0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 45  TE_OK;      /* E
c5c0: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 6a  rror code from j
c5d0: 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
c5e0: 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
c5f0: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
c600: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 45  ITE_OK;     /* E
c610: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 64  rror code from d
c620: 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f 70  b file unlock op
c630: 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66  eration */..  if
c640: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
c650: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
c660: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c670: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
c680: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
c690: 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 61  ts(pPager);..  a
c6a0: 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
c6b0: 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50  ager->jfd) || pP
c6c0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c6d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ==0 );.  if( isO
c6e0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
c6f0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44 4f   ){..    /* TODO
c700: 3a 20 54 68 65 72 65 27 73 20 61 20 70 72 6f 62  : There's a prob
c710: 6c 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a 6f  lem here if a jo
c720: 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20 6f  urnal-file was o
c730: 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59 0a  pened in MEMORY.
c740: 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64 20      ** mode and 
c750: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
c760: 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64  -mode is changed
c770: 20 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72 20   to TRUNCATE or 
c780: 50 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20 64  PERSIST.    ** d
c790: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
c7a0: 63 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64 65  ction. This code
c7b0: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
c7c0: 65 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20 20  ed to assume.   
c7d0: 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f 75   ** that the jou
c7e0: 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e 6f  rnal mode has no
c7f0: 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20  t changed since 
c800: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
c810: 77 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  was.    ** start
c820: 65 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c 69  ed. And the sqli
c830: 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
c840: 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 73  ode() function s
c850: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
c860: 63 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65 20  changed to make 
c870: 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20 69  sure that this i
c880: 73 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e 0a  s the case too..
c890: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46      */..    /* F
c8a0: 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72  inalize the jour
c8b0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
c8c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
c8d0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
c8e0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
c8f0: 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY ){.      int 
c900: 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20  isMemoryJournal 
c910: 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f  = sqlite3IsMemJo
c920: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
c930: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
c940: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c950: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66 28  >jfd);.      if(
c960: 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61   !isMemoryJourna
c970: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  l ){.        rc 
c980: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
c990: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
c9a0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
c9b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c9c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
c9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
c9e0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
c9f0: 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  DE_TRUNCATE ){. 
ca00: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
ca10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
ca20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
ca30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
ca40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
ca50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
ca60: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
ca70: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, 0);.      }. 
ca80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ca90: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
caa0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cab0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
cac0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
cad0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cae0: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
caf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cb00: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cb10: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
cb20: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
cb30: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
cb40: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
cb50: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
cb60: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
cb70: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cb80: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
cb90: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cba0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
cbb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cbc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
cbd0: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
cbe0: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
cbf0: 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a 20  ELETE || rc );. 
cc00: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
cc10: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
cc20: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
cc30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50  SQLITE_OK && !pP
cc40: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
cc50: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cc60: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
cc70: 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61  Pager->pVfs, pPa
cc80: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
cc90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cca0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ccb0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
ccc0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
ccd0: 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
cce0: 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
ccf0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
cd00: 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69  #endif..    sqli
cd10: 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
cd20: 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
cd30: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
cd40: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
cd50: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
cd60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
cd70: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
cd80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
cd90: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   0;.  }..  if( !
cda0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
cdb0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
cdc0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
cdd0: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
cde0: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
cdf0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
ce00: 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61 67  SHARED;.    pPag
ce10: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
ce20: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  one = 0;.  }else
ce30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
ce40: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
ce50: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ce60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
ce70: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
ce80: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
ce90: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
cea0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
ceb0: 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
cec0: 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 4f  ed = 0;..  /* TO
ced0: 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74 69  DO: Is this opti
cee0: 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65 20  mal? Why is the 
cef0: 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64 61  db size invalida
cf00: 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20 77  ted here .  ** w
cf10: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
cf20: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e 6c   file is not unl
cf30: 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61 67  ocked? */.  pPag
cf40: 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
cf50: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
cf60: 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67  cheTruncate(pPag
cf70: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61  er->pPCache, pPa
cf80: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
cf90: 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
cfa0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
cfb0: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Valid = 0;.  }..
cfc0: 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
cfd0: 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b  LITE_OK?rc2:rc);
cfe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
cff0: 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20 70  ter aData must p
d000: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
d010: 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67 65   of pPager->page
d020: 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Size bytes.** of
d030: 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20 61   data. Compute a
d040: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
d050: 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20 74  ksum based ont t
d060: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
d070: 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20 64  he .** page of d
d080: 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72 72  ata and the curr
d090: 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50 61  ent value of pPa
d0a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e 0a  ger->cksumInit..
d0b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
d0c0: 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75  t a real checksu
d0d0: 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  m. It is really 
d0e0: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
d0f0: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
d100: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70 50  nitial value (pP
d110: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
d120: 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74 68   and every 200th
d130: 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20   byte.** of the 
d140: 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72 74  page data, start
d150: 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f 66  ing with byte of
d160: 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70 61  fset (pPager->pa
d170: 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a 20  geSize%200)..** 
d180: 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e 74  Each byte is int
d190: 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20 38  erpreted as an 8
d1a0: 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69 6e  -bit unsigned in
d1b0: 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68 61  teger..**.** Cha
d1c0: 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75 6c  nging the formul
d1d0: 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  a used to comput
d1e0: 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d 20  e this checksum 
d1f0: 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a 2a  results in an.**
d200: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a 6f   incompatible jo
d210: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61  urnal file forma
d220: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75 72  t..**.** If jour
d230: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  nal corruption o
d240: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
d250: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
d260: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a 2a  e most likely .*
d270: 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 68  * scenario is th
d280: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
d290: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
d2a0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
d2b0: 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69 73  anged. .** It is
d2c0: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
d2d0: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
d2e0: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
d2f0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
d300: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
d310: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
d320: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
d330: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
d340: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
d350: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
d360: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
d370: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
d380: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
d390: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
d3a0: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
d3b0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
d3c0: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
d3d0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
d3e0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20  >cksumInit;     
d3f0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
d400: 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  value to return 
d410: 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  */.  int i = pPa
d420: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
d430: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  0;          /* L
d440: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
d450: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
d460: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
d470: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
d480: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
d490: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
d4a0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
d4b0: 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72 20  age from either 
d4c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d4d0: 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d   (if isMainJrnl=
d4e0: 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20 74  =1) or.** from t
d4f0: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 28  he sub-journal (
d500: 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 30  if isMainJrnl==0
d510: 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20 74  ) and playback t
d520: 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68 65  hat page..** The
d530: 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74 20   page begins at 
d540: 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74 20  offset *pOffset 
d550: 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54  into the file. T
d560: 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20 76  he *pOffset.** v
d570: 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73 65  alue is increase
d580: 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  d to the start o
d590: 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
d5a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
d5b0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e  **.** The isMain
d5c0: 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Jrnl flag is tru
d5d0: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
d5e0: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
d5f0: 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61  ournal and.** fa
d600: 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lse for the stat
d610: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
d620: 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
d630: 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a  k journal uses.*
d640: 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  * checksums - th
d650: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
d660: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2a  nal does not..**
d670: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
d680: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  number of the pa
d690: 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20 66  ge record read f
d6a0: 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f  rom the (sub-)jo
d6b0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
d6c0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
d6d0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
d6e0: 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  of Pager.dbSize,
d6f0: 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20 69   then playback i
d700: 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e 64  s.** skipped and
d710: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
d720: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
d730: 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
d740: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
d750: 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
d760: 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
d770: 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
d780: 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
d790: 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
d7a0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
d7b0: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
d7c0: 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
d7d0: 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
d7e0: 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
d7f0: 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
d800: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
d810: 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
d820: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
d830: 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
d840: 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
d850: 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  o returning..**.
d860: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 72  ** If the page r
d870: 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73 73  ecord is success
d880: 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  fully read from 
d890: 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61  the (sub-)journa
d8a0: 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70 6c  l file.** and pl
d8b0: 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e 20  ayed back, then 
d8c0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
d8d0: 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
d8e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a 20  error occurs.** 
d8f0: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74 68  while reading th
d900: 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68  e record from th
d910: 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20  e (sub-)journal 
d920: 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77 72  file or while wr
d930: 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65 20  iting.** to the 
d940: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
d950: 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72  hen the IO error
d960: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
d970: 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69 73  d. If data.** is
d980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65   successfully re
d990: 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62  ad from the (sub
d9a0: 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  -)journal file b
d9b0: 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ut appears to be
d9c0: 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20 53  .** corrupted, S
d9d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
d9e0: 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73 20  turned. Data is 
d9f0: 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72 75  considered corru
da00: 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20 63  pted in.** two c
da10: 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a 2a  ircumstances:.**
da20: 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20   .**   * If the 
da30: 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d 62  record page-numb
da40: 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28 30  er is illegal (0
da50: 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e   or PAGER_MJ_PGN
da60: 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49 66  O), or.**   * If
da70: 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 62   the record is b
da80: 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
da90: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
daa0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
dab0: 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b     and the check
dac0: 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20 6e  sum field does n
dad0: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65 63  ot match the rec
dae0: 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ord content..**.
daf0: 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74 68  ** Neither of th
db00: 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f  ese two scenario
db10: 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20 64  s are possible d
db20: 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69 6e  uring a savepoin
db30: 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  t rollback..**.*
db40: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
db50: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
db60: 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20 6d  k, then memory m
db70: 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64 79  ay have to be dy
db80: 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
db90: 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
dba0: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
dbb0: 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e 64   is the case and
dbc0: 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66   an allocation f
dbd0: 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ails,.** SQLITE_
dbe0: 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65  NOMEM is returne
dbf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
dc00: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
dc10: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
dc20: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
dc30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
dc40: 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61   pager being pla
dc50: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
dc60: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
dc70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
dc80: 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
dc90: 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
dca0: 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 55  al. */.  int isU
dcb0: 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  nsync,          
dcc0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
dcd0: 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 75  f reading from u
dce0: 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f 75  nsynced main jou
dcf0: 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a 70  rnal */.  i64 *p
dd00: 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  Offset,         
dd10: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
dd20: 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 70  t of record to p
dd30: 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e 74  layback */.  int
dd40: 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20 20   isSavepnt,     
dd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
dd60: 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f 69  ue for a savepoi
dd70: 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  nt rollback */. 
dd80: 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20 20   Bitvec *pDone  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dda0: 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65  * Bitvec of page
ddb0: 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65 64  s already played
ddc0: 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e   back */.){.  in
ddd0: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
dde0: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
ddf0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
de00: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
de10: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
de20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
de30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
de40: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
de50: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
de60: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
de70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de80: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
de90: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
dea0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
deb0: 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20  8 *aData;       
dec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ded0: 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  Temporary storag
dee0: 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  e for the page *
def0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
df00: 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20   *jfd;          
df10: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
df20: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
df30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
df40: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 4d  ..  assert( (isM
df50: 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20 29  ainJrnl&~1)==0 )
df60: 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69 6e  ;      /* isMain
df70: 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20 2a  Jrnl is 0 or 1 *
df80: 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 53  /.  assert( (isS
df90: 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29 3b  avepnt&~1)==0 );
dfa0: 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76 65         /* isSave
dfb0: 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a 2f  pnt is 0 or 1 */
dfc0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61 69  .  assert( isMai
dfd0: 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20 29  nJrnl || pDone )
dfe0: 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20 61  ;     /* pDone a
dff0: 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73 75  lways used on su
e000: 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20 20  b-journals */.  
e010: 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e  assert( isSavepn
e020: 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b  t || pDone==0 );
e030: 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76 65     /* pDone neve
e040: 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73 61  r used on non-sa
e050: 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61 44  vepoint */..  aD
e060: 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65  ata = (u8*)pPage
e070: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
e080: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
e090: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
e0a0: 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68 61   storage must ha
e0b0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e0c0: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
e0d0: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
e0e0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
e0f0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6a   data from the j
e100: 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f  ournal or sub-jo
e110: 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 2e  urnal.  ** file.
e120: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
e130: 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c   code to the cal
e140: 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72 72  ler if an IO err
e150: 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f 0a  or occurs..  */.
e160: 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a 72    jfd = isMainJr
e170: 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  nl ? pPager->jfd
e180: 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 3b   : pPager->sjfd;
e190: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
e1a0: 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65 74  ts(jfd, *pOffset
e1b0: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
e1c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e1d0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
e1e0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
e1f0: 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  jfd, aData, pPag
e200: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 2a  er->pageSize, (*
e210: 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20 69  pOffset)+4);.  i
e220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e230: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e240: 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61 67  *pOffset += pPag
e250: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
e260: 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34 3b   + isMainJrnl*4;
e270: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
e280: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
e290: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
e2a0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
e2b0: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
e2c0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
e2d0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
e2e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
e2f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
e300: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
e310: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
e320: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
e330: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
e340: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
e350: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
e360: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
e370: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
e380: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
e390: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
e3a0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
e3b0: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
e3c0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
e3d0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 69  {.    assert( !i
e3e0: 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20  sSavepnt );.    
e3f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
e400: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
e410: 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
e420: 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74  >dbSize || sqlit
e430: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44 6f  e3BitvecTest(pDo
e440: 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  ne, pgno) ){.   
e450: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e460: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d  K;.  }.  if( isM
e470: 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72  ainJrnl ){.    r
e480: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
e490: 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34  fd, (*pOffset)-4
e4a0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
e4b0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
e4c0: 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53 61  c;.    if( !isSa
e4d0: 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63  vepnt && pager_c
e4e0: 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
e4f0: 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20  ta)!=cksum ){.  
e500: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e510: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  E_DONE;.    }.  
e520: 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26  }..  if( pDone &
e530: 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  & (rc = sqlite3B
e540: 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20  itvecSet(pDone, 
e550: 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f  pgno))!=SQLITE_O
e560: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
e570: 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rc;.  }..  asser
e580: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
e590: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
e5a0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
e5b0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
e5c0: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
e5d0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
e5e0: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
e5f0: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
e600: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
e610: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
e620: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
e630: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
e640: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e650: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
e660: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
e670: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
e680: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
e690: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
e6a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
e6b0: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
e6c0: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
e6d0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
e6e0: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
e6f0: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
e700: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
e710: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
e720: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
e730: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
e740: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e750: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
e760: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
e770: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
e780: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
e790: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
e7a0: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
e7b0: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
e7c0: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
e7d0: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
e7e0: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
e7f0: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
e800: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
e810: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
e820: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
e830: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
e840: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
e850: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
e860: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
e870: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
e880: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
e890: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
e8a0: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
e8b0: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
e8c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e8d0: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
e8e0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
e8f0: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
e900: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
e910: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
e920: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
e930: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
e940: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
e950: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
e960: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
e970: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
e980: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
e990: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
e9a0: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
e9b0: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
e9c0: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
e9d0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
e9e0: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
e9f0: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
ea00: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
ea10: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
ea20: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
ea30: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
ea40: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
ea50: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
ea60: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
ea70: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
ea80: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
ea90: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
eaa0: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
eab0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
eac0: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
ead0: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
eae0: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
eaf0: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
eb00: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
eb10: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
eb20: 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
eb30: 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
eb40: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
eb50: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
eb60: 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
eb70: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
eb80: 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
eb90: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
eba0: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
ebb0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
ebc0: 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
ebd0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
ebe0: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
ebf0: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
ec00: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
ec10: 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
ec20: 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
ec30: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
ec40: 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
ec50: 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
ec60: 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
ec70: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
ec80: 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
ec90: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
eca0: 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
ecb0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
ecc0: 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
ecd0: 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
ece0: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
ecf0: 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
ed00: 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
ed10: 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
ed20: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
ed30: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
ed40: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
ed50: 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a 20  g || !MEMDB );. 
ed60: 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50 4c   PAGERTRACE(("PL
ed70: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
ed80: 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73 5c  d hash(%08x) %s\
ed90: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
eda0: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
edb0: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
edc0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
edd0: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
ede0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
edf0: 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d    (isMainJrnl?"m
ee00: 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75  ain-journal":"su
ee10: 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 29  b-journal").  ))
ee20: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
ee30: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
ee40: 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28  CLUSIVE).   && (
ee50: 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50  pPg==0 || 0==(pP
ee60: 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
ee70: 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26  EED_SYNC)).   &&
ee80: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ee90: 66 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e 73  fd).   && !isUns
eea0: 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ync.  ){.    i64
eeb0: 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
eec0: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
eed0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
eee0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
eef0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
ef00: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
ef10: 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20 20  ize, ofst);.    
ef20: 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
ef30: 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
ef40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
ef50: 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
ef60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ef70: 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50  3BackupUpdate(pP
ef80: 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70  ager->pBackup, p
ef90: 67 6e 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 7d  gno, aData);.  }
efa0: 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61 69 6e  else if( !isMain
efb0: 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30 20 29  Jrnl && pPg==0 )
efc0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  {.    /* If this
efd0: 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   is a rollback o
efe0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  f a savepoint an
eff0: 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74 20 77  d data was not w
f000: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 2a 2a  ritten to.    **
f010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
f020: 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
f030: 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74 68 65  t in-memory, the
f040: 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74 69 61  re is a potentia
f050: 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d  l.    ** problem
f060: 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 20  . When the page 
f070: 69 73 20 6e 65 78 74 20 66 65 74 63 68 65 64 20  is next fetched 
f080: 62 79 20 74 68 65 20 62 2d 74 72 65 65 20 6c 61  by the b-tree la
f090: 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a 2a 20  yer, it .    ** 
f0a0: 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f  will be read fro
f0b0: 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
f0c0: 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79 20 6f  ile, which may o
f0d0: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a 20 20  r may not be .  
f0e0: 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20 0a 20    ** current. . 
f0f0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
f100: 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c 65 20  re are a couple 
f110: 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77 61 79  of different way
f120: 73 20 74 68 69 73 20 63 61 6e 20 68 61 70 70 65  s this can happe
f130: 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69 74 65  n. All are quite
f140: 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72 65 2e  .    ** obscure.
f150: 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e   When running in
f160: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64   synchronous mod
f170: 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e, this can only
f180: 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a 2a 20   happen .    ** 
f190: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
f1a0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
f1b0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
f1c0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
f1d0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70 6f 70   then.    ** pop
f1e0: 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d 6f 76  ulated, then mov
f1f0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
f200: 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 2e  PagerMovepage().
f210: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f220: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74  he solution is t
f230: 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f  o add an in-memo
f240: 72 79 20 70 61 67 65 20 74 6f 20 74 68 65 20 63  ry page to the c
f250: 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ache containing.
f260: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 20      ** the data 
f270: 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 74  just read from t
f280: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
f290: 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
f2a0: 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a 20 61   dirty .    ** a
f2b0: 6e 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  nd if the pager 
f2c0: 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75 72 6e  requires a journ
f2d0: 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20 6d 61  al-sync, then ma
f2e0: 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 0a  rk the page as .
f2f0: 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69 6e 67      ** requiring
f300: 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e 63 20   a journal-sync 
f310: 62 65 66 6f 72 65 20 69 74 20 69 73 20 77 72 69  before it is wri
f320: 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
f330: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
f340: 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20 28 72  nt );.    if( (r
f350: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f360: 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
f370: 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29 29 21  pgno, &pPg, 1))!
f380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f390: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f3a0: 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 66 6c     }.    pPg->fl
f3b0: 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
f3c0: 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73 71 6c  ED_READ;.    sql
f3d0: 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
f3e0: 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  rty(pPg);.  }.  
f3f0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
f400: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
f410: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
f420: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
f430: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
f440: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
f450: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
f460: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
f470: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
f480: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
f490: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
f4a0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
f4b0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
f4c0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
f4d0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
f4e0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
f4f0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
f500: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
f510: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
f520: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
f530: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
f540: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
f550: 20 20 20 70 44 61 74 61 20 3d 20 70 50 67 2d 3e     pData = pPg->
f560: 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 63 70  pData;.    memcp
f570: 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20  y(pData, aData, 
f580: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f590: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
f5a0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
f5b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
f5c0: 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20  einiter(pPg);.  
f5d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4d 61    }.    if( isMa
f5e0: 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73 53 61  inJrnl && (!isSa
f5f0: 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66 73 65  vepnt || *pOffse
f600: 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t<=pPager->journ
f610: 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20 20 20  alHdr) ){.      
f620: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  /* If the conten
f630: 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  ts of this page 
f640: 77 65 72 65 20 6a 75 73 74 20 72 65 73 74 6f 72  were just restor
f650: 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
f660: 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e   .      ** journ
f670: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
f680: 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62  s content must b
f690: 65 20 61 73 20 74 68 65 79 20 77 65 72 65 20 77  e as they were w
f6a0: 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20 20 2a  hen the .      *
f6b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  * transaction wa
f6c0: 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 20  s first opened. 
f6d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20  In this case we 
f6e0: 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67  can mark the pag
f6f0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 63 6c  e.      ** as cl
f700: 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65 72 65  ean, since there
f710: 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64   will be no need
f720: 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f 75 74   to write it out
f730: 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20 20 2a   to the..      *
f740: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65  *.      ** There
f750: 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74 69 6f   is one exceptio
f760: 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65 2e 20  n to this rule. 
f770: 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 62  If the page is b
f780: 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20  eing rolled.    
f790: 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70 61 72    ** back as par
f7a0: 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74  t of a savepoint
f7b0: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 29 20   (or statement) 
f7c0: 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e  rollback from an
f7d0: 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e   .      ** unsyn
f7e0: 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  ced portion of t
f7f0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
f800: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69 73  file, then it is
f810: 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20 20 20   not safe.      
f820: 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 70  ** to mark the p
f830: 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 54 68  age as clean. Th
f840: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 6d 61  is is because ma
f850: 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65 20 61  rking the page a
f860: 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e  s.      ** clean
f870: 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68 65 20   will clear the 
f880: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
f890: 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68 65 20  flag. Since the 
f8a0: 70 61 67 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  page is.      **
f8b0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
f8c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 72 65  journal file (re
f8d0: 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65 72 2e  corded in Pager.
f8e0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a  pInJournal) and.
f8f0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48        ** the PGH
f900: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
f910: 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20 69 66  g is cleared, if
f920: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
f930: 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a  tten to.      **
f940: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
f950: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
f960: 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65  it will be marke
f970: 64 20 61 73 20 64 69 72 74 79 20 62 75 74 0a 20  d as dirty but. 
f980: 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44       ** the PGHD
f990: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f9a0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74   will not be set
f9b0: 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65 6e 20  . It could then 
f9c0: 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20  potentially.    
f9d0: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
f9e0: 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  out into the dat
f9f0: 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
fa00: 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  e its journal fi
fa10: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  le.      ** segm
fa20: 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e 20 49  ent is synced. I
fa30: 66 20 61 20 63 72 61 73 68 20 6f 63 63 75 72 73  f a crash occurs
fa40: 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f   during or follo
fa50: 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20 20 20  wing this,.     
fa60: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 72   ** database cor
fa70: 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75  ruption may ensu
fa80: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
fa90: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
faa0: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
fab0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
fac0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
fad0: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
fae0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
faf0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
fb00: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
fb10: 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
fb20: 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
fb30: 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65   of Pager.dbFile
fb40: 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20  Vers..    ** Do 
fb50: 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20  this before any 
fb60: 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20  decoding. */.   
fb70: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
fb80: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
fb90: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
fba0: 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b  , &((u8*)pData)[
fbb0: 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65  24],sizeof(pPage
fbc0: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
fbd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
fbe0: 65 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a  ecode the page j
fbf0: 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ust read from di
fc00: 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31  sk */.    CODEC1
fc10: 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
fc20: 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20  pPg->pgno, 3);. 
fc30: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
fc40: 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
fc50: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fc60: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
fc70: 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
fc80: 64 28 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47  d(SQLITE_COVERAG
fc90: 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
fca0: 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
fcb0: 20 61 68 65 61 64 20 69 6e 74 6f 20 74 68 65 20   ahead into the 
fcc0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
fcd0: 65 20 61 6e 64 20 64 65 74 65 72 6d 69 6e 65 73  e and determines
fce0: 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e  .** whether or n
fcf0: 6f 74 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f  ot the next reco
fd00: 72 64 20 28 74 68 65 20 72 65 63 6f 72 64 20 74  rd (the record t
fd10: 68 61 74 20 62 65 67 69 6e 73 20 61 74 20 66 69  hat begins at fi
fd20: 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20 70 50 61  le.** offset pPa
fd30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
fd40: 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   is a well-forme
fd50: 64 20 70 61 67 65 20 72 65 63 6f 72 64 20 63 6f  d page record co
fd60: 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61  nsisting.** of a
fd70: 20 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62   valid page numb
fd80: 65 72 2c 20 70 50 61 67 65 2d 3e 70 61 67 65 53  er, pPage->pageS
fd90: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 63 6f 6e  ize bytes of con
fda0: 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a  tent, followed.*
fdb0: 2a 20 62 79 20 61 20 76 61 6c 69 64 20 63 68 65  * by a valid che
fdc0: 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  cksum..**.** The
fdd0: 20 70 61 67 65 72 20 6e 65 76 65 72 20 6e 65 65   pager never nee
fde0: 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20  ds to know this 
fdf0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 20 69  in order to do i
fe00: 74 73 20 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a  ts job.   This.*
fe10: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  * routine is onl
fe20: 79 20 75 73 65 64 20 66 72 6f 6d 20 77 69 74 68  y used from with
fe30: 20 61 73 73 65 72 74 28 29 20 61 6e 64 20 74 65   assert() and te
fe40: 73 74 63 61 73 65 28 29 20 6d 61 63 72 6f 73 2e  stcase() macros.
fe50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fe60: 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
fe70: 61 67 65 49 73 56 61 6c 69 64 28 50 61 67 65 72  ageIsValid(Pager
fe80: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 6e   *pPager){.  Pgn
fe90: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
fea0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
feb0: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
fec0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
fed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fee0: 65 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  e page checksum 
fef0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
ff00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
ff10: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 72 65  urn code from re
ff20: 61 64 20 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f  ad operations */
ff30: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
ff40: 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68 65 20 66  *fd;    /* The f
ff50: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
ff60: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 61 72 65  rom which we are
ff70: 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38   reading */.  u8
ff80: 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20 20 20   *aData;        
ff90: 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
ffa0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20   the page */..  
ffb0: 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65  /* Read the page
ffc0: 20 6e 75 6d 62 65 72 20 68 65 61 64 65 72 20 2a   number header *
ffd0: 2f 0a 20 20 66 64 20 3d 20 70 50 61 67 65 72 2d  /.  fd = pPager-
ffe0: 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61  >jfd;.  rc = rea
fff0: 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67  d32bits(fd, pPag
10000 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
10010 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
10020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72  !=SQLITE_OK ){ r
10030 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10060 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67  _TEST*/.  if( pg
10070 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
10080 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
10090 67 65 72 29 20 29 7b 20 72 65 74 75 72 6e 20 30  ger) ){ return 0
100a0 3b 20 7d 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f  ; }         /*NO
100b0 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 67  _TEST*/.  if( pg
100c0 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d  no>(Pgno)pPager-
100d0 3e 64 62 53 69 7a 65 20 29 7b 20 72 65 74 75 72  >dbSize ){ retur
100e0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
100f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10100 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65  _TEST*/..  /* Re
10110 61 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ad the checksum 
10120 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
10130 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10140 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67  >journalOff+pPag
10150 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
10160 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
10170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
10180 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e               /*N
101b0 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52  O_TEST*/..  /* R
101c0 65 61 64 20 74 68 65 20 64 61 74 61 20 61 6e 64  ead the data and
101d0 20 76 65 72 69 66 79 20 74 68 65 20 63 68 65 63   verify the chec
101e0 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20  ksum */.  aData 
101f0 3d 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70  = (u8*)pPager->p
10200 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d  TmpSpace;.  rc =
10210 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
10220 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
10230 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70 50 61 67  ->pageSize, pPag
10240 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34  er->journalOff+4
10250 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10260 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e  ITE_OK ){ return
10270 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
10280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10290 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
102a0 2a 2f 0a 20 20 69 66 28 20 70 61 67 65 72 5f 63  */.  if( pager_c
102b0 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61  ksum(pPager, aDa
102c0 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65  ta)!=cksum ){ re
102d0 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
102e0 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54         /*NO_TEST
102f0 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63 68 20 74  */..  /* Reach t
10300 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69  his point only i
10310 66 20 74 68 65 20 70 61 67 65 20 69 73 20 76 61  f the page is va
10320 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  lid */.  return 
10330 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  1;.}.#endif /* !
10340 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
10350 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
10360 45 5f 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29  E_COVERAGE_TEST)
10370 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d   */../*.** Param
10380 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
10390 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
103a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
103b0 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
103c0 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
103d0 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
103e0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103f0 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
10400 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
10410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
10420 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
10430 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
10440 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
10450 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
10460 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
10470 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
10480 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
10490 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
104a0 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
104b0 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
104c0 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
104d0 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
104e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
104f0 2a 20 57 68 65 6e 20 61 20 6d 61 73 74 65 72 20  * When a master 
10500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10510 63 72 65 61 74 65 64 2c 20 69 74 20 69 73 20 70  created, it is p
10520 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68  opulated with th
10530 65 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61  e names .** of a
10540 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20  ll of its child 
10550 6a 6f 75 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66  journals, one af
10560 74 65 72 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72  ter another, for
10570 6d 61 74 74 65 64 20 61 73 20 75 74 66 2d 38 20  matted as utf-8 
10580 0a 2a 2a 20 65 6e 63 6f 64 65 64 20 74 65 78 74  .** encoded text
10590 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 65 61 63  . The end of eac
105a0 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
105b0 66 69 6c 65 20 69 73 20 6d 61 72 6b 65 64 20 77  file is marked w
105c0 69 74 68 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65  ith a .** nul-te
105d0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 28 30  rminator byte (0
105e0 78 30 30 29 2e 20 69 2e 65 2e 20 74 68 65 20 65  x00). i.e. the e
105f0 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f  ntire contents o
10600 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
10610 61 6c 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61  al.** file for a
10620 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76   transaction inv
10630 6f 6c 76 69 6e 67 20 74 77 6f 20 64 61 74 61 62  olving two datab
10640 61 73 65 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a  ases might be:.*
10650 2a 0a 2a 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69  *.**   "/home/bi
10660 6c 6c 2f 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/a.db-journal\
10670 78 30 30 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e  x00/home/bill/b.
10680 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a  db-journal\x00".
10690 2a 2a 0a 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a  **.** A master j
106a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
106b0 6f 6e 6c 79 20 62 65 20 64 65 6c 65 74 65 64 20  only be deleted 
106c0 6f 6e 63 65 20 61 6c 6c 20 6f 66 20 69 74 73 20  once all of its 
106d0 63 68 69 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61  child .** journa
106e0 6c 73 20 68 61 76 65 20 62 65 65 6e 20 72 6f 6c  ls have been rol
106f0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
10700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
10710 61 64 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ads the contents
10720 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a   of the master-j
10730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
10740 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
10750 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 65 61  loops through ea
10760 63 68 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  ch of the child 
10770 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46  journal names. F
10780 6f 72 0a 2a 2a 20 65 61 63 68 20 63 68 69 6c 64  or.** each child
10790 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 63 68 65   journal, it che
107a0 63 6b 73 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  cks if:.**.**   
107b0 2a 20 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a  * if the child j
107c0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2c 20 61  ournal exists, a
107d0 6e 64 20 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20  nd if so.**   * 
107e0 69 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  if the child jou
107f0 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20  rnal contains a 
10800 72 65 66 65 72 65 6e 63 65 20 74 6f 20 6d 61 73  reference to mas
10810 74 65 72 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  ter journal .** 
10820 20 20 20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72      file zMaster
10830 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c  .**.** If a chil
10840 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  d journal can be
10850 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 61 74 63   found that matc
10860 68 65 73 20 62 6f 74 68 20 6f 66 20 74 68 65 20  hes both of the 
10870 63 72 69 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76  criteria.** abov
10880 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
10890 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f 75 74   returns without
108a0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
108b0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 0a 2a   Otherwise, if.*
108c0 2a 20 6e 6f 20 73 75 63 68 20 63 68 69 6c 64 20  * no such child 
108d0 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66  journal can be f
108e0 6f 75 6e 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74  ound, file zMast
108f0 65 72 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  er is deleted fr
10900 6f 6d 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  om.** the file-s
10910 79 73 74 65 6d 20 75 73 69 6e 67 20 73 71 6c 69  ystem using sqli
10920 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a  te3OsDelete()..*
10930 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10940 72 6f 72 20 77 69 74 68 69 6e 20 74 68 69 73 20  ror within this 
10950 66 75 6e 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72  function, an err
10960 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
10970 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ned. This.** fun
10980 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10990 6d 65 6d 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e  memory by callin
109a0 67 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  g sqlite3Malloc(
109b0 29 2e 20 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74  ). If an allocat
109c0 69 6f 6e 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  ion.** fails, SQ
109d0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
109e0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
109f0 65 2c 20 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d  e, if no IO or m
10a00 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a  alloc errors .**
10a10 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
10a20 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
10a30 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20  *.** TODO: This 
10a40 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74  function allocat
10a50 65 73 20 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63  es a single bloc
10a60 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c  k of memory to l
10a70 6f 61 64 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72  oad.** the entir
10a80 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
10a90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10aa0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c   file. This coul
10ab0 64 20 62 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65  d be.** a couple
10ac0 20 6f 66 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72   of kilobytes or
10ad0 20 73 6f 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c   so - potentiall
10ae0 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  y larger than th
10af0 65 20 70 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e  e page .** size.
10b00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10b10 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
10b20 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
10b30 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
10b40 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
10b50 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
10b60 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
10b70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10b80 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
10b90 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
10ba0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 20 20  file *pMaster;  
10bb0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61    /* Malloc'd ma
10bc0 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
10bd0 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
10be0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10bf0 70 4a 6f 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d  pJournal;   /* M
10c00 61 6c 6c 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f  alloc'd child-jo
10c10 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
10c20 69 70 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20  iptor */.  char 
10c30 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
10c40 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
10c50 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
10c60 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
10c70 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
10c80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
10c90 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
10ca0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41   file */..  /* A
10cb0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
10cc0 72 20 62 6f 74 68 20 74 68 65 20 70 4a 6f 75 72  r both the pJour
10cd0 6e 61 6c 20 61 6e 64 20 70 4d 61 73 74 65 72 20  nal and pMaster 
10ce0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
10cf0 2e 0a 20 20 2a 2a 20 49 66 20 73 75 63 63 65 73  ..  ** If succes
10d00 73 66 75 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d  sful, open the m
10d10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10d20 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a  le for reading..
10d30 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
10d40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
10d50 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
10d60 72 6f 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ro(pVfs->szOsFil
10d70 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e  e * 2);.  pJourn
10d80 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  al = (sqlite3_fi
10d90 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61  le *)(((u8 *)pMa
10da0 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a  ster) + pVfs->sz
10db0 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  OsFile);.  if( !
10dc0 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  pMaster ){.    r
10dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
10df0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
10e00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
10e10 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50  ADONLY|SQLITE_OP
10e20 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
10e30 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  L);.    rc = sql
10e40 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
10e50 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65   zMaster, pMaste
10e60 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20  r, flags, 0);.  
10e70 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
10e80 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
10e90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72  master_out;..  r
10ea0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10eb0 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26  eSize(pMaster, &
10ec0 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
10ed0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
10ee0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
10ef0 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66  aster_out;..  if
10f00 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( nMasterJournal
10f10 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  >0 ){.    char *
10f20 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68  zJournal;.    ch
10f30 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d  ar *zMasterPtr =
10f40 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73   0;.    int nMas
10f50 74 65 72 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d  terPtr = pVfs->m
10f60 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20  xPathname+1;..  
10f70 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
10f80 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
10f90 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
10fa0 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
10fb0 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
10fc0 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  _malloc() and po
10fd0 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
10fe0 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
10ff0 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
11000 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
11010 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28  )sqlite3Malloc((
11020 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
11030 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
11040 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
11050 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
11060 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
11070 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
11080 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11090 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
110a0 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
110b0 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
110c0 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
110d0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
110e0 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
110f0 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61  ournal, (int)nMa
11100 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
11110 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11120 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
11130 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
11140 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
11150 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
11160 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
11170 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
11180 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
11190 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
111a0 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
111b0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
111c0 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
111d0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
111e0 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
111f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
11200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11210 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
11220 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
11230 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
11240 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
11250 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
11260 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
11270 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11280 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
11290 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
112a0 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
112b0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
112c0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
112d0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
112e0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
112f0 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
11300 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
11310 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
11320 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
11330 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
11340 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11350 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11360 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
11370 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11380 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
11390 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
113a0 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
113b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
113c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
113d0 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
113e0 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
113f0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
11400 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
11410 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
11420 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
11430 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
11440 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
11450 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
11460 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11470 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11480 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11490 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
114a0 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
114b0 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
114c0 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
114d0 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
114e0 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
114f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
11500 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
11510 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
11520 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11530 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
11540 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
11550 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
11560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
11570 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74  ournal += (sqlit
11580 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72  e3Strlen30(zJour
11590 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
115a0 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
115b0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
115c0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
115d0 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
115e0 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
115f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
11600 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72  te3_free(zMaster
11610 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a  Journal);.  }  .
11620 20 20 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b    if( pMaster ){
11630 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11640 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ose(pMaster);.  
11650 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
11660 6e 28 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20  n(pJournal) );. 
11670 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
11680 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  e(pMaster);.  re
11690 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
116a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
116b0 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e   is used to chan
116c0 67 65 20 74 68 65 20 61 63 74 75 61 6c 20 73 69  ge the actual si
116d0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
116e0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74  se .** file in t
116f0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20  he file-system. 
11700 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
11710 73 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  s when committin
11720 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  g a transaction,
11730 0a 2a 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62  .** or rolling b
11740 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ack a transactio
11750 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c  n (including rol
11760 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d  ling back a hot-
11770 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20  journal)..**.** 
11780 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
11790 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74  base file is not
117a0 20 6f 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63   open, or an exc
117b0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e  lusive lock is n
117c0 6f 74 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73  ot.** held, this
117d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
117e0 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  o-op. Otherwise,
117f0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
11800 20 66 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e   file is.** chan
11810 67 65 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67  ged to nPage pag
11820 65 73 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72  es (nPage*pPager
11830 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
11840 29 2e 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a  ). If the file.*
11850 2a 20 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72  * on disk is cur
11860 72 65 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68  rently larger th
11870 61 6e 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20  an nPage pages, 
11880 74 68 65 6e 20 75 73 65 20 74 68 65 20 56 46 53  then use the VFS
11890 0a 2a 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20  .** xTruncate() 
118a0 6d 65 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61  method to trunca
118b0 74 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  te it..**.** Or,
118c0 20 69 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20   it might might 
118d0 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
118e0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
118f0 6b 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  k is smaller tha
11900 6e 20 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65  n .** nPage page
11910 73 2e 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e  s. Some operatin
11920 67 20 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65  g system impleme
11930 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74  ntations can get
11940 20 63 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a   confused if .**
11950 20 79 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e   you try to trun
11960 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73  cate a file to s
11970 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20 69 73  ome size that is
11980 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 74 20   larger than it 
11990 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73  .** currently is
119a0 2c 20 73 6f 20 64 65 74 65 63 74 20 74 68 69 73  , so detect this
119b0 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65 20   case and write 
119c0 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79  a single zero by
119d0 74 65 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e  te to .** the en
119e0 64 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c  d of the new fil
119f0 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  e instead..**.**
11a00 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11a20 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
11a30 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f   occurs while mo
11a40 64 69 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64  difying.** the d
11a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65  atabase file, re
11a60 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
11a70 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ode to the calle
11a80 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
11a90 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
11aa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11ab0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11ac0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11ad0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11ae0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
11af0 4c 55 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e  LUSIVE && isOpen
11b00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
11b10 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
11b20 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
11b30 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74    /* TODO: Is it
11b40 20 73 61 66 65 20 74 6f 20 75 73 65 20 50 61 67   safe to use Pag
11b50 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65  er.dbFileSize he
11b60 72 65 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  re? */.    rc = 
11b70 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
11b80 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
11b90 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
11ba0 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
11bb0 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
11bc0 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
11bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11be0 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
11bf0 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
11c00 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
11c10 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
11c20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11c30 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
11c40 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
11c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11c60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11c70 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
11c80 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
11c90 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
11ca0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11cc0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
11cd0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11ce0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11d00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61  /*.** Set the va
11d10 6c 75 65 20 6f 66 20 74 68 65 20 50 61 67 65 72  lue of the Pager
11d20 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
11d30 61 62 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76  able for the giv
11d40 65 6e 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65  en.** pager base
11d50 64 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72  d on the value r
11d60 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 78  eturned by the x
11d70 53 65 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f  SectorSize metho
11d80 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e  d.** of the open
11d90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11da0 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  The sector size 
11db0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65  will be used use
11dc0 64 20 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69  d .** to determi
11dd0 6e 65 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20  ne the size and 
11de0 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75  alignment of jou
11df0 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20  rnal header and 
11e00 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
11e10 61 6c 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68  al pointers with
11e20 69 6e 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e  in created journ
11e30 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
11e40 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  For temporary fi
11e50 6c 65 73 20 74 68 65 20 65 66 66 65 63 74 69 76  les the effectiv
11e60 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
11e70 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
11e80 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  s..**.** Otherwi
11e90 73 65 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70  se, for non-temp
11ea0 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65  orary files, the
11eb0 20 65 66 66 65 63 74 69 76 65 20 73 65 63 74 6f   effective secto
11ec0 72 20 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65  r size is.** the
11ed0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
11ee0 62 79 20 74 68 65 20 78 53 65 63 74 6f 72 53 69  by the xSectorSi
11ef0 7a 65 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e  ze() method roun
11f00 64 65 64 20 75 70 20 74 6f 20 35 31 32 20 69 66  ded up to 512 if
11f10 0a 2a 2a 20 69 74 20 69 73 20 6c 65 73 73 20 74  .** it is less t
11f20 68 61 6e 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e  han 512, or roun
11f30 64 65 64 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f  ded down to MAX_
11f40 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 66 20 69  SECTOR_SIZE if i
11f50 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
11f60 74 68 61 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  than MAX_SECTOR_
11f70 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  SIZE..*/.static 
11f80 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
11f90 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
11fa0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  ){.  assert( isO
11fb0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
11fc0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
11fd0 69 6c 65 20 29 3b 0a 0a 20 20 69 66 28 20 21 70  ile );..  if( !p
11fe0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11ff0 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f 72  ){.    /* Sector
12000 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61   size doesn't ma
12010 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72 61  tter for tempora
12020 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20  ry files. Also, 
12030 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
12040 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65 65  may not have bee
12050 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69 6e  n opened yet, in
12060 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
12070 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
12080 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20     ** call will 
12090 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f  segfault..    */
120a0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
120b0 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
120c0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
120d0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20  ager->fd);.  }. 
120e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
120f0 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20  torSize<512 ){. 
12100 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
12110 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d  rSize = 512;.  }
12120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12130 65 63 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45  ectorSize>MAX_SE
12140 43 54 4f 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20  CTOR_SIZE ){.   
12150 20 61 73 73 65 72 74 28 20 4d 41 58 5f 53 45 43   assert( MAX_SEC
12160 54 4f 52 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b  TOR_SIZE>=512 );
12170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63  .    pPager->sec
12180 74 6f 72 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45  torSize = MAX_SE
12190 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
121a0 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
121b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
121c0 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
121d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
121e0 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
121f0 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
12200 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
12210 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
12220 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
12230 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
12240 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
12250 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
12260 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
12270 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
12280 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
12290 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
122a0 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
122b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
122c0 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
122d0 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
122e0 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
122f0 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
12300 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
12310 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
12320 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
12330 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
12340 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
12350 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
12360 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
12370 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
12380 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
12390 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
123a0 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
123b0 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
123c0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
123d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
123e0 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
123f0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
12400 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
12410 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
12420 20 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67   (5)  4 byte big
12430 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
12440 77 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63  which is the sec
12450 74 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68  tor size.  The h
12460 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69  eader.**       i
12470 73 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  s this many byte
12480 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  s in size..**  (
12490 36 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  6)  4 byte big-e
124a0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
124b0 69 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20  ich is the page 
124c0 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34  case..**  (7)  4
124d0 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
124e0 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
124f0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
12500 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12510 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
12520 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
12530 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
12540 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
12550 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
12560 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
12570 28 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (8)  N bytes of 
12580 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
12590 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
125a0 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
125b0 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
125c0 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
125d0 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
125e0 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
125f0 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
12600 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
12610 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
12620 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
12630 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
12640 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
12650 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
12660 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
12670 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
12680 20 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (9)  Zero or mo
12690 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
126a0 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
126b0 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
126c0 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
126d0 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
126e0 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
126f0 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
12700 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
12710 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
12720 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
12730 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
12740 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
12750 61 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69  an the first 8 i
12760 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
12770 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
12780 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
12790 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39  nstance of the 9
127a0 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
127b0 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
127c0 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
127d0 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
127e0 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
127f0 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
12800 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
12810 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
12820 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
12830 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
12840 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
12850 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
12860 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12870 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
12880 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
12890 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
128a0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
128b0 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
128c0 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
128d0 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
128e0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
128f0 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
12900 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
12910 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
12920 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
12930 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
12940 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
12950 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
12960 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
12970 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
12980 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
12990 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
129a0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
129b0 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
129c0 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
129d0 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
129e0 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
129f0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
12a00 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
12a10 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
12a20 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
12a30 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
12a40 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
12a50 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
12a60 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
12a70 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
12a80 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
12a90 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
12aa0 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
12ab0 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
12ac0 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
12ad0 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
12ae0 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
12af0 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
12b00 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
12b10 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
12b20 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
12b30 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
12b40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
12b50 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
12b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
12b70 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
12b80 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
12b90 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
12ba0 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
12bb0 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
12bc0 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
12bd0 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
12be0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
12bf0 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
12c00 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
12c10 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
12c20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
12c30 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
12c40 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
12c50 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
12c60 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
12c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
12c80 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
12c90 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
12ca0 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
12cb0 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
12cc0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12cd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
12ce0 0a 2a 2a 20 54 68 65 20 69 73 48 6f 74 20 70 61  .** The isHot pa
12cf0 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65  rameter indicate
12d00 73 20 74 68 61 74 20 77 65 20 61 72 65 20 74 72  s that we are tr
12d10 79 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ying to rollback
12d20 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68   a journal.** th
12d30 61 74 20 6d 69 67 68 74 20 62 65 20 61 20 68 6f  at might be a ho
12d40 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20  t journal.  Or, 
12d50 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 61 74  it could be that
12d60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
12d70 0a 2a 2a 20 70 72 65 73 65 72 76 65 64 20 62 65  .** preserved be
12d80 63 61 75 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c  cause of JOURNAL
12d90 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 6f 72 20  MODE_PERSIST or 
12da0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
12db0 43 41 54 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20  CATE..** If the 
12dc0 6a 6f 75 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69  journal really i
12dd0 73 20 68 6f 74 2c 20 72 65 73 65 74 20 74 68 65  s hot, reset the
12de0 20 70 61 67 65 72 20 63 61 63 68 65 20 70 72 69   pager cache pri
12df0 6f 72 20 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61  or rolling.** ba
12e00 63 6b 20 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20  ck any content. 
12e10 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
12e20 69 73 20 6d 65 72 65 6c 79 20 70 65 72 73 69 73  is merely persis
12e30 74 65 6e 74 2c 20 6e 6f 20 72 65 73 65 74 20 69  tent, no reset i
12e40 73 0a 2a 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s.** needed..*/.
12e50 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12e60 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
12e70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
12e80 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
12e90 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
12ea0 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
12eb0 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
12ec0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
12ed0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
12ee0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
12ef0 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
12f00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12f10 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
12f20 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
12f30 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
12f40 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
12f50 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
12f60 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
12f70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
12f80 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
12f90 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
12fa0 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
12fb0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
12fc0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12fd0 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
12fe0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
12ff0 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
13000 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13010 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
13020 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
13030 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
13040 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13050 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13060 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20  file if any */. 
13070 20 69 6e 74 20 6e 65 65 64 50 61 67 65 72 52 65   int needPagerRe
13080 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  set;      /* Tru
13090 65 20 74 6f 20 72 65 73 65 74 20 70 61 67 65 20  e to reset page 
130a0 70 72 69 6f 72 20 74 6f 20 66 69 72 73 74 20 70  prior to first p
130b0 61 67 65 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  age rollback */.
130c0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
130d0 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
130e0 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
130f0 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
13100 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
13110 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
13120 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13130 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
13140 66 64 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  fd) );.  rc = sq
13150 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13160 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
13170 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
13180 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
13190 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
131a0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
131b0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
131c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
131d0 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
131e0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
131f0 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
13200 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13210 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
13220 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
13230 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
13240 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
13250 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
13260 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
13270 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
13280 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
13290 64 20 62 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a  d back..  **.  *
132a0 2a 20 54 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61  * TODO: Technica
132b0 6c 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  lly the followin
132c0 67 20 69 73 20 61 6e 20 65 72 72 6f 72 20 62 65  g is an error be
132d0 63 61 75 73 65 20 69 74 20 61 73 73 75 6d 65 73  cause it assumes
132e0 20 74 68 61 74 0a 20 20 2a 2a 20 62 75 66 66 65   that.  ** buffe
132f0 72 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63  r Pager.pTmpSpac
13300 65 20 69 73 20 28 6d 78 50 61 74 68 6e 61 6d 65  e is (mxPathname
13310 2b 31 29 20 62 79 74 65 73 20 6f 72 20 6c 61 72  +1) bytes or lar
13320 67 65 72 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20  ger. i.e. that. 
13330 20 2a 2a 20 28 70 50 61 67 65 72 2d 3e 70 61 67   ** (pPager->pag
13340 65 53 69 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d  eSize >= pPager-
13350 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
13360 65 2b 31 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75  e+1). Using os_u
13370 6e 69 78 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50  nix.c,.  **  mxP
13380 61 74 68 6e 61 6d 65 20 69 73 20 35 31 32 2c 20  athname is 512, 
13390 77 68 69 63 68 20 69 73 20 74 68 65 20 73 61 6d  which is the sam
133a0 65 20 61 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  e as the minimum
133b0 20 61 6c 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65   allowable value
133c0 0a 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 53 69  .  ** for pageSi
133d0 7a 65 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ze..  */.  zMast
133e0 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
133f0 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
13400 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
13410 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
13420 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
13430 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
13440 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
13450 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
13460 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
13470 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
13480 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
13490 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
134a0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
134b0 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
134c0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
134d0 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
134e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
134f0 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
13500 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13510 3d 20 30 3b 0a 20 20 6e 65 65 64 50 61 67 65 72  = 0;.  needPager
13520 52 65 73 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a  Reset = isHot;..
13530 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
13540 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
13550 20 77 68 65 6e 20 61 20 72 65 61 64 4a 6f 75 72   when a readJour
13560 6e 61 6c 48 64 72 28 29 20 6f 72 20 0a 20 20 2a  nalHdr() or .  *
13570 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
13580 5f 6f 6e 65 5f 70 61 67 65 28 29 20 63 61 6c 6c  _one_page() call
13590 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
135a0 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
135b0 72 6f 72 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73  ror .  ** occurs
135c0 2e 20 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  . .  */.  while(
135d0 20 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73   1 ){.    int is
135e0 55 6e 73 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  Unsync = 0;..   
135f0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
13600 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
13610 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
13620 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
13630 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
13640 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
13650 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
13660 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
13670 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
13680 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
13690 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
136a0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
136b0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
136c0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
136d0 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
136e0 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
136f0 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
13700 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
13710 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
13720 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
13730 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
13740 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13750 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
13760 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
13770 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
13780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
137a0 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
137b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
137c0 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
137d0 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
137e0 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
137f0 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
13800 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
13810 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
13820 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
13830 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
13840 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
13850 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
13860 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
13870 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
13880 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
13890 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
138a0 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
138b0 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
138c0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
138d0 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
138e0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
138f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
13900 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
13910 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13920 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
13930 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f   (int)((szJ - JO
13940 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
13950 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
13960 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
13970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
13980 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
13990 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
139a0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
139b0 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
139c0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e     ** process an
139d0 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  d if this is the
139e0 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69 6e   final header in
139f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68   the journal, th
13a00 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20 20  en it means.    
13a10 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61 72  ** that this par
13a20 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
13a30 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c 65   was being fille
13a40 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65  d but has not ye
13a50 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79  t been.    ** sy
13a60 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 43  nced to disk.  C
13a70 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62 65  ompute the numbe
13a80 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65 64  r of pages based
13a90 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69 6e   on the remainin
13aa0 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66  g.    ** size of
13ab0 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
13ac0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68 69  *.    ** The thi
13ad0 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20 74  rd term of the t
13ae0 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74 6f  est was added to
13af0 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35 36   fix ticket #256
13b00 35 2e 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20 72  5..    ** When r
13b10 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 68 6f  olling back a ho
13b20 74 20 6a 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d  t journal, nRec=
13b30 3d 30 20 61 6c 77 61 79 73 20 6d 65 61 6e 73 20  =0 always means 
13b40 74 68 61 74 20 74 68 65 20 6e 65 78 74 0a 20 20  that the next.  
13b50 20 20 2a 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68    ** chunk of th
13b60 65 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  e journal contai
13b70 6e 73 20 7a 65 72 6f 20 70 61 67 65 73 20 74 6f  ns zero pages to
13b80 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13b90 20 20 42 75 74 0a 20 20 20 20 2a 2a 20 77 68 65    But.    ** whe
13ba0 6e 20 64 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41  n doing a ROLLBA
13bb0 43 4b 20 61 6e 64 20 74 68 65 20 6e 52 65 63 3d  CK and the nRec=
13bc0 3d 30 20 63 68 75 6e 6b 20 69 73 20 74 68 65 20  =0 chunk is the 
13bd0 6c 61 73 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20  last chunk in.  
13be0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
13bf0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
13c00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
13c10 74 20 63 6f 6e 74 61 69 6e 20 61 64 64 69 74 69  t contain additi
13c20 6f 6e 61 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65  onal.    ** page
13c30 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
13c40 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  e rolled back an
13c50 64 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  d that the numbe
13c60 72 20 6f 66 20 70 61 67 65 73 20 0a 20 20 20 20  r of pages .    
13c70 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ** should be com
13c80 70 75 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74  puted based on t
13c90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13ca0 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
13cb0 20 74 65 73 74 63 61 73 65 28 20 6e 52 65 63 3d   testcase( nRec=
13cc0 3d 30 20 26 26 20 21 69 73 48 6f 74 0a 20 20 20  =0 && !isHot.   
13cd0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d        && pPager-
13ce0 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
13cf0 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
13d00 72 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)!=pPager->jour
13d10 6e 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20  nalOff.         
13d20 26 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  && ((szJ - pPage
13d30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
13d40 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
13d50 50 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20  Pager))>0.      
13d60 20 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a     && pagerNextJ
13d70 6f 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69  ournalPageIsVali
13d80 64 28 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b  d(pPager).    );
13d90 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
13da0 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
13db0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13dc0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13dd0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
13de0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13df0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
13e00 63 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d  c = (int)((szJ -
13e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13e20 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50  Off) / JOURNAL_P
13e30 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20  G_SZ(pPager));. 
13e40 20 20 20 20 20 69 73 55 6e 73 79 6e 63 20 3d 20       isUnsync = 
13e50 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
13e60 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13e70 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
13e80 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
13e90 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
13ea0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
13eb0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
13ec0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
13ed0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13ee0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13ef0 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
13f00 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
13f10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
13f20 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
13f30 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
13f40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13f50 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
13f60 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
13f70 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
13f80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67  r->dbSize = mxPg
13f90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13fa0 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
13fb0 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
13fc0 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
13fd0 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a  into the .    **
13fe0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
13ff0 6e 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65  nd/or page cache
14000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
14010 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b  (u=0; u<nRec; u+
14020 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  +){.      if( ne
14030 65 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a  edPagerReset ){.
14040 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
14050 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
14060 20 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65       needPagerRe
14070 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  set = 0;.      }
14080 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
14090 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
140a0 61 67 65 28 70 50 61 67 65 72 2c 31 2c 69 73 55  age(pPager,1,isU
140b0 6e 73 79 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a  nsync,&pPager->j
140c0 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a  ournalOff,0,0);.
140d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
140e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
140f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14100 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
14110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14120 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  OK;.          pP
14130 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14140 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20   = szJ;.        
14150 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14170 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75    /* If we are u
14180 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63  nable to rollbac
14190 6b 2c 20 71 75 69 74 20 61 6e 64 20 72 65 74 75  k, quit and retu
141a0 72 6e 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  rn the error.   
141b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20         ** code. 
141c0 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
141d0 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
141e0 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
141f0 61 74 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ate.          **
14200 20 73 6f 20 74 68 61 74 20 6e 6f 20 66 75 72 74   so that no furt
14210 68 65 72 20 68 61 72 6d 20 77 69 6c 6c 20 62 65  her harm will be
14220 20 64 6f 6e 65 2e 20 20 50 65 72 68 61 70 73 20   done.  Perhaps 
14230 74 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 20  the next.       
14240 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f     ** process to
14250 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c   come along will
14260 20 62 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c   be able to roll
14270 62 61 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  back the databas
14280 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
14290 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
142a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
142b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
142c0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
142d0 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
142e0 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
142f0 61 79 62 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c  ayback:.  /* Fol
14300 6c 6f 77 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  lowing a rollbac
14310 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
14320 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 62  file should be b
14330 61 63 6b 20 69 6e 20 69 74 73 20 6f 72 69 67 69  ack in its origi
14340 6e 61 6c 0a 20 20 2a 2a 20 73 74 61 74 65 20 70  nal.  ** state p
14350 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
14360 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
14370 74 69 6f 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20  tion, so invoke 
14380 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
14390 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
143a0 45 44 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ED file-control 
143b0 6d 65 74 68 6f 64 20 74 6f 20 64 69 73 61 62 6c  method to disabl
143c0 65 20 74 68 65 0a 20 20 2a 2a 20 61 73 73 65 72  e the.  ** asser
143d0 74 69 6f 6e 20 74 68 61 74 20 74 68 65 20 74 72  tion that the tr
143e0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
143f0 72 20 77 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a  r was modified..
14400 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 0a 20    */.  assert(. 
14410 20 20 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70     pPager->fd->p
14420 4d 65 74 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20  Methods==0 ||.  
14430 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
14440 6f 6e 74 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66  ontrol(pPager->f
14450 64 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  d,SQLITE_FCNTL_D
14460 42 5f 55 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d  B_UNCHANGED,0)>=
14470 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a  SQLITE_OK.  );..
14480 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 6c 61    /* If this pla
14490 79 62 61 63 6b 20 69 73 20 68 61 70 70 65 6e 69  yback is happeni
144a0 6e 67 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ng automatically
144b0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
144c0 61 6e 20 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d  an IO or .  ** m
144d0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 74 68 61 74  alloc error that
144e0 20 6f 63 63 75 72 72 65 64 20 61 66 74 65 72 20   occurred after 
144f0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
14500 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 62  er was updated b
14510 75 74 20 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20  ut .  ** before 
14520 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
14530 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74  was committed, t
14540 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 2d 63  hen the change-c
14550 6f 75 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64  ounter .  ** mod
14560 69 66 69 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75  ification may ju
14570 73 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 76  st have been rev
14580 65 72 74 65 64 2e 20 49 66 20 74 68 69 73 20 68  erted. If this h
14590 61 70 70 65 6e 73 20 69 6e 20 65 78 63 6c 75 73  appens in exclus
145a0 69 76 65 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20  ive .  ** mode, 
145b0 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
145c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 70 65 72  transactions per
145d0 66 6f 72 6d 65 64 20 62 79 20 74 68 65 20 63 6f  formed by the co
145e0 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f  nnection will no
145f0 74 0a 20 20 2a 2a 20 75 70 64 61 74 65 20 74 68  t.  ** update th
14600 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
14610 20 61 74 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61   at all. This ma
14620 79 20 6c 65 61 64 20 74 6f 20 63 61 63 68 65 20  y lead to cache 
14630 69 6e 63 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20  inconsistency.  
14640 2a 2a 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  ** problems for 
14650 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14660 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
14670 20 74 68 65 20 66 75 74 75 72 65 2e 20 53 6f 2c   the future. So,
14680 20 6a 75 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61   just.  ** in ca
14690 73 65 20 74 68 69 73 20 68 61 73 20 68 61 70 70  se this has happ
146a0 65 6e 65 64 2c 20 63 6c 65 61 72 20 74 68 65 20  ened, clear the 
146b0 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
146c0 66 6c 61 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  flag now..  */. 
146d0 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
146e0 6f 75 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65  ountDone = pPage
146f0 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20  r->tempFile;..  
14700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14710 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72  K ){.    zMaster
14720 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   = pPager->pTmpS
14730 70 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72  pace;.    rc = r
14740 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
14750 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
14760 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
14770 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
14780 31 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  1);.    testcase
14790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
147a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
147b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
147c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
147d0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
147e0 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
147f0 3d 27 5c 30 27 29 3b 0a 20 20 20 20 74 65 73 74  ='\0');.    test
14800 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
14810 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  _OK );.  }.  if(
14820 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14830 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20  & zMaster[0] && 
14840 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  res ){.    /* If
14850 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73   there was a mas
14860 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ter journal and 
14870 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
14880 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  l return success
14890 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
148a0 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
148b0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
148c0 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
148d0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
148e0 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61  er_delmaster(pPa
148f0 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
14900 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
14910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
14920 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
14930 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
14940 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
14950 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
14960 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
14970 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
14980 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
14990 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
149a0 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
149b0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
149c0 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
149d0 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
149e0 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
149f0 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
14a00 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
14a10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14a20 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
14a30 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
14a40 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
14a50 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
14a60 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
14a70 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
14a80 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
14a90 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
14aa0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
14ab0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
14ac0 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
14ad0 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
14ae0 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
14af0 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
14b00 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
14b10 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
14b20 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
14b30 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
14b40 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
14b50 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
14b60 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
14b70 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
14b80 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
14b90 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
14ba0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
14bb0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
14bc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
14bd0 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
14be0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
14bf0 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
14c00 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
14c10 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
14c20 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
14c30 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
14c40 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
14c50 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14c60 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
14c70 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14c80 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
14c90 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
14ca0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
14cb0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
14cc0 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
14cd0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
14ce0 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
14cf0 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
14d00 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
14d10 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
14d20 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
14d30 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
14d40 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
14d50 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
14d60 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
14d70 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
14d80 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
14d90 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
14da0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
14db0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
14dc0 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
14dd0 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
14de0 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
14df0 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
14e00 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
14e10 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
14e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
14e30 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
14e40 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
14e50 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
14e60 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
14e70 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
14e80 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
14e90 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
14ea0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
14eb0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
14ec0 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
14ed0 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
14ee0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
14ef0 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
14f00 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
14f10 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
14f20 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
14f30 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
14f40 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
14f50 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
14f60 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
14f70 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
14f80 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
14f90 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
14fa0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
14fb0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
14fc0 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
14fd0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
14fe0 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
14ff0 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
15000 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
15010 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
15020 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
15030 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
15040 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
15050 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
15060 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
15070 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
15080 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
15090 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
150a0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
150b0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
150c0 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
150d0 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
150e0 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
150f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
15100 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
15110 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
15120 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
15130 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
15140 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
15150 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
15160 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
15170 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
15180 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
15190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
151a0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
151b0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
151c0 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
151d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
151e0 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
151f0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
15200 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
15210 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
15220 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
15230 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
15240 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
15250 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
15260 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
15270 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
15280 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
15290 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
152a0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
152b0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
152c0 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
152d0 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
152e0 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
152f0 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
15300 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
15310 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
15320 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15330 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15340 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
15350 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
15360 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
15370 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
15380 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
15390 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
153a0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
153b0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
153c0 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
153d0 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
153e0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
153f0 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 70 50 61 67  ;..  /* Use pPag
15400 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61  er->journalOff a
15410 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
15420 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
15430 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
15440 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 61 63 74  ournal.  The act
15450 75 61 6c 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ual file might b
15460 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
15470 69 73 20 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52  is in.  ** PAGER
15480 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
15490 4e 43 41 54 45 20 6f 72 20 50 41 47 45 52 5f 4a  NCATE or PAGER_J
154a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
154b0 53 54 2e 20 20 42 75 74 20 61 6e 79 74 68 69 6e  ST.  But anythin
154c0 67 0a 20 20 2a 2a 20 70 61 73 74 20 70 50 61 67  g.  ** past pPag
154d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  er->journalOff i
154e0 73 20 6f 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20  s off-limits to 
154f0 75 73 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d  us..  */.  szJ =
15500 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15510 4f 66 66 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  Off;..  /* Begin
15520 20 62 79 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   by rolling back
15530 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68   records from th
15540 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73  e main journal s
15550 74 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20  tarting at.  ** 
15560 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
15570 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
15580 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  nuing to the nex
15590 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
155a0 2e 0a 20 20 2a 2a 20 54 68 65 72 65 20 6d 69 67  ..  ** There mig
155b0 68 74 20 62 65 20 72 65 63 6f 72 64 73 20 69 6e  ht be records in
155c0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
155d0 6c 20 74 68 61 74 20 68 61 76 65 20 61 20 70 61  l that have a pa
155e0 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67  ge number.  ** g
155f0 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
15600 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65  current database
15610 20 73 69 7a 65 20 28 70 50 61 67 65 72 2d 3e 64   size (pPager->d
15620 62 53 69 7a 65 29 20 62 75 74 20 74 68 6f 73 65  bSize) but those
15630 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b  .  ** will be sk
15640 69 70 70 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ipped automatica
15650 6c 6c 79 2e 20 20 50 61 67 65 73 20 61 72 65 20  lly.  Pages are 
15660 61 64 64 65 64 20 74 6f 20 70 44 6f 6e 65 20 61  added to pDone a
15670 73 20 74 68 65 79 0a 20 20 2a 2a 20 61 72 65 20  s they.  ** are 
15680 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
15690 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f 69  /.  if( pSavepoi
156a0 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66  nt ){.    iHdrOf
156b0 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
156c0 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61  iHdrOffset ? pSa
156d0 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66  vepoint->iHdrOff
156e0 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70  set : szJ;.    p
156f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15700 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  f = pSavepoint->
15710 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69  iOffset;.    whi
15720 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
15730 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
15740 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20  rnalOff<iHdrOff 
15750 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
15760 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
15770 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c  _page(pPager, 1,
15780 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75   0, &pPager->jou
15790 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e  rnalOff, 1, pDon
157a0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
157b0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
157c0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65  _DONE );.  }else
157d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
157e0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
157f0 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65  }..  /* Continue
15800 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15810 63 6f 72 64 73 20 6f 75 74 20 6f 66 20 74 68 65  cords out of the
15820 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74   main journal st
15830 61 72 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74  arting at.  ** t
15840 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
15850 20 68 65 61 64 65 72 20 73 65 65 6e 20 61 6e 64   header seen and
15860 20 63 6f 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69   continuing unti
15870 6c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  l the effective 
15880 65 6e 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  end.  ** of the 
15890 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
158a0 65 2e 20 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20  e.  Continue to 
158b0 73 6b 69 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  skip out-of-rang
158c0 65 20 70 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a  e pages and.  **
158d0 20 63 6f 6e 74 69 6e 75 65 20 61 64 64 69 6e 67   continue adding
158e0 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61   pages rolled ba
158f0 63 6b 20 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a  ck to pDone..  *
15900 2f 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  /.  while( rc==S
15910 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
15920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73  er->journalOff<s
15930 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 69 69  zJ ){.    u32 ii
15940 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15950 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
15960 20 20 20 20 75 33 32 20 6e 4a 52 65 63 20 3d 20      u32 nJRec = 
15970 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
15980 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f   of Journal Reco
15990 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64  rds */.    u32 d
159a0 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
159b0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
159c0 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65  ager, szJ, &nJRe
159d0 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
159e0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
159f0 54 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20  TE_DONE );..    
15a00 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70  /*.    ** The "p
15a10 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15a20 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r+JOURNAL_HDR_SZ
15a30 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72  (pPager)==pPager
15a40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20  ->journalOff".  
15a50 20 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c    ** test is rel
15a60 61 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23  ated to ticket #
15a70 32 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64  2565.  See the d
15a80 69 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65  iscussion in the
15a90 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c  .    ** pager_pl
15aa0 61 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f  ayback() functio
15ab0 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  n for additional
15ac0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
15ad0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
15ae0 20 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20   !(nJRec==0.    
15af0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15b00 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15b10 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
15b20 29 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )!=pPager->journ
15b30 61 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26  alOff.         &
15b40 26 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  & ((szJ - pPager
15b50 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
15b60 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
15b70 61 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20  ager))>0.       
15b80 20 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f    && pagerNextJo
15b90 75 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64  urnalPageIsValid
15ba0 28 70 50 61 67 65 72 29 29 0a 20 20 20 20 29 3b  (pPager)).    );
15bb0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
15bc0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
15bd0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
15be0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
15bf0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
15c00 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
15c10 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
15c20 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
15c30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
15c40 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15c50 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
15c60 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
15c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
15c80 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
15c90 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
15ca0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
15cb0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
15cc0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
15cd0 2c 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d  , 1, 0, &pPager-
15ce0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
15cf0 70 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pDone);.    }.  
15d00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15d10 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d  LITE_DONE );.  }
15d20 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
15d30 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
15d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
15d50 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e  szJ );..  /* Fin
15d60 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20  ally,  rollback 
15d70 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73  pages from the s
15d80 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67  ub-journal.  Pag
15d90 65 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a  e that were.  **
15da0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c   previously roll
15db0 65 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74  ed back out of t
15dc0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15dd0 28 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69  (and are hence i
15de0 6e 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69  n pDone).  ** wi
15df0 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20  ll be skipped.  
15e00 4f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67  Out-of-range pag
15e10 65 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70  es are also skip
15e20 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ped..  */.  if( 
15e30 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
15e40 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20    u32 ii;       
15e50 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
15e60 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20  nter */.    i64 
15e70 6f 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f  offset = pSavepo
15e80 69 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b  int->iSubRec*(4+
15e90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15ea0 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53  );.    for(ii=pS
15eb0 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65  avepoint->iSubRe
15ec0 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  c; rc==SQLITE_OK
15ed0 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e   && ii<pPager->n
15ee0 53 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20  SubRec; ii++){. 
15ef0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66       assert( off
15f00 73 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65  set==ii*(4+pPage
15f10 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
15f20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15f30 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15f40 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c  ge(pPager, 0, 0,
15f50 20 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f   &offset, 1, pDo
15f60 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15f70 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15f80 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20  E_DONE );.  }.. 
15f90 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
15fa0 73 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20  stroy(pDone);.  
15fb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15fc0 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
15fd0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
15fe0 4a 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  J;.  }.  return 
15ff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
16000 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
16010 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
16020 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
16030 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
16040 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
16050 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
16060 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16070 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
16080 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
16090 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
160a0 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
160b0 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
160c0 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
160d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
160e0 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
160f0 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
16100 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
16110 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
16120 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
16130 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
16140 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
16150 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
16160 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
16170 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
16180 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
16190 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
161a0 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
161b0 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
161c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
161d0 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
161e0 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
161f0 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
16200 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
16210 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
16220 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
16230 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
16240 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
16250 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
16260 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
16270 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
16280 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
16290 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
162a0 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
162b0 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
162c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
162d0 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
162e0 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
162f0 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
16300 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
16310 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
16320 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
16330 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
16340 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
16350 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
16360 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
16370 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
16380 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
16390 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
163a0 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
163b0 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
163c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
163d0 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
163e0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
163f0 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
16400 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
16410 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
16420 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
16430 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
16440 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
16450 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
16460 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
16470 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
16480 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
16490 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
164a0 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
164b0 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
164c0 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
164d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
164e0 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
164f0 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
16500 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
16510 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
16520 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
16530 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
16540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
16550 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
16560 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
16570 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
16580 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
16590 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
165a0 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
165b0 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
165c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
165d0 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
165e0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
165f0 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
16600 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
16610 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
16620 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
16630 6e 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c  noSync =  (level
16640 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
16650 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20  empFile) ?1:0;. 
16660 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
16670 63 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26  c = (level==3 &&
16680 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16690 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  le) ?1:0;.  pPag
166a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
166b0 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c   (bFullFsync?SQL
166c0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51  ITE_SYNC_FULL:SQ
166d0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
166e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
166f0 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72  >noSync ) pPager
16700 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
16710 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
16720 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
16730 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73  obal variable is
16740 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65   incremented whe
16750 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72  never the librar
16760 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  y.** attempts to
16770 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
16780 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e  y file.  This in
16790 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
167a0 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
167b0 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
167c0 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20  ly.  .*/.#ifdef 
167d0 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
167e0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
167f0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
16800 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
16810 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
16820 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
16830 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16840 20 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65   into *pFile. Re
16850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
16860 6e 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72  n success .** or
16870 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
16880 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
16890 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
168a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
168b0 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
168c0 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20  orary file when 
168d0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
168e0 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61  .** The flags pa
168f0 73 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20  ssed to the VFS 
16900 6c 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61  layer xOpen() ca
16910 6c 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65  ll are those spe
16920 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72  cified.** by par
16930 61 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20  ameter vfsFlags 
16940 4f 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f  ORed with the fo
16950 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
16960 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
16970 45 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20  EADWRITE.**     
16980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16990 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
169a0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a  _OPEN_EXCLUSIVE.
169b0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
169c0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
169d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
169e0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
169f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
16a00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
16a10 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
16a20 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
16a30 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
16a40 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16a50 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
16a60 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
16a70 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
16a80 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
16a90 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
16aa0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
16ab0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16ac0 65 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  e */..#ifdef SQL
16ad0 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
16ae0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
16af0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
16b00 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
16b10 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
16b20 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
16b30 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
16b40 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16b50 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16b60 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
16b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
16b80 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
16b90 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
16ba0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16bb0 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
16bc0 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
16bd0 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
16be0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
16bf0 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
16c00 46 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72  File) );.  retur
16c10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16c20 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
16c30 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ler function..**
16c40 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e  .** The pager in
16c50 76 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68  vokes the busy-h
16c60 61 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65  andler if sqlite
16c70 33 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e  3OsLock() return
16c80 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  s .** SQLITE_BUS
16c90 59 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f  Y when trying to
16ca0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f   upgrade from no
16cb0 2d 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45  -lock to a SHARE
16cc0 44 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68  D lock,.** or wh
16cd0 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67  en trying to upg
16ce0 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
16cf0 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20  RVED lock to an 
16d00 45 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f  EXCLUSIVE .** lo
16d10 63 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74  ck. It does *not
16d20 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
16d30 79 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75  y handler when u
16d40 70 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a  pgrading from.**
16d50 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52   SHARED to RESER
16d60 56 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67  VED, or when upg
16d70 72 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52  rading from SHAR
16d80 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a  ED to EXCLUSIVE.
16d90 2a 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73  ** (which occurs
16da0 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72   during hot-jour
16db0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53  nal rollback). S
16dc0 75 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  ummary:.**.**   
16dd0 54 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20  Transition      
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73    | Invokes xBus
16e00 79 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d  yHandler.**   --
16e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e40 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c  ------.**   NO_L
16e50 4f 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41  OCK       -> SHA
16e60 52 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20  RED_LOCK      | 
16e70 59 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f  Yes.**   SHARED_
16e80 4c 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56  LOCK   -> RESERV
16e90 45 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a  ED_LOCK    | No.
16ea0 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b  **   SHARED_LOCK
16eb0 20 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f     -> EXCLUSIVE_
16ec0 4c 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20  LOCK   | No.**  
16ed0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d   RESERVED_LOCK -
16ee0 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  > EXCLUSIVE_LOCK
16ef0 20 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49     | Yes.**.** I
16f00 66 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c  f the busy-handl
16f10 65 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  er callback retu
16f20 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
16f30 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65  e lock is .** re
16f40 74 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74  tried. If it ret
16f50 75 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  urns zero, then 
16f60 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20  the SQLITE_BUSY 
16f70 65 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75  error is.** retu
16f80 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
16f90 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  er of the pager 
16fa0 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  API function..*/
16fb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
16fc0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
16fd0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
16fe0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
16ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
17000 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
17010 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
17020 29 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20  )(void *),      
17030 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
17040 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
17050 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
17060 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
17070 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
17080 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
17090 70 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e  pass to xBusyHan
170a0 64 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70  dler */.){  .  p
170b0 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64  Pager->xBusyHand
170c0 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c  ler = xBusyHandl
170d0 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  er;.  pPager->pB
170e0 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
170f0 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b  pBusyHandlerArg;
17100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
17110 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
17120 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
17130 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
17140 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
17150 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
17160 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
17170 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
17180 69 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73  is modified (res
17190 74 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72  tored).** as par
171a0 74 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  t of a transacti
171b0 6f 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20  on or savepoint 
171c0 72 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61  rollback. The ca
171d0 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a  llback gives .**
171e0 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
171f0 64 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  de an opportunit
17200 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
17210 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
17220 6f 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68  o .** agree with
17230 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61   the restored pa
17240 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
17250 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17260 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
17270 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
17280 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29  Reinit)(DbPage*)
17290 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65  ){.  pPager->xRe
172a0 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74  initer = xReinit
172b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
172c0 65 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  e the page size 
172d0 75 73 65 64 20 62 79 20 74 68 65 20 50 61 67 65  used by the Page
172e0 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20 6e 65  r object. The ne
172f0 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a 2a 20  w page size .** 
17300 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a 70 50  is passed in *pP
17310 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  ageSize..**.** I
17320 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
17330 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
17340 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
17350 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
17360 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  it.** is a no-op
17370 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
17380 72 6e 65 64 20 69 73 20 74 68 65 20 65 72 72 6f  rned is the erro
17390 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f  r state error co
173a0 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f 6e 65  de (i.e. .** one
173b0 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   of SQLITE_IOERR
173c0 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  , SQLITE_CORRUPT
173d0 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29   or SQLITE_FULL)
173e0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
173f0 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  e, if all of the
17400 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
17410 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74  rue:.**.**   * t
17420 68 65 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65  he new page size
17430 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50 61 67   (value of *pPag
17440 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69 64 20  eSize) is valid 
17450 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20 20 20  (a power .**    
17460 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65 6e 20   of two between 
17470 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45 5f 4d  512 and SQLITE_M
17480 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20 69 6e  AX_PAGE_SIZE, in
17490 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a 2a 2a  clusive), and.**
174a0 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20 61 72  .**   * there ar
174b0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
174c0 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
174d0 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
174e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
174f0 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20 69 6e  either not an in
17500 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17510 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20 20 20   or it is.**    
17520 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
17530 74 61 62 61 73 65 20 74 68 61 74 20 63 75 72 72  tabase that curr
17540 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73 20 6f  ently consists o
17550 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a 2a 2a  f zero pages..**
17560 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70 61 67  .** then the pag
17570 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65 20 73  er object page s
17580 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 2a 70  ize is set to *p
17590 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  PageSize..**.** 
175a0 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  If the page size
175b0 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74 68 65   is changed, the
175c0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
175d0 75 73 65 73 20 73 71 6c 69 74 65 33 50 61 67 65  uses sqlite3Page
175e0 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20 74 6f  rMalloc() .** to
175f0 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20 50 61   obtain a new Pa
17600 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75  ger.pTmpSpace bu
17610 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 61 6c  ffer. If this al
17620 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74  location attempt
17630 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49   .** fails, SQLI
17640 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
17650 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67  rned and the pag
17660 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73 20 75  e size remains u
17670 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 6e  nchanged. .** In
17680 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73 65 73   all other cases
17690 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
176a0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
176b0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
176c0 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 2c 20  is not changed, 
176d0 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 6f  either because o
176e0 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d 65 72  ne of the enumer
176f0 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74 69 6f  ated.** conditio
17700 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  ns above is not 
17710 74 72 75 65 2c 20 74 68 65 20 70 61 67 65 72 20  true, the pager 
17720 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61  was in error sta
17730 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20  te when this.** 
17740 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
17750 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73 65 20  led, or because 
17760 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  the memory alloc
17770 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20 66 61  ation attempt fa
17780 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e 20 2a  iled, .** then *
17790 70 50 61 67 65 53 69 7a 65 20 69 73 20 73 65 74  pPageSize is set
177a0 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72 65 74   to the old, ret
177b0 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 20  ained page size 
177c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
177d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
177e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
177f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17800 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b  u16 *pPageSize){
17810 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
17820 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
17830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17840 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
17850 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
17860 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
17870 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
17880 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
17890 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
178a0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
178b0 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  );.    if( pageS
178c0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
178d0 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
178e0 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
178f0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
17900 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
17910 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
17920 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
17930 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
17940 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
17950 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
17960 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
17970 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
17980 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
17990 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
179a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
179b0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
179c0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
179d0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
179e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
179f0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
17a00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17a10 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
17a20 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
17a30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
17a40 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
17a50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
17a60 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65  cacheSetPageSize
17a70 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
17a80 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  , pageSize);.   
17a90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a     }.    }.    *
17aa0 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36  pPageSize = (u16
17ab0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
17ac0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
17ad0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
17ae0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
17af0 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
17b00 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
17b10 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
17b20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
17b30 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
17b40 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
17b50 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
17b60 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
17b70 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
17b80 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
17b90 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
17ba0 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
17bb0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
17bc0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
17bd0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
17be0 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
17bf0 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
17c00 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
17c10 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
17c20 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
17c30 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
17c40 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
17c50 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
17c60 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
17c70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
17c80 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
17c90 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
17ca0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
17cb0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
17cc0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
17cd0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
17ce0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
17cf0 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
17d00 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
17d10 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
17d20 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
17d30 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
17d40 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
17d50 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
17d60 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
17d70 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
17d80 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
17d90 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
17da0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
17db0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
17dc0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
17dd0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
17de0 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
17df0 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
17e00 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
17e10 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
17e20 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
17e30 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
17e40 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
17e50 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
17e60 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
17e70 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
17e80 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
17e90 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
17ea0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
17eb0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
17ec0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
17ed0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
17ee0 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
17ef0 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
17f00 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
17f10 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
17f20 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
17f30 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
17f40 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
17f50 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
17f60 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
17f70 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
17f80 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
17f90 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
17fa0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
17fb0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
17fc0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
17fd0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
17fe0 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
17ff0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
18000 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
18010 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
18020 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
18030 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
18040 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
18050 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
18060 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
18070 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
18080 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
18090 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
180a0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
180b0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
180c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
180d0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
180e0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
180f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
18100 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
18110 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
18120 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
18130 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
18140 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
18150 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
18160 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  ts to. .**.** If
18170 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 6f   the pager was o
18180 70 65 6e 65 64 20 6f 6e 20 61 20 74 72 61 6e 73  pened on a trans
18190 69 65 6e 74 20 66 69 6c 65 20 28 7a 46 69 6c 65  ient file (zFile
181a0 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f 72 0a 2a 2a  name==""), or.**
181b0 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 66 69 6c   opened on a fil
181c0 65 20 6c 65 73 73 20 74 68 61 6e 20 4e 20 62 79  e less than N by
181d0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
181e0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
181f0 73 0a 2a 2a 20 7a 65 72 6f 65 64 20 61 6e 64 20  s.** zeroed and 
18200 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
18210 65 64 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ed. The rational
18220 65 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68  e for this is th
18230 61 74 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  at this .** func
18240 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
18250 72 65 61 64 20 64 61 74 61 62 61 73 65 20 68 65  read database he
18260 61 64 65 72 73 2c 20 61 6e 64 20 61 20 6e 65 77  aders, and a new
18270 20 74 72 61 6e 73 69 65 6e 74 20 6f 72 0a 2a 2a   transient or.**
18280 20 7a 65 72 6f 20 73 69 7a 65 64 20 64 61 74 61   zero sized data
18290 62 61 73 65 20 68 61 73 20 61 20 68 65 61 64 65  base has a heade
182a0 72 20 74 68 61 6e 20 63 6f 6e 73 69 73 74 73 20  r than consists 
182b0 65 6e 74 69 72 65 6c 79 20 6f 66 20 7a 65 72 6f  entirely of zero
182c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  es..**.** If any
182d0 20 49 4f 20 65 72 72 6f 72 20 61 70 61 72 74 20   IO error apart 
182e0 66 72 6f 6d 20 53 51 4c 49 54 45 5f 49 4f 45 52  from SQLITE_IOER
182f0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 69 73 20  R_SHORT_READ is 
18300 65 6e 63 6f 75 6e 74 65 72 65 64 2c 0a 2a 2a 20  encountered,.** 
18310 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
18320 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
18330 65 20 63 61 6c 6c 65 72 20 61 6e 64 20 74 68 65  e caller and the
18340 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
18350 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65  .** output buffe
18360 72 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  r undefined..*/.
18370 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
18380 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
18390 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
183a0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
183b0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
183c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
183d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
183e0 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72  , 0, N);.  asser
183f0 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
18400 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  ->fd) || pPager-
18410 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 69  >tempFile );.  i
18420 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
18430 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 49 4f 54  ->fd) ){.    IOT
18440 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
18450 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
18460 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
18470 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
18480 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
18490 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
184a0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
184b0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
184c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
184d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
184e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
184f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
18500 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
18510 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
18520 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
18530 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 70 50 61  ted .** with pPa
18540 67 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ger. Normally, t
18550 68 69 73 20 69 73 20 63 61 6c 63 75 6c 61 74 65  his is calculate
18560 64 20 61 73 20 28 3c 64 62 20 66 69 6c 65 20 73  d as (<db file s
18570 69 7a 65 3e 2f 3c 70 61 67 65 2d 73 69 7a 65 3e  ize>/<page-size>
18580 29 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 69  )..** However, i
18590 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 62 65  f the file is be
185a0 74 77 65 65 6e 20 31 20 61 6e 64 20 3c 70 61 67  tween 1 and <pag
185b0 65 2d 73 69 7a 65 3e 20 62 79 74 65 73 20 69 6e  e-size> bytes in
185c0 20 73 69 7a 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   size, then .** 
185d0 74 68 69 73 20 69 73 20 63 6f 6e 73 69 64 65 72  this is consider
185e0 65 64 20 61 20 31 20 70 61 67 65 20 66 69 6c 65  ed a 1 page file
185f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
18600 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
18610 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
18620 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18630 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  led, then the.**
18640 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
18650 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18660 6e 65 64 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  ned and *pnPage 
18670 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 20  left unchanged. 
18680 4f 72 2c 0a 2a 2a 20 69 66 20 74 68 65 20 66 69  Or,.** if the fi
18690 6c 65 20 73 79 73 74 65 6d 20 68 61 73 20 74 6f  le system has to
186a0 20 62 65 20 71 75 65 72 69 65 64 20 66 6f 72 20   be queried for 
186b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
186c0 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20  file and.** the 
186d0 71 75 65 72 79 20 61 74 74 65 6d 70 74 20 72 65  query attempt re
186e0 74 75 72 6e 73 20 61 6e 20 49 4f 20 65 72 72 6f  turns an IO erro
186f0 72 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  r, the IO error 
18700 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18710 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65 20  .** and *pnPage 
18720 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
18730 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
18740 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e  se, if everythin
18750 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  g is successful,
18760 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
18770 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
18780 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 73 65  nd *pnPage is se
18790 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
187a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
187b0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
187c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
187d0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
187e0 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67  ager, int *pnPag
187f0 65 29 7b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  e){.  Pgno nPage
18800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18810 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75  /* Value to retu
18820 72 6e 20 76 69 61 20 2a 70 6e 50 61 67 65 20 2a  rn via *pnPage *
18830 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  /..  /* If the p
18840 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
18850 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
18860 74 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  te, return the e
18870 72 72 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  rror code. */.  
18880 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18890 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
188a0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
188b0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74  e;.  }..  /* Det
188c0 65 72 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65  ermine the numbe
188d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
188e0 65 20 66 69 6c 65 2e 20 53 74 6f 72 65 20 74 68  e file. Store th
188f0 69 73 20 69 6e 20 6e 50 61 67 65 2e 20 2a 2f 0a  is in nPage. */.
18900 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
18910 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
18920 20 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d   nPage = pPager-
18930 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65  >dbSize;.  }else
18940 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
18950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18960 20 45 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20   Error returned 
18970 62 79 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20  by OsFileSize() 
18980 2a 2f 0a 20 20 20 20 69 36 34 20 6e 20 3d 20 30  */.    i64 n = 0
18990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
189a0 2a 20 46 69 6c 65 20 73 69 7a 65 20 69 6e 20 62  * File size in b
189b0 79 74 65 73 20 72 65 74 75 72 6e 65 64 20 62 79  ytes returned by
189c0 20 4f 73 46 69 6c 65 53 69 7a 65 28 29 20 2a 2f   OsFileSize() */
189d0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ..    assert( is
189e0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
189f0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
18a00 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20  File );.    if( 
18a10 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
18a20 64 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  d) && (0 != (rc 
18a30 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18a40 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
18a50 26 6e 29 29 29 20 29 7b 0a 20 20 20 20 20 20 70  &n))) ){.      p
18a60 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
18a70 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
18a80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18a90 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
18aa0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18ab0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
18ac0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
18ad0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50        nPage = (P
18ae0 67 6e 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d  gno)(n / pPager-
18af0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
18b00 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18b10 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18b20 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
18b30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18b40 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70 50 61  nPage;.      pPa
18b50 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
18b60 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 70  = nPage;.      p
18b70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c  Pager->dbSizeVal
18b80 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  id = 1;.    }.  
18b90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
18ba0 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20 6f 66  urrent number of
18bb0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 66 69   pages in the fi
18bc0 6c 65 20 69 73 20 67 72 65 61 74 65 72 20 74 68  le is greater th
18bd0 61 6e 20 74 68 65 20 0a 20 20 2a 2a 20 63 6f 6e  an the .  ** con
18be0 66 69 67 75 72 65 64 20 6d 61 78 69 6d 75 6d 20  figured maximum 
18bf0 70 61 67 65 72 20 6e 75 6d 62 65 72 2c 20 69 6e  pager number, in
18c00 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 77  crease the allow
18c10 65 64 20 6c 69 6d 69 74 20 73 6f 0a 20 20 2a 2a  ed limit so.  **
18c20 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
18c30 61 6e 20 62 65 20 72 65 61 64 2e 0a 20 20 2a 2f  an be read..  */
18c40 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 70 50 61  .  if( nPage>pPa
18c50 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
18c60 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
18c70 6f 20 3d 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  o = (Pgno)nPage;
18c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
18c90 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
18ca0 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  le and return SQ
18cb0 4c 49 54 45 5f 4f 4b 20 2a 2f 0a 20 20 69 66 28  LITE_OK */.  if(
18cc0 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   pnPage ){.    *
18cd0 70 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  pnPage = nPage;.
18ce0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
18cf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
18d00 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
18d10 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
18d20 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
18d30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
18d40 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
18d50 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
18d60 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
18d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
18d80 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
18d90 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
18da0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
18db0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
18dc0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
18dd0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
18de0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
18df0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
18e00 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
18e10 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
18e20 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
18e30 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
18e40 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
18e50 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
18e60 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
18e70 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
18e80 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
18e90 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
18ea0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18eb0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
18ec0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
18ed0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
18ee0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
18ef0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
18f00 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
18f10 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
18f20 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
18f30 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
18f40 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
18f50 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
18f60 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
18f70 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
18f80 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
18f90 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
18fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18fc0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
18fd0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
18fe0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
18ff0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
19000 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
19010 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
19020 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
19030 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
19040 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
19050 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
19060 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
19070 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
19080 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
19090 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
190a0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
190b0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
190c0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
190d0 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
190e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
190f0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
19100 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
19110 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
19120 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
19130 20 74 68 69 73 20 69 73 20 65 69 74 68 65 72 20   this is either 
19140 61 20 6e 6f 2d 6f 70 20 28 62 65 63 61 75 73 65  a no-op (because
19150 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
19160 6f 63 6b 20 69 73 20 0a 20 20 2a 2a 20 61 6c 72  ock is .  ** alr
19170 65 61 64 79 20 68 65 6c 64 2c 20 6f 72 20 6f 6e  eady held, or on
19180 65 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69 73  e of the transis
19190 74 69 6f 6e 73 20 74 68 61 74 20 74 68 65 20 62  tions that the b
191a0 75 73 79 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a  usy-handler.  **
191b0 20 6d 61 79 20 62 65 20 69 6e 76 6f 6b 65 64 20   may be invoked 
191c0 64 75 72 69 6e 67 2c 20 61 63 63 6f 72 64 69 6e  during, accordin
191d0 67 20 74 6f 20 74 68 65 20 63 6f 6d 6d 65 6e 74  g to the comment
191e0 20 61 62 6f 76 65 0a 20 20 2a 2a 20 73 71 6c 69   above.  ** sqli
191f0 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
19200 61 6e 64 6c 65 72 28 29 2e 0a 20 20 2a 2f 0a 20  andler()..  */. 
19210 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72   assert( (pPager
19220 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70  ->state>=locktyp
19230 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 50  e).       || (pP
19240 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
19250 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 6c 6f 63  ER_UNLOCK && loc
19260 6b 74 79 70 65 3d 3d 50 41 47 45 52 5f 53 48 41  ktype==PAGER_SHA
19270 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  RED).       || (
19280 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19290 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 26 26  AGER_RESERVED &&
192a0 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47 45 52   locktype==PAGER
192b0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 29 3b  _EXCLUSIVE).  );
192c0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
192d0 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  state>=locktype 
192e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
192f0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
19300 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
19310 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
19320 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  k(pPager->fd, lo
19330 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
19340 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
19350 42 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e  BUSY && pPager->
19360 78 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  xBusyHandler(pPa
19370 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
19380 72 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28  rArg) );.    if(
19390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
193a0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
193b0 73 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b  state = (u8)lock
193c0 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52  type;.      IOTR
193d0 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64  ACE(("LOCK %p %d
193e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63  \n", pPager, loc
193f0 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20  ktype)).    }.  
19400 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
19410 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
19420 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   the in-memory d
19430 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6d 61  atabase file ima
19440 67 65 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65  ge to nPage page
19450 73 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  s. This .** func
19460 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 61 63  tion does not ac
19470 74 75 61 6c 6c 79 20 6d 6f 64 69 66 79 20 74 68  tually modify th
19480 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19490 6f 6e 20 64 69 73 6b 2e 20 49 74 20 0a 2a 2a 20  on disk. It .** 
194a0 6a 75 73 74 20 73 65 74 73 20 74 68 65 20 69 6e  just sets the in
194b0 74 65 72 6e 61 6c 20 73 74 61 74 65 20 6f 66 20  ternal state of 
194c0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
194d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 0a 2a 2a   so that the .**
194e0 20 74 72 75 6e 63 61 74 69 6f 6e 20 77 69 6c 6c   truncation will
194f0 20 62 65 20 64 6f 6e 65 20 77 68 65 6e 20 74 68   be done when th
19500 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
19510 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
19520 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
19530 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
19540 49 6d 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  Image(Pager *pPa
19550 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
19560 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
19570 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
19580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19590 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 6e 50 61  ger->dbSize>=nPa
195a0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
195b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
195c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
195d0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
195e0 65 20 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a  e = nPage;.}../*
195f0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
19600 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
19610 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
19620 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
19630 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
19640 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
19650 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
19660 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19670 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
19680 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
19690 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
196a0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
196b0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
196c0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
196d0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
196e0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
196f0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
19700 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
19710 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
19720 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
19730 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
19740 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
19750 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
19760 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
19770 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
19780 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
19790 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
197a0 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
197b0 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
197c0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
197d0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
197e0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
197f0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
19800 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
19810 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
19820 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
19830 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
19840 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
19850 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
19860 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19870 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
19880 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
19890 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
198a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
198b0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
198c0 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
198d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
198e0 20 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65   0;.  pager_rese
198f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
19900 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61   MEMDB ){.    pa
19910 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
19920 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
19930 20 2f 2a 20 53 65 74 20 50 61 67 65 72 2e 6a 6f   /* Set Pager.jo
19940 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d 31 20 66  urnalHdr to -1 f
19950 6f 72 20 74 68 65 20 62 65 6e 65 66 69 74 20 6f  or the benefit o
19960 66 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79  f the pager_play
19970 62 61 63 6b 28 29 20 0a 20 20 20 20 2a 2a 20 63  back() .    ** c
19980 61 6c 6c 20 77 68 69 63 68 20 6d 61 79 20 62 65  all which may be
19990 20 6d 61 64 65 20 66 72 6f 6d 20 77 69 74 68 69   made from withi
199a0 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  n pagerUnlockAnd
199b0 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49 66 20 69  Rollback(). If i
199c0 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
199d0 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 75 6e 73  -1, then the uns
199e0 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
199f0 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
19a00 20 66 69 6c 65 20 6d 61 79 0a 20 20 20 20 2a 2a   file may.    **
19a10 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
19a20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19a30 65 2e 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  e. If a power fa
19a40 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
19a50 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
19a60 73 20 68 61 70 70 65 6e 69 6e 67 2c 20 74 68 65  s happening, the
19a70 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
19a80 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 0a 20 20  come corrupt..  
19a90 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
19aa0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 2d 31  >journalHdr = -1
19ab0 3b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  ;.    pagerUnloc
19ac0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
19ad0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
19ae0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
19af0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
19b00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
19b10 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
19b20 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
19b30 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19b40 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
19b50 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
19b60 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
19b70 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
19b80 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
19b90 67 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  geFree(pPager->p
19ba0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
19bb0 69 74 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28  ite3PcacheClose(
19bc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
19bd0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
19be0 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
19bf0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70 49 6e   && !pPager->pIn
19c00 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
19c10 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
19c20 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
19c30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
19c40 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  d) );..  sqlite3
19c50 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
19c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19c70 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
19c80 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
19c90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
19ca0 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
19cb0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
19cc0 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f  for page pPg..*/
19cd0 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67  .Pgno sqlite3Pag
19ce0 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50  erPagenumber(DbP
19cf0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
19d00 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 7d  urn pPg->pgno;.}
19d10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
19d20 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
19d30 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
19d40 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a 76 6f   page pPg..*/.vo
19d50 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  id sqlite3PagerR
19d60 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
19d70 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19d80 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  Ref(pPg);.}../*.
19d90 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  ** Sync the jour
19da0 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  nal. In other wo
19db0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
19dc0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
19dd0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
19de0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
19df0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
19e00 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
19e10 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
19e20 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e 20 62  * disk and can b
19e30 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20 74 68  e restored in th
19e40 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68 6f 74  e event of a hot
19e50 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
19e60 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
19e70 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
19e80 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74 2c 20  lag is not set, 
19e90 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
19ea0 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  on is a.** no-op
19eb0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
19ec0 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69 72 65   actions require
19ed0 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 65 20  d depend on the 
19ee0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a 2a 20  journal-mode.** 
19ef0 61 6e 64 20 74 68 65 20 64 65 76 69 63 65 20 63  and the device c
19f00 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6f  haracteristics o
19f10 66 20 74 68 65 20 74 68 65 20 66 69 6c 65 2d 73  f the the file-s
19f20 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c 6f 77  ystem, as follow
19f30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  s:.**.**   * If 
19f40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19f50 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
19f60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6e   journal file, n
19f70 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a 2a 2a  o action need.**
19f80 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e 0a 2a       be taken..*
19f90 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72 77 69  *.**   * Otherwi
19fa0 73 65 2c 20 69 66 20 74 68 65 20 64 65 76 69 63  se, if the devic
19fb0 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  e does not suppo
19fc0 72 74 20 74 68 65 20 53 41 46 45 5f 41 50 50 45  rt the SAFE_APPE
19fd0 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a 2a 20  ND property,.** 
19fe0 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e 52 65      then the nRe
19ff0 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d  c field of the m
1a000 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69  ost recently wri
1a010 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61  tten journal hea
1a020 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20 75 70  der.**     is up
1a030 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  dated to contain
1a040 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6a   the number of j
1a050 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73 20 74  ournal records t
1a060 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  hat have.**     
1a070 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66 6f 6c  been written fol
1a080 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20 74 68  lowing it. If th
1a090 65 20 70 61 67 65 72 20 69 73 20 6f 70 65 72 61  e pager is opera
1a0a0 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  ting in full-syn
1a0b0 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c 20 74  c.**     mode, t
1a0c0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1a0d0 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 20 62  file is synced b
1a0e0 65 66 6f 72 65 20 74 68 69 73 20 66 69 65 6c 64  efore this field
1a0f0 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a   is updated..**.
1a100 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 64 65  **   * If the de
1a110 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75  vice does not su
1a120 70 70 6f 72 74 20 74 68 65 20 53 45 51 55 45 4e  pport the SEQUEN
1a130 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c 20 74  TIAL property, t
1a140 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f 75 72  hen .**     jour
1a150 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1a160 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 6e  ed..**.** Or, in
1a170 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a 2a 2a   pseudo-code:.**
1a180 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20 3c 69  .**   if( NOT <i
1a190 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
1a1a0 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66 28 20  > ){.**     if( 
1a1b0 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e 44 20  NOT SAFE_APPEND 
1a1c0 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66 28 20  ){.**       if( 
1a1d0 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 3e  <full-sync mode>
1a1e0 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61   ) xSync(<journa
1a1f0 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 20  l file>);.**    
1a200 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65 63 20     <update nRec 
1a210 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20 7d 20  field>.**     } 
1a220 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20  .**     if( NOT 
1a230 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78 53 79  SEQUENTIAL ) xSy
1a240 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1a250 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a  >);.**   }.**.**
1a260 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   The Pager.needS
1a270 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65 76 65  ync flag is neve
1a280 72 20 62 65 20 73 65 74 20 66 6f 72 20 74 65 6d  r be set for tem
1a290 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20 6f 72  porary files, or
1a2a0 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f 70 65   any.** file ope
1a2b0 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  rating in no-syn
1a2c0 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e 6e 6f  c mode (Pager.no
1a2d0 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f 6e 2d  Sync set to non-
1a2e0 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  zero)..**.** If 
1a2f0 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73  successful, this
1a300 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
1a310 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1a320 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76 65 72  YNC flag of ever
1a330 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72 72 65  y .** page curre
1a340 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d 65 6d  ntly held in mem
1a350 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  ory before retur
1a360 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  ning SQLITE_OK. 
1a370 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  If an IO.** erro
1a380 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1a390 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
1a3a0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1a3b0 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
1a3c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1a3d0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
1a3e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1a3f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
1a400 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
1a410 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
1a420 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
1a430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a440 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1a450 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1a460 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 20  {.      int rc; 
1a470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a490 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1a4a0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
1a4b0 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  Dc = sqlite3OsDe
1a4c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a4d0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
1a4e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1a4f0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
1a500 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  d) );..      if(
1a510 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1a520 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
1a530 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  D) ){.        /*
1a540 20 56 61 72 69 61 62 6c 65 20 69 4e 52 65 63 4f   Variable iNRecO
1a550 66 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20  ffset is set to 
1a560 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68  the offset in th
1a570 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  e journal file. 
1a580 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
1a590 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74   nRec field of t
1a5a0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1a5b0 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c   written journal
1a5c0 20 68 65 61 64 65 72 2e 0a 20 20 20 20 20 20 20   header..       
1a5d0 20 2a 2a 20 54 68 69 73 20 66 69 65 6c 64 20 77   ** This field w
1a5e0 69 6c 6c 20 62 65 20 75 70 64 61 74 65 64 20 66  ill be updated f
1a5f0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 78 53 79  ollowing the xSy
1a600 6e 63 28 29 20 6f 70 65 72 61 74 69 6f 6e 0a 20  nc() operation. 
1a610 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65         ** on the
1a620 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
1a630 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e  /.        i64 iN
1a640 52 65 63 4f 66 66 73 65 74 20 3d 20 70 50 61 67  RecOffset = pPag
1a650 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
1a660 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
1a670 4d 61 67 69 63 29 3b 0a 0a 20 20 20 20 20 20 20  Magic);..       
1a680 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64   /* This block d
1a690 65 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73  eals with an obs
1a6a0 63 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66  cure problem. If
1a6b0 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
1a6c0 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tion.        ** 
1a6d0 74 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68  that wrote to th
1a6e0 69 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20  is database was 
1a6f0 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72  operating in per
1a700 73 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a  sistent-journal.
1a710 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c          ** mode,
1a720 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1a730 6c 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68  l file may at th
1a740 69 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c  is point actuall
1a750 79 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20  y be larger.    
1a760 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
1a770 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74  r.journalOff byt
1a780 65 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20  es. If the next 
1a790 74 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75  thing in the jou
1a7a0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1a7b0 66 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20  file happens to 
1a7c0 62 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  be a journal-hea
1a7d0 64 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20  der (written as 
1a7e0 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20  part of the.    
1a7f0 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20      ** previous 
1a800 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e  connections tran
1a810 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1a820 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1a830 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1a840 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1a850 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1a860 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1a870 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1a880 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1a890 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1a8a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a8b0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1a8c0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1a8d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1a8e0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1a8f0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1a900 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1a910 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1a920 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a930 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1a940 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1a950 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1a960 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1a970 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1a980 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1a990 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1a9a0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1a9b0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1a9c0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1a9d0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1a9e0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1a9f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1aa00 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1aa10 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1aa20 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1aa30 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1aa40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1aa50 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1aa60 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1aa70 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1aa80 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1aa90 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1aaa0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1aab0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1aac0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1aad0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1aae0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1aaf0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1ab00 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1ab10 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1ab20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1ab30 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1ab40 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1ab50 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1ab60 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1ab70 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1ab80 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1ab90 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1aba0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1abb0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1abc0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1abd0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1abe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1abf0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1ac00 74 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  t = journalHdrOf
1ac10 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
1ac20 20 20 20 20 20 20 75 38 20 61 4d 61 67 69 63 5b        u8 aMagic[
1ac30 38 5d 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  8];.        rc =
1ac40 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
1ac50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
1ac60 69 63 2c 20 38 2c 20 69 4e 65 78 74 48 64 72 4f  ic, 8, iNextHdrO
1ac70 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1ac80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ac90 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 61  K && 0==memcmp(a
1aca0 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
1acb0 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
1acc0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
1acd0 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
1ace0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1acf0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1ad00 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
1ad10 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 69 4e 65  zerobyte, 1, iNe
1ad20 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20  xtHdrOffset);.  
1ad30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ad40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ad50 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1ad60 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1ad70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1ad80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1ad90 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   }..        /* W
1ada0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
1adb0 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
1adc0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
1add0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
1ade0 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
1adf0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
1ae00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
1ae10 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
1ae20 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
1ae30 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
1ae40 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
1ae50 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
1ae60 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
1ae70 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
1ae80 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
1ae90 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
1aea0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1aeb0 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
1aec0 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
1aed0 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
1aee0 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
1aef0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
1af00 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
1af10 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
1af20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
1af30 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
1af40 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
1af50 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
1af60 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
1af70 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
1af80 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
1af90 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
1afa0 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
1afb0 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
1afc0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
1afd0 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
1afe0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
1aff0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1b000 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
1b010 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28 69  ullSync && 0==(i
1b020 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1b030 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20  SEQUENTIAL) ){. 
1b040 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1b050 41 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE(("SYNC journ
1b060 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
1b070 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a  ERID(pPager)));.
1b080 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1b090 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
1b0a0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
1b0b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b0c0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1b0d0 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1b0e0 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  _flags);.       
1b0f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b100 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b110 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b120 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
1b130 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
1b140 2c 20 70 50 61 67 65 72 2c 20 69 4e 52 65 63 4f  , pPager, iNRecO
1b150 66 66 73 65 74 2c 20 34 29 29 3b 0a 20 20 20 20  ffset, 4));.    
1b160 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1b170 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
1b180 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c 20 70  , iNRecOffset, p
1b190 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20  Pager->nRec);.  
1b1a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b1b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b1c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1b1d0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
1b1e0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
1b1f0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
1b200 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1b210 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
1b220 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b230 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
1b240 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1b250 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1b260 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ).        rc = s
1b270 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1b280 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1b290 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20  ->sync_flags| . 
1b2a0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1b2b0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51  ->sync_flags==SQ
1b2c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53  LITE_SYNC_FULL?S
1b2d0 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
1b2e0 4e 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29  NLY:0).        )
1b2f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1b310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b320 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54  .    }..    /* T
1b330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b340 77 61 73 20 6a 75 73 74 20 73 75 63 63 65 73 73  was just success
1b350 66 75 6c 6c 79 20 73 79 6e 63 65 64 2e 20 53 65  fully synced. Se
1b360 74 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  t Pager.needSync
1b370 20 0a 20 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f   .    ** to zero
1b380 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 50   and clear the P
1b390 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
1b3a0 6c 61 67 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73  lag on all pages
1b3b0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  s..    */.    pP
1b3c0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1b3d0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1b3e0 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
1b3f0 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   1;.    sqlite3P
1b400 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c  cacheClearSyncFl
1b410 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ags(pPager->pPCa
1b420 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  che);.  }..  ret
1b430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b440 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75  ../*.** The argu
1b450 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 72 73  ment is the firs
1b460 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69  t in a linked li
1b470 73 74 20 6f 66 20 64 69 72 74 79 20 70 61 67 65  st of dirty page
1b480 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62  s connected.** b
1b490 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
1b4a0 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68 69 73  ty pointer. This
1b4b0 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 73   function writes
1b4c0 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74 68 65   each one of the
1b4d0 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  .** in-memory pa
1b4e0 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ges in the list 
1b4f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b500 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75 6d 65  file. The argume
1b510 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c  nt may.** be NUL
1b520 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  L, representing 
1b530 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e 20 49  an empty list. I
1b540 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
1b550 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
1b560 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  a no-op..**.** T
1b570 68 65 20 70 61 67 65 72 20 6d 75 73 74 20 68 6f  he pager must ho
1b580 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20 52 45  ld at least a RE
1b590 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e  SERVED lock when
1b5a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1b5b0 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42 65 66  * is called. Bef
1b5c0 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e 79 74  ore writing anyt
1b5d0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1b5e0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20  base file, this 
1b5f0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61  lock.** is upgra
1b600 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ded to an EXCLUS
1b610 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  IVE lock. If the
1b620 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
1b630 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c  obtained,.** SQL
1b640 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1b650 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61 74 61  rned and no data
1b660 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
1b670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b680 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
1b690 70 61 67 65 72 20 69 73 20 61 20 74 65 6d 70 2d  pager is a temp-
1b6a0 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64 20 74  file pager and t
1b6b0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 2d 73  he actual file-s
1b6c0 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73  ystem file.** is
1b6d0 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c 20 69   not yet open, i
1b6e0 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
1b6f0 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 61   opened before a
1b700 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 77  ny data is .** w
1b710 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a  ritten out..**.*
1b720 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20  * Once the lock 
1b730 68 61 73 20 62 65 65 6e 20 75 70 67 72 61 64 65  has been upgrade
1b740 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  d and, if necess
1b750 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20 6f 70  ary, the file op
1b760 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67  ened,.** the pag
1b770 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  es are written o
1b780 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
1b790 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73 74 20  se file in list 
1b7a0 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a  order. Writing.*
1b7b0 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b 69 70  * a page is skip
1b7c0 70 65 64 20 69 66 20 69 74 20 6d 65 65 74 73 20  ped if it meets 
1b7d0 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66 6f  either of the fo
1b7e0 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61  llowing criteria
1b7f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
1b800 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 67  page number is g
1b810 72 65 61 74 65 72 20 74 68 61 6e 20 50 61 67 65  reater than Page
1b820 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20  r.dbSize, or.** 
1b830 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f 44 4f    * The PGHDR_DO
1b840 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20 69 73  NT_WRITE flag is
1b850 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61 67 65   set on the page
1b860 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69  ..**.** If writi
1b870 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20 63 61  ng out a page ca
1b880 75 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73  uses the databas
1b890 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20  e file to grow, 
1b8a0 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69 7a 65  Pager.dbFileSize
1b8b0 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64 20 61  .** is updated a
1b8c0 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20 70  ccordingly. If p
1b8d0 61 67 65 20 31 20 69 73 20 77 72 69 74 74 65 6e  age 1 is written
1b8e0 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65 20 76   out, then the v
1b8f0 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a 20 69  alue cached.** i
1b900 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  n Pager.dbFileVe
1b910 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65 64 20  rs[] is updated 
1b920 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  to match the new
1b930 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
1b940 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1b950 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
1b960 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
1b970 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
1b980 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b990 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
1b9a0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e 20 49  .** occurs, an I
1b9b0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
1b9c0 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
1b9d0 20 74 68 65 20 45 58 43 4c 55 53 49 56 45 20 6c   the EXCLUSIVE l
1b9e0 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65  ock cannot.** be
1b9f0 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c 49 54   obtained, SQLIT
1ba00 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
1ba10 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1ba20 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
1ba30 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
1ba40 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
1ba50 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ba70 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  Pager object */.
1ba80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1baa0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1bab0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
1bac0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1bad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1bae0 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
1baf0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
1bb00 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1bb10 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
1bb20 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
1bb30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1bb40 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
1bb50 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
1bb60 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
1bb70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
1bb80 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
1bb90 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
1bba0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
1bbb0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
1bbc0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
1bbd0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
1bbe0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
1bbf0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
1bc00 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
1bc10 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
1bc20 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
1bc30 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
1bc40 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
1bc50 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
1bc60 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
1bc70 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
1bc80 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
1bc90 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
1bca0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
1bcb0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
1bcc0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
1bcd0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
1bce0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
1bcf0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
1bd00 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
1bd10 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
1bd20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
1bd30 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
1bd40 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
1bd50 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
1bd60 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
1bd70 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
1bd80 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
1bd90 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
1bda0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
1bdb0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
1bdc0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
1bdd0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
1bde0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
1bdf0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
1be00 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
1be10 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
1be20 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
1be30 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1be40 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
1be50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1be60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1be70 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1be80 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  ;.  rc = pager_w
1be90 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
1bea0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
1beb0 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  CK);..  /* If th
1bec0 65 20 66 69 6c 65 20 69 73 20 61 20 74 65 6d 70  e file is a temp
1bed0 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65  -file has not ye
1bee0 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
1bef0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74 0a 20  pen it now. It. 
1bf00 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   ** is not possi
1bf10 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20 62 65  ble for rc to be
1bf20 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1bf30 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20 62 72  TE_OK if this br
1bf40 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74 61 6b  anch.  ** is tak
1bf50 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77 61 69  en, as pager_wai
1bf60 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73 20 61  t_on_lock() is a
1bf70 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d 70 2d   no-op for temp-
1bf80 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  files..  */.  if
1bf90 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
1bfa0 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73  ->fd) ){.    ass
1bfb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74 65 6d  ert( pPager->tem
1bfc0 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53 51 4c  pFile && rc==SQL
1bfd0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 72 63  ITE_OK );.    rc
1bfe0 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d 70   = pagerOpentemp
1bff0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1c000 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73  >fd, pPager->vfs
1c010 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20 20 77  Flags);.  }..  w
1c020 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1c030 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29 7b 0a  _OK && pList ){.
1c040 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20      Pgno pgno = 
1c050 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pList->pgno;..  
1c060 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1c070 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
1c080 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
1c090 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
1c0a0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
1c0b0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1c0c0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
1c0d0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1c0e0 61 74 65 49 6d 61 67 65 28 29 20 77 61 73 20 63  ateImage() was c
1c0f0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
1c100 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
1c110 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
1c120 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
1c130 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
1c140 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
1c150 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
1c160 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
1c170 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f 20 6e     ** Also, do n
1c180 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61 6e 79  ot write out any
1c190 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 74   page that has t
1c1a0 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  he PGHDR_DONT_WR
1c1b0 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a 2a 20  ITE flag.    ** 
1c1c0 73 65 74 20 28 73 65 74 20 62 79 20 73 71 6c 69  set (set by sqli
1c1d0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1c1e0 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e())..    */.   
1c1f0 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
1c200 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
1c210 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
1c220 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
1c230 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1c240 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
1c250 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
1c260 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Size;         /*
1c270 20 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   Offset to write
1c280 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
1c290 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
1c2a0 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44  Pager, pList->pD
1c2b0 61 74 61 2c 20 70 67 6e 6f 2c 20 36 29 3b 20 2f  ata, pgno, 6); /
1c2c0 2a 20 44 61 74 61 20 74 6f 20 77 72 69 74 65 20  * Data to write 
1c2d0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  */..      /* Wri
1c2e0 74 65 20 6f 75 74 20 74 68 65 20 70 61 67 65 20  te out the page 
1c2f0 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 20 20 72  data. */.      r
1c300 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c310 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
1c320 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1c330 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
1c340 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 61  ..      /* If pa
1c350 67 65 20 31 20 77 61 73 20 6a 75 73 74 20 77 72  ge 1 was just wr
1c360 69 74 74 65 6e 2c 20 75 70 64 61 74 65 20 50 61  itten, update Pa
1c370 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 20 74  ger.dbFileVers t
1c380 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 2a 2a  o match.      **
1c390 20 74 68 65 20 76 61 6c 75 65 20 6e 6f 77 20 73   the value now s
1c3a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74  tored in the dat
1c3b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 77  abase file. If w
1c3c0 72 69 74 69 6e 67 20 74 68 69 73 20 0a 20 20 20  riting this .   
1c3d0 20 20 20 2a 2a 20 70 61 67 65 20 63 61 75 73 65     ** page cause
1c3e0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1c3f0 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 75 70 64  ile to grow, upd
1c400 61 74 65 20 64 62 46 69 6c 65 53 69 7a 65 2e 20  ate dbFileSize. 
1c410 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1c420 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
1c430 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
1c440 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1c450 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73  s, &pData[24], s
1c460 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1c470 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
1c480 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 67    }.      if( pg
1c490 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  no>pPager->dbFil
1c4a0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1c4b0 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
1c4c0 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
1c4d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70    }..      /* Up
1c4e0 64 61 74 65 20 61 6e 79 20 62 61 63 6b 75 70 20  date any backup 
1c4f0 6f 62 6a 65 63 74 73 20 63 6f 70 79 69 6e 67 20  objects copying 
1c500 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1c510 74 68 69 73 20 70 61 67 65 72 2e 20 2a 2f 0a 20  this pager. */. 
1c520 20 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b       sqlite3Back
1c530 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72 2d  upUpdate(pPager-
1c540 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20  >pBackup, pgno, 
1c550 28 75 38 20 2a 29 70 44 61 74 61 29 3b 0a 0a 20  (u8 *)pData);.. 
1c560 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
1c570 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
1c580 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1c590 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c5a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1c5b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
1c5c0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
1c5d0 29 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  )));.      IOTRA
1c5e0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
1c5f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1c600 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
1c610 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1c620 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
1c630 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
1c640 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
1c650 69 74 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ite);.    }else{
1c660 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1c670 45 28 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70  E(("NOSTORE %d p
1c680 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1c690 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
1c6a0 29 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ));.    }.#ifdef
1c6b0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1c6c0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
1c6d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1c6e0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
1c6f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
1c700 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
1c710 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
1c720 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70   rc;.}../*.** Ap
1c730 70 65 6e 64 20 61 20 72 65 63 6f 72 64 20 6f 66  pend a record of
1c740 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1c750 74 65 20 6f 66 20 70 61 67 65 20 70 50 67 20 74  te of page pPg t
1c760 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1c770 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20 74 68 65  l. .** It is the
1c780 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
1c790 69 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 73  ibility to use s
1c7a0 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28  ubjRequiresPage(
1c7b0 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74  ) to check .** t
1c7c0 68 61 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79  hat it is really
1c7d0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1c7e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1c7f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1c800 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65 74   successful, set
1c810 20 74 68 65 20 62 69 74 20 63 6f 72 72 65 73 70   the bit corresp
1c820 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70  onding to pPg->p
1c830 67 6e 6f 20 69 6e 20 74 68 65 20 62 69 74 76 65  gno in the bitve
1c840 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70  cs.** for all op
1c850 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20 62 65  en savepoints be
1c860 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1c870 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1c880 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
1c890 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1c8a0 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75  ing is successfu
1c8b0 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f  l, an IO.** erro
1c8c0 72 20 63 6f 64 65 20 69 66 20 74 68 65 20 61 74  r code if the at
1c8d0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
1c8e0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
1c8f0 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20  l fails, or .** 
1c900 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
1c910 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77  a malloc fails w
1c920 68 69 6c 65 20 73 65 74 74 69 6e 67 20 61 20 62  hile setting a b
1c930 69 74 20 69 6e 20 61 20 73 61 76 65 70 6f 69 6e  it in a savepoin
1c940 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a  t.** bitvec..*/.
1c950 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 6f  static int subjo
1c960 75 72 6e 61 6c 50 61 67 65 28 50 67 48 64 72 20  urnalPage(PgHdr 
1c970 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pPg){.  int rc 
1c980 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1c990 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c9a0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
1c9b0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c9c0 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 76 6f  >sjfd) ){.    vo
1c9d0 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d  id *pData = pPg-
1c9e0 3e 70 44 61 74 61 3b 0a 20 20 20 20 69 36 34 20  >pData;.    i64 
1c9f0 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1ca00 3e 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67  >nSubRec*(4+pPag
1ca10 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1ca20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1ca30 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1ca40 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1ca50 6f 2c 20 37 29 3b 0a 20 20 0a 20 20 20 20 50 41  o, 7);.  .    PA
1ca60 47 45 52 54 52 41 43 45 28 28 22 53 54 4d 54 2d  GERTRACE(("STMT-
1ca70 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1ca80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1ca90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1caa0 6f 29 29 3b 0a 20 20 0a 20 20 20 20 61 73 73 65  o));.  .    asse
1cab0 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
1cac0 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
1cad0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
1cae0 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 72 63  igSize );.    rc
1caf0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1cb00 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f 66 66  Pager->sjfd, off
1cb10 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  set, pPg->pgno);
1cb20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cb30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cb40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1cb50 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
1cb60 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1cb70 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1cb80 65 74 2b 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  et+4);.    }.  }
1cb90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1cba0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
1cbb0 65 72 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20  er->nSubRec++;. 
1cbc0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1cbd0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20  r->nSavepoint>0 
1cbe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54  );.    rc = addT
1cbf0 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63  oSavepointBitvec
1cc00 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  s(pPager, pPg->p
1cc10 67 6e 6f 29 3b 0a 20 20 20 20 74 65 73 74 63 61  gno);.    testca
1cc20 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  se( rc!=SQLITE_O
1cc30 4b 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  K );.  }.  retur
1cc40 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1cc50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1cc60 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
1cc70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e  cache layer when
1cc80 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64 20   it has reached 
1cc90 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d  some.** soft mem
1cca0 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66  ory limit. The f
1ccb0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1ccc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1ccd0 50 61 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20  Pager object.** 
1cce0 28 63 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a  (cast as a void*
1ccf0 29 2e 20 54 68 65 20 70 61 67 65 72 20 69 73 20  ). The pager is 
1cd00 61 6c 77 61 79 73 20 27 70 75 72 67 65 61 62 6c  always 'purgeabl
1cd10 65 27 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65  e' (not an in-me
1cd20 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65  mory.** database
1cd30 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ). The second ar
1cd40 67 75 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65  gument is a refe
1cd50 72 65 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20  rence to a page 
1cd60 74 68 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72  that is .** curr
1cd70 65 6e 74 6c 79 20 64 69 72 74 79 20 62 75 74 20  ently dirty but 
1cd80 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  has no outstandi
1cd90 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54  ng references. T
1cda0 68 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c  he page.** is al
1cdb0 77 61 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  ways associated 
1cdc0 77 69 74 68 20 74 68 65 20 50 61 67 65 72 20 6f  with the Pager o
1cdd0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
1cde0 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
1cdf0 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  gument..**.** Th
1ce00 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75  e job of this fu
1ce10 6e 63 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b  nction is to mak
1ce20 65 20 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77  e pPg clean by w
1ce30 72 69 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65  riting its conte
1ce40 6e 74 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68  nts.** out to th
1ce50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
1ce60 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68   if possible. Th
1ce70 69 73 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73  is may involve s
1ce80 79 6e 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f  yncing the.** jo
1ce90 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a  urnal file. .**.
1cea0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1ceb0 2c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d  , sqlite3PcacheM
1cec0 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61  akeClean() is ca
1ced0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  lled on the page
1cee0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
1cef0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  K returned. If a
1cf00 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
1cf10 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74  s while trying t
1cf20 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61  o make the.** pa
1cf30 67 65 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f  ge clean, the IO
1cf40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1cf50 65 74 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20  eturned. If the 
1cf60 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  page cannot be.*
1cf70 2a 20 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72  * made clean for
1cf80 20 73 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73   some other reas
1cf90 6f 6e 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  on, but no error
1cfa0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
1cfb0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
1cfc0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1cfd0 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1cfe0 28 29 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  () is not called
1cff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d000 70 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64  pagerStress(void
1d010 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29   *p, PgHdr *pPg)
1d020 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1d030 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a  r = (Pager *)p;.
1d040 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d050 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
1d060 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50   pPg->pPager==pP
1d070 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74  ager );.  assert
1d080 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
1d090 44 52 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 2f  DR_DIRTY );..  /
1d0a0 2a 20 54 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20  * The doNotSync 
1d0b0 66 6c 61 67 20 69 73 20 73 65 74 20 62 79 20 74  flag is set by t
1d0c0 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  he sqlite3PagerW
1d0d0 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  rite() function 
1d0e0 77 68 69 6c 65 20 69 74 0a 20 20 2a 2a 20 69 73  while it.  ** is
1d0f0 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73   journalling a s
1d100 65 74 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  et of two or mor
1d110 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  e database pages
1d120 20 74 68 61 74 20 61 72 65 20 73 74 6f 72 65 64   that are stored
1d130 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d  .  ** on the sam
1d140 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53  e disk sector. S
1d150 79 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  yncing the journ
1d160 61 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  al is not allowe
1d170 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 69  d while.  ** thi
1d180 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  s is happening a
1d190 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  s it is importan
1d1a0 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62 65  t that all membe
1d1b0 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20 2a  rs of such a.  *
1d1c0 2a 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 61  * set of pages a
1d1d0 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
1d1e0 6b 20 74 6f 67 65 74 68 65 72 2e 20 53 6f 2c 20  k together. So, 
1d1f0 69 66 20 74 68 65 20 70 61 67 65 20 74 68 69 73  if the page this
1d200 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
1d210 73 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  s trying to make
1d220 20 63 6c 65 61 6e 20 77 69 6c 6c 20 72 65 71 75   clean will requ
1d230 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 73 79  ire a journal sy
1d240 6e 63 20 61 6e 64 20 74 68 65 20 64 6f 4e 6f 74  nc and the doNot
1d250 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 69  Sync.  ** flag i
1d260 73 20 73 65 74 2c 20 72 65 74 75 72 6e 20 77 69  s set, return wi
1d270 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
1d280 68 69 6e 67 2e 20 54 68 65 20 70 63 61 63 68 65  hing. The pcache
1d290 20 6c 61 79 65 72 20 77 69 6c 6c 0a 20 20 2a 2a   layer will.  **
1d2a0 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 67 6f   just have to go
1d2b0 20 61 68 65 61 64 20 61 6e 64 20 61 6c 6c 6f 63   ahead and alloc
1d2c0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 62  ate a new page b
1d2d0 75 66 66 65 72 20 69 6e 73 74 65 61 64 20 6f 66  uffer instead of
1d2e0 0a 20 20 2a 2a 20 72 65 75 73 69 6e 67 20 70 50  .  ** reusing pP
1d2f0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 69 6d  g..  **.  ** Sim
1d300 69 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70  ilarly, if the p
1d310 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
1d320 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
1d330 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
1d340 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72 69  .  ** try to wri
1d350 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
1d360 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e 0a  of pPg to disk..
1d370 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1d380 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
1d390 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1d3a0 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26 50   && pPg->flags&P
1d3b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
1d3c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1d3d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1d3e0 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
1d3f0 6e 61 6c 20 66 69 6c 65 20 69 66 20 72 65 71 75  nal file if requ
1d400 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ired. */.  if( p
1d410 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d420 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
1d430 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
1d440 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
1d450 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d460 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c   && pPager->full
1d470 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20 20 21  Sync && .      !
1d480 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
1d490 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1d4a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 20  NALMODE_MEMORY) 
1d4b0 26 26 0a 20 20 20 20 20 20 21 28 73 71 6c 69 74  &&.      !(sqlit
1d4c0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1d4d0 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1d4e0 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
1d4f0 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a  AP_SAFE_APPEND).
1d500 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61      ){.      pPa
1d510 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1d520 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1d530 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1d540 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d550 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
1d560 75 6d 62 65 72 20 6f 66 20 74 68 69 73 20 70 61  umber of this pa
1d570 67 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ge is larger tha
1d580 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
1d590 7a 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 64  ze of.  ** the d
1d5a0 61 74 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69  atabase image, i
1d5b0 74 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  t may need to be
1d5c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d5d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  sub-journal..  *
1d5e0 2a 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  * This is becaus
1d5f0 65 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 70 61  e the call to pa
1d600 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1d610 73 74 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 20  st() below will 
1d620 6e 6f 74 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c  not.  ** actuall
1d630 79 20 77 72 69 74 65 20 64 61 74 61 20 74 6f 20  y write data to 
1d640 74 68 65 20 66 69 6c 65 20 69 6e 20 74 68 69 73  the file in this
1d650 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
1d660 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f   Consider the fo
1d670 6c 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65  llowing sequence
1d680 20 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 2a 2a   of events:.  **
1d690 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20  .  **   BEGIN;. 
1d6a0 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c   **     <journal
1d6b0 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a 20 20 20   page X>.  **   
1d6c0 20 20 3c 6d 6f 64 69 66 79 20 70 61 67 65 20 58    <modify page X
1d6d0 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50  >.  **     SAVEP
1d6e0 4f 49 4e 54 20 73 70 3b 0a 20 20 2a 2a 20 20 20  OINT sp;.  **   
1d6f0 20 20 20 20 3c 73 68 72 69 6e 6b 20 64 61 74 61      <shrink data
1d700 62 61 73 65 20 66 69 6c 65 20 74 6f 20 59 20 70  base file to Y p
1d710 61 67 65 73 3e 0a 20 20 2a 2a 20 20 20 20 20 20  ages>.  **      
1d720 20 70 61 67 65 72 53 74 72 65 73 73 28 70 61 67   pagerStress(pag
1d730 65 20 58 29 0a 20 20 2a 2a 20 20 20 20 20 52 4f  e X).  **     RO
1d740 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
1d750 2a 2a 0a 20 20 2a 2a 20 49 66 20 28 58 3e 59 29  **.  ** If (X>Y)
1d760 2c 20 74 68 65 6e 20 77 68 65 6e 20 70 61 67 65  , then when page
1d770 72 53 74 72 65 73 73 20 69 73 20 63 61 6c 6c 65  rStress is calle
1d780 64 20 70 61 67 65 20 58 20 77 69 6c 6c 20 6e 6f  d page X will no
1d790 74 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20 2a  t be written.  *
1d7a0 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1d7b0 61 62 61 73 65 20 66 69 6c 65 2c 20 62 75 74 20  abase file, but 
1d7c0 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20  will be dropped 
1d7d0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 2e 20  from the cache. 
1d7e0 54 68 65 6e 2c 0a 20 20 2a 2a 20 66 6f 6c 6c 6f  Then,.  ** follo
1d7f0 77 69 6e 67 20 74 68 65 20 22 52 4f 4c 4c 42 41  wing the "ROLLBA
1d800 43 4b 20 54 4f 20 73 70 22 20 73 74 61 74 65 6d  CK TO sp" statem
1d810 65 6e 74 2c 20 72 65 61 64 69 6e 67 20 70 61 67  ent, reading pag
1d820 65 20 58 20 77 69 6c 6c 20 72 65 61 64 0a 20 20  e X will read.  
1d830 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
1d840 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1d850 54 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  This will be the
1d860 20 63 6f 70 79 20 6f 66 20 70 61 67 65 20 58 20   copy of page X 
1d870 61 73 20 69 74 0a 20 20 2a 2a 20 77 61 73 20 77  as it.  ** was w
1d880 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1d890 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 6e 6f 74  ion started, not
1d8a0 20 61 73 20 69 74 20 77 61 73 20 77 68 65 6e 20   as it was when 
1d8b0 22 53 41 56 45 50 4f 49 4e 54 20 73 70 22 0a 20  "SAVEPOINT sp". 
1d8c0 20 2a 2a 20 77 61 73 20 65 78 65 63 75 74 65 64   ** was executed
1d8d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1d8e0 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 77  solution is to w
1d8f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1d900 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20 58   data for page X
1d910 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20   into the .  ** 
1d920 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  sub-journal file
1d930 20 6e 6f 77 20 28 69 66 20 69 74 20 69 73 20 6e   now (if it is n
1d940 6f 74 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  ot already there
1d950 29 2c 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ), so that it wi
1d960 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 73 74 6f  ll.  ** be resto
1d970 72 65 64 20 74 6f 20 69 74 73 20 63 75 72 72 65  red to its curre
1d980 6e 74 20 76 61 6c 75 65 20 77 68 65 6e 20 74 68  nt value when th
1d990 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73  e "ROLLBACK TO s
1d9a0 70 22 20 69 73 20 0a 20 20 2a 2a 20 65 78 65 63  p" is .  ** exec
1d9b0 75 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  uted..  */.  if(
1d9c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1d9d0 26 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  & pPg->pgno>pPag
1d9e0 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 73 75  er->dbSize && su
1d9f0 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
1da00 50 67 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Pg) ){.    rc = 
1da10 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
1da20 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  Pg);.  }..  /* W
1da30 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  rite the content
1da40 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 75  s of the page ou
1da50 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1da60 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 69 66 28  e file. */.  if(
1da70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1da80 7b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  {.    pPg->pDirt
1da90 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
1daa0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1dab0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 0a  list(pPg);.  }..
1dac0 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
1dad0 67 65 20 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a  ge as clean. */.
1dae0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1daf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 41 47 45 52  _OK ){.    PAGER
1db00 54 52 41 43 45 28 28 22 53 54 52 45 53 53 20 25  TRACE(("STRESS %
1db10 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1db20 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1db30 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
1db40 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1db50 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d  eClean(pPg);.  }
1db60 0a 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72  ..  return pager
1db70 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1db80 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c  c);.}.../*.** Al
1db90 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
1dba0 61 6c 69 7a 65 20 61 20 6e 65 77 20 50 61 67 65  alize a new Page
1dbb0 72 20 6f 62 6a 65 63 74 20 61 6e 64 20 70 75 74  r object and put
1dbc0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
1dbd0 0a 2a 2a 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  .** in *ppPager.
1dbe0 20 54 68 65 20 70 61 67 65 72 20 73 68 6f 75 6c   The pager shoul
1dbf0 64 20 65 76 65 6e 74 75 61 6c 6c 79 20 62 65 20  d eventually be 
1dc00 66 72 65 65 64 20 62 79 20 70 61 73 73 69 6e 67  freed by passing
1dc10 20 69 74 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65   it.** to sqlite
1dc20 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a  3PagerClose()..*
1dc30 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1dc40 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1dc50 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
1dc60 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1dc70 6f 70 65 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c  open..** If zFil
1dc80 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
1dc90 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
1dca0 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
1dcb0 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
1dcc0 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
1dcd0 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
1dce0 65 64 2e 20 54 65 6d 70 6f 72 61 72 79 20 66 69  ed. Temporary fi
1dcf0 6c 65 73 20 61 72 65 20 62 65 20 64 65 6c 65 74  les are be delet
1dd00 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
1dd10 6c 6c 79 20 77 68 65 6e 20 74 68 65 79 20 61 72  lly when they ar
1dd20 65 20 63 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69  e closed. If zFi
1dd30 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
1dd40 72 79 3a 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c  ry:" then .** al
1dd50 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
1dd60 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 20   held in cache. 
1dd70 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
1dd80 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a  ten to disk. .**
1dd90 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
1dda0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
1ddb0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1ddc0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1ddd0 6e 45 78 74 72 61 20 70 61 72 61 6d 65 74 65 72  nExtra parameter
1dde0 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6e   specifies the n
1ddf0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1de00 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  f space allocate
1de10 64 0a 2a 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20  d.** along with 
1de20 65 61 63 68 20 70 61 67 65 20 72 65 66 65 72 65  each page refere
1de30 6e 63 65 2e 20 54 68 69 73 20 73 70 61 63 65 20  nce. This space 
1de40 69 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  is available to 
1de50 74 68 65 20 75 73 65 72 0a 2a 2a 20 76 69 61 20  the user.** via 
1de60 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1de70 47 65 74 45 78 74 72 61 28 29 20 41 50 49 2e 0a  GetExtra() API..
1de80 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67 73 20  **.** The flags 
1de90 61 72 67 75 6d 65 6e 74 20 69 73 20 75 73 65 64  argument is used
1dea0 20 74 6f 20 73 70 65 63 69 66 79 20 70 72 6f 70   to specify prop
1deb0 65 72 74 69 65 73 20 74 68 61 74 20 61 66 66 65  erties that affe
1dec0 63 74 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  ct the.** operat
1ded0 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65 72  ion of the pager
1dee0 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 70  . It should be p
1def0 61 73 73 65 64 20 73 6f 6d 65 20 62 69 74 77 69  assed some bitwi
1df00 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a  se combination.*
1df10 2a 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4f  * of the PAGER_O
1df20 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
1df30 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
1df40 4b 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54  K flags..**.** T
1df50 68 65 20 76 66 73 46 6c 61 67 73 20 70 61 72 61  he vfsFlags para
1df60 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
1df70 73 6b 20 74 6f 20 70 61 73 73 20 74 6f 20 74 68  sk to pass to th
1df80 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
1df90 72 0a 2a 2a 20 6f 66 20 74 68 65 20 78 4f 70 65  r.** of the xOpe
1dfa0 6e 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  n() method of th
1dfb0 65 20 73 75 70 70 6c 69 65 64 20 56 46 53 20 77  e supplied VFS w
1dfc0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65  hen opening file
1dfd0 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  s. .**.** If the
1dfe0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 20 69 73   pager object is
1dff0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
1e000 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1e010 65 20 6f 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63  e opened .** suc
1e020 63 65 73 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54  cessfully, SQLIT
1e030 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e040 20 61 6e 64 20 2a 70 70 50 61 67 65 72 20 73 65   and *ppPager se
1e050 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a  t to point to.**
1e060 20 74 68 65 20 6e 65 77 20 70 61 67 65 72 20 6f   the new pager o
1e070 62 6a 65 63 74 2e 20 49 66 20 61 6e 20 65 72 72  bject. If an err
1e080 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 50 61  or occurs, *ppPa
1e090 67 65 72 20 69 73 20 73 65 74 20 74 6f 20 4e 55  ger is set to NU
1e0a0 4c 4c 0a 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  LL.** and error 
1e0b0 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e 20 54  code returned. T
1e0c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
1e0d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1e0e0 4f 4d 45 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33  OMEM.** (sqlite3
1e0f0 4d 61 6c 6c 6f 63 28 29 20 69 73 20 75 73 65 64  Malloc() is used
1e100 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
1e110 6f 72 79 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e  ory), SQLITE_CAN
1e120 54 4f 50 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72  TOPEN or .** var
1e130 69 6f 75 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58  ious SQLITE_IO_X
1e140 58 58 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e  XX errors..*/.in
1e150 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
1e160 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
1e170 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 2f  s *pVfs,       /
1e180 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66 69  * The virtual fi
1e190 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73 65  le system to use
1e1a0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70 70   */.  Pager **pp
1e1b0 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
1e1c0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 74 68  * OUT: Return th
1e1d0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1e1e0 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73  e here */.  cons
1e1f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e200 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e,   /* Name of 
1e210 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e220 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1e230 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1e240 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
1e250 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f   bytes append to
1e260 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
1e270 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  page */.  int fl
1e280 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1e290 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74     /* flags cont
1e2a0 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c  rolling this fil
1e2b0 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  e */.  int vfsFl
1e2c0 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
1e2d0 2f 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20  /* flags passed 
1e2e0 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74  through to sqlit
1e2f0 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a  e3_vfs.xOpen() *
1e300 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b  /.){.  u8 *pPtr;
1e310 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1e320 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 50   = 0;       /* P
1e330 61 67 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 61  ager object to a
1e340 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75  llocate and retu
1e350 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  rn */.  int rc =
1e360 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1e370 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1e380 2a 2f 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  */.  int tempFil
1e390 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  e = 0;        /*
1e3a0 20 54 72 75 65 20 66 6f 72 20 74 65 6d 70 20 66   True for temp f
1e3b0 69 6c 65 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d  iles (incl. in-m
1e3c0 65 6d 6f 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a  emory files) */.
1e3d0 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
1e3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1e3f0 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e  ue if this is an
1e400 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20   in-memory file 
1e410 2a 2f 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  */.  int readOnl
1e420 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  y = 0;        /*
1e430 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e440 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c   a read-only fil
1e450 65 20 2a 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e  e */.  int journ
1e460 61 6c 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20  alFileSize;     
1e470 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1e480 63 61 74 65 20 66 6f 72 20 65 61 63 68 20 6a 6f  cate for each jo
1e490 75 72 6e 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68  urnal fd */.  ch
1e4a0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20  ar *zPathname = 
1e4b0 30 3b 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70  0;     /* Full p
1e4c0 61 74 68 20 74 6f 20 64 61 74 61 62 61 73 65 20  ath to database 
1e4d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
1e4e0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e4f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e500 62 79 74 65 73 20 69 6e 20 7a 50 61 74 68 6e 61  bytes in zPathna
1e510 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a  me */.  int useJ
1e520 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
1e530 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
1e540 52 4e 41 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c  RNAL)==0; /* Fal
1e550 73 65 20 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e  se to omit journ
1e560 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65  al */.  int noRe
1e570 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
1e580 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
1e590 4f 43 4b 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75  OCK)!=0;  /* Tru
1e5a0 65 20 74 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c  e to omit read-l
1e5b0 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61  ock */.  int pca
1e5c0 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  cheSize = sqlite
1e5d0 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 20 20  3PcacheSize();  
1e5e0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 74 6f       /* Bytes to
1e5f0 20 61 6c 6c 6f 63 61 74 65 20 66 6f 72 20 50 43   allocate for PC
1e600 61 63 68 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a  ache */.  u16 sz
1e610 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
1e620 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
1e630 49 5a 45 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74  IZE;  /* Default
1e640 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20   page size */.. 
1e650 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
1e660 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 73  ow much space is
1e670 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61   required for ea
1e680 63 68 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  ch journal file-
1e690 68 61 6e 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65  handle.  ** (the
1e6a0 72 65 20 61 72 65 20 74 77 6f 20 6f 66 20 74 68  re are two of th
1e6b0 65 6d 2c 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  em, the main jou
1e6c0 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 73 75 62  rnal and the sub
1e6d0 2d 6a 6f 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a  -journal). This.
1e6e0 20 20 2a 2a 20 69 73 20 74 68 65 20 6d 61 78 69    ** is the maxi
1e6f0 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69 72  mum space requir
1e700 65 64 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ed for an in-mem
1e710 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ory journal file
1e720 20 68 61 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e   handle .  ** an
1e730 64 20 61 20 72 65 67 75 6c 61 72 20 6a 6f 75 72  d a regular jour
1e740 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e  nal file-handle.
1e750 20 4e 6f 74 65 20 74 68 61 74 20 61 20 22 72 65   Note that a "re
1e760 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61  gular journal-ha
1e770 6e 64 6c 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62  ndle".  ** may b
1e780 65 20 61 20 77 72 61 70 70 65 72 20 63 61 70 61  e a wrapper capa
1e790 62 6c 65 20 6f 66 20 63 61 63 68 69 6e 67 20 74  ble of caching t
1e7a0 68 65 20 66 69 72 73 74 20 70 6f 72 74 69 6f 6e  he first portion
1e7b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
1e7c0 20 20 2a 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d    ** file in mem
1e7d0 6f 72 79 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ory to implement
1e7e0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
1e7f0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28  e optimization (
1e800 73 65 65 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65  see .  ** source
1e810 20 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29   file journal.c)
1e820 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
1e830 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  ite3JournalSize(
1e840 70 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d  pVfs)>sqlite3Mem
1e850 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b  JournalSize() ){
1e860 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  .    journalFile
1e870 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71  Size = ROUND8(sq
1e880 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65  lite3JournalSize
1e890 28 70 56 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65  (pVfs));.  }else
1e8a0 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  {.    journalFil
1e8b0 65 53 69 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73  eSize = ROUND8(s
1e8c0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
1e8d0 53 69 7a 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20  Size());.  }..  
1e8e0 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
1e8f0 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
1e900 4c 4c 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72  LL in case an er
1e910 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
1e920 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
1e930 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64    /* Compute and
1e940 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20   store the full 
1e950 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61  pathname in an a
1e960 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20  llocated buffer 
1e970 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20  pointed.  ** to 
1e980 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65  by zPathname, le
1e990 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20  ngth nPathname. 
1e9a0 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  Or, if this is a
1e9b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
1e9c0 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68  .  ** leave both
1e9d0 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a   nPathname and z
1e9e0 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20  Pathname set to 
1e9f0 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  0..  */.  if( zF
1ea00 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
1ea10 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e  name[0] ){.    n
1ea20 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d  Pathname = pVfs-
1ea30 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20  >mxPathname+1;. 
1ea40 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73     zPathname = s
1ea50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61  qlite3Malloc(nPa
1ea60 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69  thname*2);.    i
1ea70 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20  f( zPathname==0 
1ea80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ea90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1eaa0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1eab0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
1eac0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1ead0 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
1eae0 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
1eaf0 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
1eb00 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20     zPathname[0] 
1eb10 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23  = 0;.    }else.#
1eb20 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20  endif.    {.    
1eb30 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
1eb40 20 30 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65   0; /* Make sure
1eb50 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 65 76 65   initialized eve
1eb60 6e 20 69 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d  n if FullPathnam
1eb70 65 28 29 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  e() fails */.   
1eb80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1eb90 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
1eba0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
1ebb0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
1ebc0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ame);.    }..   
1ebd0 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c   nPathname = sql
1ebe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
1ebf0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  thname);.    if(
1ec00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ec10 26 20 6e 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56  & nPathname+8>pV
1ec20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
1ec30 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
1ec40 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
1ec50 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  when the journal
1ec60 20 70 61 74 68 20 72 65 71 75 69 72 65 64 20 62   path required b
1ec70 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  y.      ** the d
1ec80 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 6f 70  atabase being op
1ec90 65 6e 65 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72  ened will be mor
1eca0 65 20 74 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50  e than pVfs->mxP
1ecb0 61 74 68 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a  athname.      **
1ecc0 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68   bytes in length
1ecd0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
1ece0 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
1ecf0 20 62 65 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20   be opened,.    
1ed00 20 20 2a 2a 20 61 73 20 69 74 20 77 69 6c 6c 20    ** as it will 
1ed10 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  not be possible 
1ed20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
1ed30 6e 61 6c 20 66 69 6c 65 20 6f 72 20 65 76 65 6e  nal file or even
1ed40 0a 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20  .      ** check 
1ed50 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1ed60 6c 20 62 65 66 6f 72 65 20 72 65 61 64 69 6e 67  l before reading
1ed70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ed80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
1ed90 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20  TOPEN;.    }.   
1eda0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1edb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1edc0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
1edd0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1ede0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
1edf0 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
1ee00 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 50 61  emory for the Pa
1ee10 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 50  ger structure, P
1ee20 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20 74 68  Cache object, th
1ee30 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66 69 6c  e.  ** three fil
1ee40 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 74  e descriptors, t
1ee50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ee60 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 6a 6f   name and the jo
1ee70 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
1ee80 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79 6f 75   name. The layou
1ee90 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73 20 61  t in memory is a
1eea0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
1eeb0 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72 20 6f    **     Pager o
1eec0 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
1eed0 20 20 20 20 20 20 20 20 20 28 73 69 7a 65 6f 66           (sizeof
1eee0 28 50 61 67 65 72 29 20 62 79 74 65 73 29 0a 20  (Pager) bytes). 
1eef0 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65 20 6f   **     PCache o
1ef00 62 6a 65 63 74 20 20 20 20 20 20 20 20 20 20 20  bject           
1ef10 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
1ef20 50 63 61 63 68 65 53 69 7a 65 28 29 20 62 79 74  PcacheSize() byt
1ef30 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44 61 74  es).  **     Dat
1ef40 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c  abase file handl
1ef50 65 20 20 20 20 20 20 20 20 20 20 20 20 28 70 56  e            (pV
1ef60 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62 79 74  fs->szOsFile byt
1ef70 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53 75 62  es).  **     Sub
1ef80 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61  -journal file ha
1ef90 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28 6a 6f  ndle         (jo
1efa0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62 79  urnalFileSize by
1efb0 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4d 61  tes).  **     Ma
1efc0 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  in journal file 
1efd0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 28 6a  handle        (j
1efe0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 62  ournalFileSize b
1eff0 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
1f000 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
1f010 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  e              (
1f020 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79 74 65  nPathname+1 byte
1f030 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f 75 72  s).  **     Jour
1f040 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 20 20  nal file name   
1f050 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 50 61              (nPa
1f060 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74 65 73  thname+8+1 bytes
1f070 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20 3d 20  ).  */.  pPtr = 
1f080 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  (u8 *)sqlite3Mal
1f090 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52 4f 55  locZero(.    ROU
1f0a0 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50 61 67  ND8(sizeof(*pPag
1f0b0 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a 20 50  er)) +      /* P
1f0c0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
1f0d0 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 63 61  /.    ROUND8(pca
1f0e0 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20 20 20  cheSize) +      
1f0f0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
1f100 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52 4f 55  bject */.    ROU
1f110 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ND8(pVfs->szOsFi
1f120 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a 20 54  le) +       /* T
1f130 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
1f140 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
1f150 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
1f160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
1f170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
1f180 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  / .    nPathname
1f190 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20   + 1 +          
1f1a0 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61        /* zFilena
1f1b0 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74 68 6e  me */.    nPathn
1f1c0 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20 20 20  ame + 8 + 1     
1f1d0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a 6f 75           /* zJou
1f1e0 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 61  rnal */.  );.  a
1f1f0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1f200 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6a 6f 75 72  E_ALIGNMENT(jour
1f210 6e 61 6c 46 69 6c 65 53 69 7a 65 29 20 29 3b 0a  nalFileSize) );.
1f220 20 20 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20    if( !pPtr ){. 
1f230 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f240 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
1f250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1f260 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  MEM;.  }.  pPage
1f270 72 20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20  r =             
1f280 20 28 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b   (Pager*)(pPtr);
1f290 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
1f2a0 68 65 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a  he =    (PCache*
1f2b0 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f2c0 28 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29  (sizeof(*pPager)
1f2d0 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ));.  pPager->fd
1f2e0 20 3d 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69   =   (sqlite3_fi
1f2f0 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55  le*)(pPtr += ROU
1f300 4e 44 38 28 70 63 61 63 68 65 53 69 7a 65 29 29  ND8(pcacheSize))
1f310 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  ;.  pPager->sjfd
1f320 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
1f330 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f340 38 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  8(pVfs->szOsFile
1f350 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66  ));.  pPager->jf
1f360 64 20 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69  d =  (sqlite3_fi
1f370 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  le*)(pPtr += jou
1f380 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
1f390 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1f3a0 6d 65 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28  me =    (char*)(
1f3b0 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46  pPtr += journalF
1f3c0 69 6c 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  ileSize);.  asse
1f3d0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1f3e0 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
1f3f0 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  >jfd) );..  /* F
1f400 69 6c 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72  ill in the Pager
1f410 2e 7a 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50  .zFilename and P
1f420 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75  ager.zJournal bu
1f430 66 66 65 72 73 2c 20 69 66 20 72 65 71 75 69 72  ffers, if requir
1f440 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  ed. */.  if( zPa
1f450 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50  thname ){.    pP
1f460 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
1f470 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72 20     (char*)(pPtr 
1f480 2b 3d 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31  += nPathname + 1
1f490 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50  );.    memcpy(pP
1f4a0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1f4b0 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
1f4c0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63  hname);.    memc
1f4d0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
1f4e0 6e 61 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  nal, zPathname, 
1f4f0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
1f500 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
1f510 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
1f520 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
1f530 20 38 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   8);.    sqlite3
1f540 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
1f550 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1f560 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
1f570 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
1f580 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
1f590 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
1f5a0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1f5b0 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
1f5c0 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
1f5d0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
1f5e0 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f600 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
1f610 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
1f620 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1f630 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
1f640 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f650 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
1f660 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
1f670 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
1f680 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1f690 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
1f6a0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
1f6b0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
1f6c0 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
1f6d0 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
1f6e0 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
1f6f0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
1f700 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
1f710 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
1f720 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1f730 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
1f740 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
1f750 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
1f760 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
1f770 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f780 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
1f790 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
1f7a0 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
1f7b0 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
1f7c0 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
1f7d0 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
1f7e0 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
1f7f0 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
1f800 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
1f810 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f820 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
1f830 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
1f840 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
1f850 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1f860 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
1f870 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
1f880 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f890 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
1f8a0 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
1f8b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
1f8c0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1f8d0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
1f8e0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f8f0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
1f900 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
1f910 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
1f920 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1f930 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
1f940 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
1f950 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
1f960 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1f970 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1f980 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1f990 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1f9a0 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
1f9b0 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
1f9c0 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1f9d0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1f9e0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1f9f0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
1fa00 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1fa10 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
1fa20 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
1fa30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
1fa40 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1fa50 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
1fa60 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1fa70 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
1fa80 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
1fa90 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
1faa0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
1fab0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
1fac0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fad0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
1fae0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
1faf0 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
1fb00 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
1fb10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
1fb20 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
1fb30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1fb40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
1fb50 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
1fb60 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
1fb70 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1fb80 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1fb90 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
1fba0 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
1fbb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
1fbc0 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
1fbd0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
1fbe0 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
1fbf0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
1fc00 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
1fc10 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
1fc20 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
1fc30 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
1fc40 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
1fc50 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
1fc60 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
1fc70 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
1fc80 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
1fc90 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
1fca0 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
1fcb0 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
1fcc0 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
1fcd0 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
1fce0 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
1fcf0 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
1fd00 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
1fd10 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1fd20 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1fd30 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  IVE;.  }..  /* T
1fd40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
1fd50 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
1fd60 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
1fd70 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
1fd80 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
1fd90 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
1fda0 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
1fdb0 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
1fdc0 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
1fdd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fde0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fdf0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
1fe00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe10 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1fe20 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
1fe30 44 66 6c 74 29 3b 0a 20 20 20 20 74 65 73 74 63  Dflt);.    testc
1fe40 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
1fe50 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OK );.  }..  /* 
1fe60 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1fe70 72 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f  rred in either o
1fe80 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f  f the blocks abo
1fe90 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a 20 20  ve, free the .  
1fea0 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  ** Pager structu
1feb0 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65  re and close the
1fec0 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
1fed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fee0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1fef0 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
1ff00 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
1ff10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1ff20 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
1ff30 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
1ff40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ff50 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1ff60 7a 65 20 74 68 65 20 50 43 61 63 68 65 20 6f 62  ze the PCache ob
1ff70 6a 65 63 74 2e 20 2a 2f 0a 20 20 6e 45 78 74 72  ject. */.  nExtr
1ff80 61 20 3d 20 52 4f 55 4e 44 38 28 6e 45 78 74 72  a = ROUND8(nExtr
1ff90 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  a);.  sqlite3Pca
1ffa0 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65 44 66  cheOpen(szPageDf
1ffb0 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d  lt, nExtra, !mem
1ffc0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
1ffd0 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62 3f 70          !memDb?p
1ffe0 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20 28 76  agerStress:0, (v
1fff0 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20 70 50  oid *)pPager, pP
20000 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20010 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
20020 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
20030 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50 61 67  ILEHANDLEID(pPag
20040 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65 72 2d  er->fd), pPager-
20050 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  >zFilename));.  
20060 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  IOTRACE(("OPEN %
20070 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %s\n", pPager,
20080 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
20090 6d 65 29 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e  me))..  pPager->
200a0 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38  useJournal = (u8
200b0 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  )useJournal;.  p
200c0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
200d0 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20  k = (noReadlock 
200e0 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a  && readOnly) ?1:
200f0 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  0;.  /* pPager->
20100 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
20110 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
20120 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
20130 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
20140 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
20150 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
20160 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f  = (u8)memDb;.  /
20170 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
20180 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
20190 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
201a0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
201b0 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
201c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
201d0 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
201e0 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
201f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74   /* pPager->stat
20200 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
20210 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  ; */.  assert( p
20220 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20  Pager->state == 
20230 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45  (tempFile ? PAGE
20240 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41  R_EXCLUSIVE : PA
20250 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20  GER_UNLOCK) );. 
20260 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   /* pPager->errM
20270 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ask = 0; */.  pP
20280 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d  ager->tempFile =
20290 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20   (u8)tempFile;. 
202a0 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
202b0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
202c0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
202d0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
202e0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
202f0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
20300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
20310 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
20320 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
20330 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20340 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65 6d  veMode = (u8)tem
20350 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
20360 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20370 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  e = pPager->temp
20380 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
20390 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d 65 6d 44  memDb = (u8)memD
203a0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
203b0 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72 65 61 64  dOnly = (u8)read
203c0 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
203d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
203e0 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
203f0 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
20400 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
20410 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20  Journal) ?1:0;. 
20420 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
20430 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  c = pPager->noSy
20440 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65  nc ?0:1;.  pPage
20450 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
20460 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
20470 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
20480 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
20490 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
204a0 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
204b0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
204c0 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
204d0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
204e0 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
204f0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
20500 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
20510 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
20520 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
20530 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20540 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
20550 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
20560 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
20570 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
20580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20590 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
205a0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
205b0 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
205c0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
205d0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
205e0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
205f0 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  rg = 0; */.  /* 
20600 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
20610 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
20620 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20630 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
20640 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
20650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20660 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20670 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20680 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
20690 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
206a0 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
206b0 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
206c0 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
206d0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
206e0 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
206f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20700 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
20710 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
20720 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
20730 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
20740 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
20750 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
20760 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
20770 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
20780 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
20790 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
207a0 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
207b0 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
207c0 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
207d0 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
207e0 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
207f0 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20800 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
20810 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20820 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
20830 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
20840 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
20850 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20860 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
20870 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
20880 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
20890 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
208a0 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
208b0 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
208c0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
208d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
208e0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
208f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20900 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
20910 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
20920 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
20930 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
20940 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
20950 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
20960 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
20970 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20980 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
20990 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
209a0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
209b0 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
209c0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
209d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
209e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
209f0 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20a00 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
20a10 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
20a20 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20a30 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20a40 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
20a50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20a60 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
20a70 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
20a80 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
20a90 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
20aa0 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
20ab0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
20ac0 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
20ad0 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
20ae0 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
20af0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
20b00 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
20b10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
20b20 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
20b30 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
20b40 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
20b50 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
20b60 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
20b70 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
20b80 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
20b90 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
20ba0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
20bb0 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
20bc0 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
20bd0 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
20be0 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
20bf0 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20c00 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
20c10 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
20c20 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
20c30 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
20c40 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
20c50 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
20c60 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
20c70 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
20c80 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
20c90 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
20ca0 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
20cb0 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
20cc0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
20cd0 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
20ce0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
20cf0 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
20d00 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
20d10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
20d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
20d30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
20d40 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20 20  int exists;     
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d60 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
20d70 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
20d80 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
20d90 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
20da0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20db0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
20dc0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
20dd0 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
20de0 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
20df0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
20e00 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20e10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20e20 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20e30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20e40 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20e50 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20e60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20e70 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20e80 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
20eb0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
20ec0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
20ed0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
20ee0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
20ef0 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
20f00 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
20f10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20f20 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
20f30 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
20f40 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
20f50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
20f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20f70 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
20f80 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
20f90 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
20fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20fb0 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
20fc0 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
20fd0 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
20fe0 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
20ff0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
21000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21010 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
21020 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
21030 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21040 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
21050 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( nPage==0 ){. 
21060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
21070 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
21080 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
21090 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
210a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
210b0 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
210c0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61 6e  l file exists an
210d0 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  d no other conne
210e0 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73 65  ction has a rese
210f0 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  rved.          *
21100 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  * or greater loc
21110 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
21120 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65 63  e file. Now chec
21130 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  k that there is.
21140 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20            ** at 
21150 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a 65  least one non-ze
21160 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65 20  ro bytes at the 
21170 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
21180 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
21190 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65       ** If there
211a0 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f 6e   is, then we con
211b0 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72 6e  sider this journ
211c0 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49 66  al to be hot. If
211d0 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20 20   not, .         
211e0 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69 67   ** it can be ig
211f0 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20 20  nored..         
21200 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
21210 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  t f = SQLITE_OPE
21220 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
21230 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
21240 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  NAL;.          r
21250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21260 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21270 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
21280 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a 20  ->jfd, f, &f);. 
21290 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
212a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
212b0 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69 72            u8 fir
212c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
212d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
212e0 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
212f0 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69 72  fd, (void *)&fir
21300 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  st, 1, 0);.     
21310 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
21320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
21330 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
21340 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21350 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
21360 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21370 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
21380 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
21390 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
213a0 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30 29  sts = (first!=0)
213b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
213c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
213d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
213e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
213f0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
21400 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 20 6f  t for page pPg o
21410 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ut of the databa
21420 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f  se file and into
21430 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e   .** pPg->pData.
21440 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   A shared lock o
21450 72 20 67 72 65 61 74 65 72 20 6d 75 73 74 20 62  r greater must b
21460 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61  e held on the da
21470 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62  tabase.** file b
21480 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
21490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
214a0 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31 20 69  *.** If page 1 i
214b0 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74 68 65  s read, then the
214c0 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
214d0 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20  dbFileVers[] is 
214e0 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61  set to.** the va
214f0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
21500 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21510 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
21520 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
21530 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
21540 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
21550 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74  he caller..** Ot
21560 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
21570 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
21580 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
21590 61 64 44 62 50 61 67 65 28 50 67 48 64 72 20 2a  adDbPage(PgHdr *
215a0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
215b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
215c0 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62  ger; /* Pager ob
215d0 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20  ject associated 
215e0 77 69 74 68 20 70 61 67 65 20 70 50 67 20 2a 2f  with page pPg */
215f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
21600 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20  Pg->pgno;       
21610 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74  /* Page number t
21620 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  o read */.  int 
21630 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
21640 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
21650 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34  rn code */.  i64
21660 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20   iOffset;       
21670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
21680 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69 6c 65  e offset of file
21690 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
216a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
216b0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
216c0 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45 4d 44  _SHARED && !MEMD
216d0 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69 73 4f  B );..  if( !isO
216e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
216f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
21700 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
21710 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50  );.    memset(pP
21720 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61  g->pData, 0, pPa
21730 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21740 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21750 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66  E_OK;.  }.  iOff
21760 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
21770 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
21780 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Size;.  rc = sql
21790 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
217a0 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74  r->fd, pPg->pDat
217b0 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
217c0 69 7a 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  ize, iOffset);. 
217d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
217e0 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
217f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
21800 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
21810 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
21820 20 75 38 20 2a 64 62 46 69 6c 65 56 65 72 73 20   u8 *dbFileVers 
21830 3d 20 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44  = &((u8*)pPg->pD
21840 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65  ata)[24];.    me
21850 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
21860 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
21870 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 70 50 61  Vers, sizeof(pPa
21880 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
21890 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
218a0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
218b0 74 61 2c 20 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20  ta, pgno, 3);.. 
218c0 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
218d0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
218e0 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
218f0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
21900 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
21910 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
21920 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
21930 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
21940 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
21950 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
21970 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
21980 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
21990 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
219a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
219b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
219c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
219d0 65 76 65 72 20 74 68 65 20 75 70 70 65 72 20 6c  ever the upper l
219e0 61 79 65 72 20 72 65 71 75 65 73 74 73 20 61 20  ayer requests a 
219f0 64 61 74 61 62 61 73 65 0a 2a 2a 20 70 61 67 65  database.** page
21a00 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 62   is requested, b
21a10 65 66 6f 72 65 20 74 68 65 20 63 61 63 68 65 20  efore the cache 
21a20 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
21a30 20 73 75 69 74 61 62 6c 65 20 70 61 67 65 0a 2a   suitable page.*
21a40 2a 20 6f 72 20 61 6e 79 20 64 61 74 61 20 69 73  * or any data is
21a50 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
21a60 61 74 61 62 61 73 65 2e 20 49 74 20 70 65 72 66  atabase. It perf
21a70 6f 72 6d 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  orms the followi
21a80 6e 67 0a 2a 2a 20 74 77 6f 20 66 75 6e 63 74 69  ng.** two functi
21a90 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ons:.**.**   1) 
21aa0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
21ab0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47  currently in PAG
21ac0 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
21ad0 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a  (no lock held.**
21ae0 20 20 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74        on the dat
21af0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65  abase file), the
21b00 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
21b10 6d 61 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  made to obtain a
21b20 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 20  .**      SHARED 
21b30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
21b40 62 61 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64  base file. Immed
21b50 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
21b60 61 69 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74  aining.**      t
21b70 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
21b80 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
21b90 69 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61  is checked for a
21ba0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a   hot-journal,.**
21bb0 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 70        which is p
21bc0 6c 61 79 65 64 20 62 61 63 6b 20 69 66 20 70 72  layed back if pr
21bd0 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67  esent. Following
21be0 20 61 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   any hot-journal
21bf0 20 0a 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61   .**      rollba
21c00 63 6b 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ck, the contents
21c10 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 61 72   of the cache ar
21c20 65 20 76 61 6c 69 64 61 74 65 64 20 62 79 20 63  e validated by c
21c30 68 65 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  hecking.**      
21c40 74 68 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e  the 'change-coun
21c50 74 65 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68  ter' field of th
21c60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21c70 68 65 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20  header and.**   
21c80 20 20 20 64 69 73 63 61 72 64 65 64 20 69 66 20     discarded if 
21c90 74 68 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74  they are found t
21ca0 6f 20 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a  o be invalid..**
21cb0 0a 2a 2a 20 20 20 32 29 20 49 66 20 74 68 65 20  .**   2) If the 
21cc0 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
21cd0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f   in exclusive-mo
21ce0 64 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  de, and there ar
21cf0 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  e currently.**  
21d00 20 20 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69      no outstandi
21d10 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
21d20 20 61 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20   any pages, and 
21d30 69 73 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  is in the error 
21d40 73 74 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74  state,.**      t
21d50 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69  hen an attempt i
21d60 73 20 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20  s made to clear 
21d70 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
21d80 62 79 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a  by discarding.**
21d90 20 20 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e        the conten
21da0 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 63  ts of the page c
21db0 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67  ache and rolling
21dc0 20 62 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a   back any open j
21dd0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66  ournal.**      f
21de0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
21df0 65 20 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63  e operation desc
21e00 72 69 62 65 64 20 62 79 20 28 32 29 20 61 62 6f  ribed by (2) abo
21e10 76 65 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  ve is not attemp
21e20 74 65 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a  ted, and if the.
21e30 2a 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 61  ** pager is in a
21e40 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74  n error state ot
21e50 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
21e60 46 55 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69  FULL when this i
21e70 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65  s called,.** the
21e80 20 65 72 72 6f 72 20 73 74 61 74 65 20 65 72 72   error state err
21e90 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
21ea0 6e 65 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69  ned. It is permi
21eb0 74 74 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  tted to read the
21ec0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 68 65  .** database whe
21ed0 6e 20 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  n in SQLITE_FULL
21ee0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
21ef0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
21f00 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
21f10 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
21f20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21f30 64 2e 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65  d. If an.** IO e
21f40 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
21f50 65 20 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61  e locking the da
21f60 74 61 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67  tabase, checking
21f70 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
21f80 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f  al.** file or ro
21f90 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75  lling back a jou
21fa0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49  rnal file, the I
21fb0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
21fc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
21fd0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
21fe0 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
21ff0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
22000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22020 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
22030 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
22040 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
22050 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
22060 65 63 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65  ecovering from e
22070 72 72 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20  rror state */.. 
22080 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
22090 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
220a0 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
220b0 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
220c0 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
220d0 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
220e0 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
220f0 2d 73 74 61 74 65 2c 20 74 68 69 73 20 69 73 20  -state, this is 
22100 61 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61  a chance to clea
22110 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72  r.  ** the error
22120 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f  . Discard the co
22130 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22140 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72  ger-cache and tr
22150 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65  eat any.  ** ope
22160 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
22170 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e  s a hot-journal.
22180 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d  .  */.  if( !MEM
22190 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78  DB && pPager->ex
221a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
221b0 26 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  && sqlite3Pcache
221c0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
221d0 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20  >pPCache)==0 && 
221e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
221f0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  .  ){.    if( is
22200 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
22210 29 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72  ) ){.      isErr
22220 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20  orReset = 1;.   
22230 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65   }.    pPager->e
22240 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
22250 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65  OK;.    pager_re
22260 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  set(pPager);.  }
22270 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
22280 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20  ger is still in 
22290 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  an error state, 
222a0 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20  do not proceed. 
222b0 54 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  The error .  ** 
222c0 73 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c  state will be cl
222d0 65 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f  eared at some po
222e0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
222f0 65 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20  e when all page 
22300 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73  .  ** references
22310 20 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64   are dropped and
22320 20 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62   the cache can b
22330 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a  e discarded..  *
22340 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
22350 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
22360 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
22370 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
22380 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
22390 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66  rCode;.  }..  if
223a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
223b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c  =PAGER_UNLOCK ||
223c0 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b   isErrorReset ){
223d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
223e0 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20   * const pVfs = 
223f0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
22400 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e    int isHotJourn
22410 61 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  al = 0;.    asse
22420 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
22430 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22440 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22450 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22460 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ==0 );.    if( !
22470 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
22480 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
22490 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
224a0 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
224b0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
224c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
224d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
224e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
224f0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
22500 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
22510 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
22520 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
22530 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
22540 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
22550 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
22560 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
22570 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
22580 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  RED;.    }.    a
22590 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
225a0 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
225b0 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  K );..    /* If 
225c0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
225d0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
225e0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
225f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
22600 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
22610 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
22620 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
22630 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
22640 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
22650 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
22660 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
22670 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
22680 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
22690 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
226a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
226b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
226c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
226d0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
226e0 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
226f0 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
22700 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
22710 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
22720 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22730 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
22740 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
22750 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
22760 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
22770 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
22780 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
22790 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
227a0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
227b0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
227c0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
227d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
227e0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
227f0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
22800 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
22810 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
22820 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
22830 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
22840 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
22850 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
22860 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 68   the .      ** h
22870 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e  ot-journal back.
22880 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
22890 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
228a0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
228b0 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
228c0 74 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 79  t requested, any
228d0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
228e0 70 72 6f 63 65 73 73 20 61 74 74 65 6d 70 74 69  process attempti
228f0 6e 67 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ng to access the
22900 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
22910 69 6c 6c 20 67 65 74 20 74 6f 20 0a 20 20 20 20  ill get to .    
22920 20 20 2a 2a 20 74 68 69 73 20 70 6f 69 6e 74 20    ** this point 
22930 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
22940 66 61 69 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69  fail to obtain i
22950 74 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  ts own EXCLUSIVE
22960 20 6c 6f 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20   lock .      ** 
22970 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22980 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  file..      */. 
22990 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
229a0 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45  >state<EXCLUSIVE
229b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
229c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
229d0 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
229e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
229f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
22a00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22a10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
22a20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
22a30 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
22a40 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
22a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
22a60 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
22a70 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
22a80 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20        }. .      
22a90 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
22aa0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
22ab0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
22ac0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
22ad0 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76       ** exclusiv
22ae0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
22af0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
22b00 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f  r will be kept o
22b10 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  pen and.      **
22b20 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
22b30 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
22b40 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
22b50 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
22b60 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
22b70 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
22b80 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
22b90 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
22ba0 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
22bb0 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c  a read/write fil
22bc0 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20  e handle..      
22bd0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  */.      if( !is
22be0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
22bf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
22c00 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63   res;.        rc
22c10 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
22c20 73 73 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e  ss(pVfs,pPager->
22c30 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f  zJournal,SQLITE_
22c40 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72  ACCESS_EXISTS,&r
22c50 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  es);.        if(
22c60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22c70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
22c80 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  res ){.         
22c90 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
22ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
22cb0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
22cc0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
22cd0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
22ce0 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
22cf0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
22d00 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
22d10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
22d20 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
22d30 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
22d40 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
22d50 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
22d60 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22d70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
22d80 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  | isOpen(pPager-
22d90 3e 6a 66 64 29 20 29 3b 0a 20 20 20 20 20 20 20  >jfd) );.       
22da0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22db0 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
22dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
22dd0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
22de0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22df0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
22e00 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22e10 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
22e20 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
22e30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
22e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
22e50 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
22e60 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
22e70 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f  t, that means so
22e80 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
22e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
22ea0 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
22eb0 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
22ec0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
22ed0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
22ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
22f00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22f10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
22f20 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
22f30 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
22f40 3a 20 57 68 79 20 61 72 65 20 74 68 65 73 65 20  : Why are these 
22f50 63 6c 65 61 72 65 64 20 68 65 72 65 3f 20 49 73  cleared here? Is
22f60 20 69 74 20 6e 65 63 65 73 73 61 72 79 3f 20 2a   it necessary? *
22f70 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
22f80 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
22f90 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
22fa0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
22fb0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
22fc0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
22fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
22fe0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
22ff0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
23000 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
23010 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
23020 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
23030 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  e.      ** lock 
23040 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
23050 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72  e read lock. Pur
23060 67 65 20 74 68 65 20 63 61 63 68 65 20 62 65 66  ge the cache bef
23070 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61  ore.      ** pla
23080 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 68 6f  ying back the ho
23090 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61  t-journal so tha
230a0 74 20 77 65 20 64 6f 6e 27 74 20 65 6e 64 20 75  t we don't end u
230b0 70 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a 20  p with.      ** 
230c0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
230d0 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  cache..      */.
230e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
230f0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
23100 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
23110 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23120 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
23130 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
23140 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67  , rc);.        g
23150 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
23160 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
23170 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
23180 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  ==PAGER_SHARED).
23190 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
231a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
231b0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
231c0 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
231d0 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ED).      );.   
231e0 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69   }..    if( sqli
231f0 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23200 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23210 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23220 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23230 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23240 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23250 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23260 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23270 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23280 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23290 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
232a0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
232b0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
232c0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
232d0 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
232e0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
232f0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
23300 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
23310 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
23320 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
23330 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
23340 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
23350 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
23360 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
23370 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
23380 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
23390 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
233a0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
233b0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
233c0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
233d0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
233e0 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
233f0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
23400 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
23410 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
23420 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
23430 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
23440 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
23450 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
23460 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
23470 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
23480 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
23490 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
234a0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
234b0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
234c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
234d0 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
234e0 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
234f0 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
23500 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
23510 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
23520 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
23530 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
23540 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
23550 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
23560 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
23570 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
23580 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
23590 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
235a0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
235b0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
235c0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
235d0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
235e0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
235f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
23600 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
23610 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
23620 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
23630 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
23640 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
23650 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
23660 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
23670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
23680 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
23690 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
236a0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
236b0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
236c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
236d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
236e0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
236f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
23700 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
23710 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
23720 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
23730 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
23740 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
23750 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
23760 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
23770 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
23780 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
23790 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
237a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
237b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
237c0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
237d0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
237e0 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
237f0 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66  HARED );.  }.. f
23800 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
23810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23820 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
23830 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
23840 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
23850 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
23860 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
23870 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
23880 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
23890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
238a0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
238b0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
238c0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
238d0 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
238e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
238f0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
23900 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
23910 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
23920 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
23930 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
23940 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
23950 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
23960 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
23970 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
23980 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
23990 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
239a0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
239b0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
239c0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
239d0 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
239e0 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
239f0 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
23a00 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
23a10 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
23a20 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
23a30 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23a40 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
23a50 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
23a60 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
23a70 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
23a80 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
23a90 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66 72  * Drop a page fr
23aa0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73 69  om the cache usi
23ab0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
23ac0 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Drop()..**.** If
23ad0 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72   this means ther
23ae0 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67  e are now no pag
23af0 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e 63  es with referenc
23b00 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f  es to them, a ro
23b10 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
23b20 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
23b30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
23b40 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61   removed..*/.sta
23b50 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44 72  tic void pagerDr
23b60 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  opPage(DbPage *p
23b70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
23b80 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
23b90 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  er;.  sqlite3Pca
23ba0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
23bb0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
23bc0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  sed(pPager);.}..
23bd0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
23be0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
23bf0 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
23c00 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
23c10 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
23c20 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
23c30 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
23c40 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
23c50 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
23c60 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
23c70 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
23c80 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
23c90 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
23ca0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
23cb0 6f 6e 20 63 61 6c 6c 73 20 70 61 67 65 72 53 68  on calls pagerSh
23cc0 61 72 65 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  aredLock() to ob
23cd0 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
23ce0 63 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ck on.** the dat
23cf0 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 73 75  abase file if su
23d00 63 68 20 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ch a lock or gre
23d10 61 74 65 72 20 69 73 20 6e 6f 74 20 61 6c 72 65  ater is not alre
23d20 61 64 79 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69  ady held..** Thi
23d30 73 20 6d 61 79 20 63 61 75 73 65 20 68 6f 74 2d  s may cause hot-
23d40 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
23d50 20 6f 72 20 61 20 63 61 63 68 65 20 70 75 72 67   or a cache purg
23d60 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a  e. See comments.
23d70 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ** above functio
23d80 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n pagerSharedLoc
23d90 6b 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  k() for details.
23da0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
23db0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
23dc0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
23dd0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
23de0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
23df0 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
23e00 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
23e10 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
23e20 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
23e30 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
23e40 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
23e50 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
23e60 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
23e70 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
23e80 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
23e90 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
23ea0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
23eb0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
23ec0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
23ed0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
23ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
23ef0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
23f00 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
23f10 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
23f20 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
23f30 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
23f40 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
23f50 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
23f60 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
23f70 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
23f80 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
23f90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23fa0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
23fb0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
23fc0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
23fd0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
23fe0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
23ff0 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
24000 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
24010 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
24020 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
24030 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
24040 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
24050 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
24060 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
24070 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
24080 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24090 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
240a0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
240b0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
240c0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
240d0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
240e0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
240f0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
24100 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
24110 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
24120 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
24130 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
24140 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
24150 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24160 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
24170 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
24180 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
24190 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
241a0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
241b0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
241c0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
241d0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
241e0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
241f0 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
24200 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
24210 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
24220 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
24230 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
24240 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
24250 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  che to populate 
24260 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
24270 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
24280 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
24290 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
242a0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
242b0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
242c0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
242d0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
242e0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
242f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
24300 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
24310 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
24320 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
24330 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
24340 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
24350 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
24360 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
24370 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
24380 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
24390 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
243a0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
243b0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
243c0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
243d0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
243e0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
243f0 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
24400 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
24410 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
24420 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
24430 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
24440 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
24450 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
24460 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
24470 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
24480 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
24490 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
244a0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
244b0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
244c0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
244d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
244e0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
244f0 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
24500 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
24510 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
24520 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
24530 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
24540 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
24550 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
24560 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
24570 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
24580 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
24590 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
245a0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
245b0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
245c0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
245d0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
245e0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
245f0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
24600 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
24610 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
24620 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
24630 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
24640 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
24650 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
24660 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
24670 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
24680 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
24690 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
246a0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
246b0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
246c0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
246d0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
246e0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
246f0 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
24700 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
24710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24720 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
24730 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24740 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
24750 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
24760 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
24770 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
24780 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
24790 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
247a0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
247b0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
247c0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
247d0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
247e0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
247f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
24800 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
24810 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
24820 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24830 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
24840 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  ER_UNLOCK .     
24850 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63    || sqlite3Pcac
24860 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
24870 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
24880 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31        || pgno==1
24890 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
248a0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
248b0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
248c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
248d0 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
248e0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
248f0 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
24900 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
24910 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
24920 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
24930 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
24940 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
24950 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
24960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24970 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24980 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
24990 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
249a0 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
249b0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
249c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
249d0 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
249e0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
249f0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
24a00 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
24a10 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
24a20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
24a30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24a40 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
24a50 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
24a60 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
24a70 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
24a80 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63   held..  */.  rc
24a90 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f   = pagerSharedLo
24aa0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
24ab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24ac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
24ad0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24ae0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
24af0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
24b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
24b10 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
24b20 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
24b30 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28   1, &pPg);.  if(
24b40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24b50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24b60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24b70 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
24b80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
24b90 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
24ba0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
24bb0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  0 );.  if( pPg->
24bc0 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
24bd0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
24be0 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
24bf0 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
24c00 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
24c10 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
24c20 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a  ialized..    */.
24c30 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
24c40 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
24c50 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
24c60 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
24c70 50 61 67 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d  Pager;..    rc =
24c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
24c90 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
24ca0 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
24cb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
24cd0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
24ce0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24cf0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
24d00 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
24d10 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
24d20 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
24d30 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
24d40 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
24d50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24d60 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
24d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
24d80 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
24d90 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
24da0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
24db0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
24dc0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
24dd0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
24de0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
24df0 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
24e00 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
24e10 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
24e20 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
24e30 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
24e40 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
24e50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24e60 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
24e70 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
24e80 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
24e90 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
24ea0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
24eb0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
24ec0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
24ed0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
24ee0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
24ef0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24f00 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
24f10 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
24f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
24f30 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
24f40 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
24f50 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
24f60 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
24f70 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
24f80 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
24f90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
24fa0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
24fb0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
24fc0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
24fd0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
24fe0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
24ff0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
25000 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
25020 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
25030 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
25040 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65  lloc();.      }e
25050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
25060 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
25070 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
25080 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
25090 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
250a0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
250b0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
250c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
250d0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
250e0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
250f0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
25100 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
25110 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25120 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
25130 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
25140 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25150 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
25160 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
25170 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
25180 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
25190 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
251a0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
251b0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
251c0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
251d0 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
251e0 68 65 2e 20 2a 2f 0a 20 20 20 20 50 41 47 45 52  he. */.    PAGER
251f0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
25200 69 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 50  it);.  }..  *ppP
25210 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
25220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25230 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
25240 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
25250 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
25260 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
25270 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
25280 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
25290 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
252a0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
252b0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
252c0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
252d0 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
252e0 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
252f0 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
25300 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
25310 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25320 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
25330 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
25340 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
25350 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
25360 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
25370 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
25380 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
25390 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
253a0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
253b0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
253c0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
253d0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
253e0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
253f0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
25400 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
25410 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
25420 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
25430 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
25440 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
25450 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25460 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
25470 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
25480 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
25490 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
254a0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
254b0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
254c0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
254d0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
254e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
254f0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
25500 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
25510 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
25520 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
25530 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  K).   && (pPager
25540 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
25550 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
25560 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
25570 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73  FULL).  ){.    s
25580 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
25590 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
255a0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
255b0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
255c0 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
255d0 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
255e0 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
255f0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
25600 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
25610 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
25620 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
25630 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
25640 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
25650 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
25660 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
25670 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
25680 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
25690 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
256a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
256b0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
256c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
256d0 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
256e0 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
256f0 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
25700 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
25710 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
25720 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
25730 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
25740 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
25750 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
25760 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
25770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
25780 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
25790 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61  ened, ensure tha
257a0 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75  t the.** sub-jou
257b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
257c0 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61  n too. If the ma
257d0 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  in journal is no
257e0 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20  t open,.** this 
257f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
25800 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
25810 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
25820 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
25830 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
25840 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51   plan. .** An SQ
25850 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
25860 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
25870 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
25880 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  to .** sqlite3Os
25890 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  Open() fails..*/
258a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
258b0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
258c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
258d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
258e0 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
258f0 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
25900 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
25910 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
25920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
25930 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
25940 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
25950 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
25960 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
25970 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
25980 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
25990 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
259a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
259b0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
259c0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
259d0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
259e0 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
259f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25a00 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25a10 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
25a20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
25a30 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
25a40 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
25a50 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
25a60 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
25a70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
25a80 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
25a90 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
25aa0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
25ab0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
25ac0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
25ad0 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
25ae0 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
25af0 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
25b00 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
25b10 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
25b20 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
25b30 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
25b40 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
25b50 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
25b60 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
25b70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
25b80 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
25b90 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
25ba0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
25bb0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
25bc0 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
25bd0 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
25be0 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
25bf0 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
25c00 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
25c10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c20 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
25c30 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
25c40 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
25c50 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
25c60 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
25c70 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
25c80 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
25c90 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
25ca0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
25cb0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
25cc0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
25cd0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
25ce0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
25cf0 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
25d00 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
25d10 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
25d20 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
25d30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
25d40 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
25d50 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
25d60 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
25d70 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
25d80 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
25d90 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
25da0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
25db0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
25dc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
25dd0 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
25de0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
25df0 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
25e00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
25e10 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
25e20 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
25e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
25e60 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
25e70 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
25e80 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
25e90 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
25ea0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
25eb0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
25ec0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25ed0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
25ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25ef0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
25f00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25f10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
25f20 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
25f30 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
25f40 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
25f50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
25f60 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
25f70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
25f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
25f90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
25fa0 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20    }..  /* TODO: 
25fb0 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
25fc0 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
25fd0 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
25fe0 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
25ff0 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
26000 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
26010 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
26020 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
26030 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
26040 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
26050 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26060 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
26070 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
26080 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
26090 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
260a0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
260b0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
260c0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
260d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
260e0 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
260f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
26100 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
26110 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
26120 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
26130 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26140 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
26150 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
26160 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26170 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26180 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
26190 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
261a0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
261b0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
261c0 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
261d0 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
261e0 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
261f0 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
26200 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
26210 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
26220 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
26230 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26240 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
26250 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26260 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
26270 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
26280 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
26290 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
262a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
262b0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66  ).        );.#if
262c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
262d0 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
262e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
262f0 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
26300 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
26310 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26320 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
26330 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
26340 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
26350 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
26360 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
26370 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
26380 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
26390 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
263a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
263b0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
263c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
263d0 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
263e0 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57   );.  }...  /* W
263f0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
26400 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
26410 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
26420 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a  e and open .  **
26430 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
26440 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
26450 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
26460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
26470 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
26480 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
26490 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
264a0 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  d. */.    pPager
264b0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
264c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
264d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
264e0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
264f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
26500 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
26510 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
26520 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
26530 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
26540 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
26550 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
26560 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
26570 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
26580 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
26590 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
265a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
265b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
265c0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  t ){.    rc = op
265d0 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
265e0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
265f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
26610 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
26620 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
26630 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
26640 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ournal = 0;.  }.
26650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26660 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
26670 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
26680 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
26690 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
266a0 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
266b0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
266c0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
266d0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
266e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
266f0 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
26700 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
26710 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
26720 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
26730 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
26740 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26750 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
26760 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
26770 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
26780 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
26790 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
267a0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
267b0 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
267c0 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
267d0 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
267e0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
267f0 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
26800 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e  n-memory file an
26810 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d, the journal f
26820 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65  ile is .** opene
26830 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  d if it has not 
26840 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f  been already. Fo
26850 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  r a temporary fi
26860 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  le, the opening 
26870 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  .** of the journ
26880 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
26890 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
268a0 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65  is an actual nee
268b0 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74  d to .** write t
268c0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  o the journal. T
268d0 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20  ODO: Why handle 
268e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
268f0 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a  differently?.**.
26900 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
26910 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
26920 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c   (or if it is al
26930 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65  ready open), the
26940 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68  n a.** journal-h
26950 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
26960 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
26970 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   it..**.** If th
26980 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
26990 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
269a0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
269b0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
269c0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
269d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
269e0 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
269f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
26a00 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
26a10 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
26a20 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
26a30 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
26a40 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
26a50 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
26a60 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
26a70 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
26a80 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
26a90 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
26aa0 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
26ab0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
26ac0 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
26ad0 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
26ae0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
26af0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
26b00 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
26b10 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
26b20 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
26b30 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
26b40 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
26b50 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
26b60 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
26b70 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
26b80 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
26b90 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
26ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26bb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26bc0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
26bd0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65  NLOCK );.  pPage
26be0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
26bf0 3d 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a  = subjInMemory;.
26c00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26c10 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
26c20 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
26c30 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
26c40 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
26c50 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20  sert( !MEMDB && 
26c60 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
26c70 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 62 74  e );..    /* Obt
26c80 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
26c90 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
26ca0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
26cb0 20 65 78 46 6c 61 67 20 70 61 72 61 6d 65 74 65   exFlag paramete
26cc0 72 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65  r.    ** is true
26cd0 2c 20 74 68 65 6e 20 69 6d 6d 65 64 69 61 74 65  , then immediate
26ce0 6c 79 20 75 70 67 72 61 64 65 20 74 68 69 73 20  ly upgrade this 
26cf0 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  to an EXCLUSIVE 
26d00 6c 6f 63 6b 2e 20 54 68 65 0a 20 20 20 20 2a 2a  lock. The.    **
26d10 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
26d20 6c 6c 62 61 63 6b 20 63 61 6e 20 62 65 20 75 73  llback can be us
26d30 65 64 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  ed when upgradin
26d40 67 20 74 6f 20 74 68 65 20 45 58 43 4c 55 53 49  g to the EXCLUSI
26d50 56 45 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20  VE.    ** lock, 
26d60 62 75 74 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74  but not when obt
26d70 61 69 6e 69 6e 67 20 74 68 65 20 52 45 53 45 52  aining the RESER
26d80 56 45 44 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  VED lock..    */
26d90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
26da0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
26db0 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
26dc0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
26dd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26de0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
26df0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
26e00 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46  D;.      if( exF
26e10 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
26e20 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
26e30 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
26e40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
26e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
26e60 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
26e70 75 69 72 65 64 20 6c 6f 63 6b 73 20 77 65 72 65  uired locks were
26e80 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
26e90 74 61 69 6e 65 64 2c 20 6f 70 65 6e 20 74 68 65  tained, open the
26ea0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
26eb0 66 69 6c 65 20 61 6e 64 20 77 72 69 74 65 20 74  file and write t
26ec0 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
26ed0 2d 68 65 61 64 65 72 20 74 6f 20 69 74 2e 0a 20  -header to it.. 
26ee0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
26ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
26f00 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
26f10 6c 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72  l.     && pPager
26f20 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
26f30 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
26f40 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20  _OFF .    ){.   
26f50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
26f60 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
26f70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
26f80 65 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61  e if( isOpen(pPa
26f90 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61  ger->jfd) && pPa
26fa0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
26fb0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
26fc0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
26fd0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
26fe0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
26ff0 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
27000 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
27010 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
27020 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
27030 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
27040 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
27050 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
27060 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
27070 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
27080 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
27090 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
270a0 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
270b0 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
270c0 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
270d0 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
270e0 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
270f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
27100 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
27110 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
27120 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
27130 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  igSize==0 );.   
27140 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27150 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
27160 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
27170 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
27180 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  ager);.  }..  PA
27190 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
271a0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
271b0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
271c0 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70  .  assert( !isOp
271d0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
271e0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
271f0 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
27200 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
27210 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27220 2a 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20  * Mark a single 
27230 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
27240 74 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65  teable. The page
27250 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
27260 20 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f   the .** main jo
27270 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75  urnal or sub-jou
27280 72 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64  rnal as required
27290 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
272a0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
272b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   one of the jour
272c0 6e 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73  nals, the corres
272d0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73  ponding bit is s
272e0 65 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61  et in the .** Pa
272f0 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62  ger.pInJournal b
27300 69 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61  itvec and the Pa
27310 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e  gerSavepoint.pIn
27320 53 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63  Savepoint bitvec
27330 73 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e  s.** of any open
27340 20 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61   savepoints as a
27350 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73  ppropriate..*/.s
27360 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
27370 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
27380 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
27390 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20   = pPg->pData;. 
273a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
273b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
273c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
273d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
273e0 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
273f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
27400 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
27410 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
27420 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
27430 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
27440 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
27450 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
27460 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
27470 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
27480 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
27490 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  Pg);..  /* Mark 
274a0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
274b0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
274c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
274d0 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
274e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
274f0 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
27500 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
27510 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
27520 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
27530 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
27540 6e 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62  nal(pPg) && !sub
27550 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50  jRequiresPage(pP
27560 67 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  g) ){.    pPager
27570 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
27580 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
27590 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
275a0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
275b0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
275c0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
275d0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
275e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
275f0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
27600 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
27610 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
27620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
27630 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
27640 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
27650 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
27660 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
27670 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
27680 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
27690 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
276a0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
276b0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
276c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
276d0 65 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20  egin(pPager, 0, 
276e0 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
276f0 6d 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72  mory);.    if( r
27700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
27710 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
27720 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
27730 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
27740 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
27750 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
27760 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27770 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
27780 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
27790 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
277a0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
277b0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
277c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
277d0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
277e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
277f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27800 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27810 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
27820 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
27830 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
27840 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
27850 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
27860 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
27870 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
27880 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
27890 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
278a0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
278b0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
278c0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
278d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
278e0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
278f0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
27900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27910 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
27920 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50  Pg) && isOpen(pP
27930 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
27940 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
27950 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
27960 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
27970 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
27980 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
27990 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
279a0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
279b0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
279c0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
279d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
279e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
279f0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
27a00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
27a10 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
27a20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
27a30 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
27a40 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
27a50 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
27a60 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
27a70 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
27a80 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
27a90 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
27aa0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73   7);.        cks
27ab0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
27ac0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
27ad0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
27ae0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
27af0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
27b00 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
27b10 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
27b20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27b50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
27b60 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
27b70 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
27b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b90 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
27ba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
27bb0 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
27bc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27bd0 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
27be0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
27bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27c00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27c10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27c20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
27c30 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
27c40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
27c50 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
27c60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27c70 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
27c80 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
27c90 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
27ca0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
27cb0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
27cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27cd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
27ce0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
27cf0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
27d00 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
27d10 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
27d20 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
27d30 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
27d40 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
27d50 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
27d60 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
27d70 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
27d80 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
27d90 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
27da0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
27db0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
27dc0 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
27dd0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
27de0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
27df0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
27e00 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
27e10 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
27e20 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
27e30 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
27e40 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
27e50 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
27e60 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
27e70 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
27e80 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
27e90 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
27ea0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
27eb0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
27ec0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
27ed0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
27ee0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
27ef0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
27f00 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
27f10 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27f20 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
27f30 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
27f40 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
27f50 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
27f60 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
27f70 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
27f80 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
27f90 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
27fa0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
27fb0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
27fc0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
27fd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
27fe0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
27ff0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
28000 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
28010 63 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74  curred writing t
28020 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
28030 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20  le. The .       
28040 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
28050 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62  will be rolled b
28060 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72  ack by the layer
28070 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
28080 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  */.        if( r
28090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
280a0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
280b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
280c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
280d0 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRec++;.        
280e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
280f0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
28100 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28110 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
28120 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
28130 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
28140 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28150 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28160 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  M );.        ass
28170 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
28180 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
28190 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
281a0 20 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76    rc |= addToSav
281b0 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50  epointBitvecs(pP
281c0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
281d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
281e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
281f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
28200 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
28210 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  M );.          r
28220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28230 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
28240 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
28250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
28260 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
28270 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
28280 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
28290 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
282a0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  NC;.          pP
282b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
282c0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
282d0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
282e0 28 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  (("APPEND %d pag
282f0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
28300 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28310 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
28320 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
28330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28340 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
28350 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
28360 30 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  0)));.      }.  
28370 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
28380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
28390 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
283a0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
283b0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
283c0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
283d0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
283e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
283f0 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
28400 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
28410 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
28420 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
28430 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
28440 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
28450 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
28460 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
28470 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
28480 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
28490 69 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73  if( subjRequires
284a0 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20  Page(pPg) ){.   
284b0 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e     rc = subjourn
284c0 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  alPage(pPg);.   
284d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
284e0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
284f0 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
28500 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
28510 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
28520 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
28530 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
28540 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29  Size<pPg->pgno )
28550 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
28560 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
28570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28580 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  c;.}../*.** Mark
28590 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
285a0 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20  writeable. This 
285b0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
285c0 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a  called before .*
285d0 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73  * making changes
285e0 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20   to a page. The 
285f0 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63  caller must chec
28600 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  k the return val
28610 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66  ue .** of this f
28620 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63  unction and be c
28630 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68  areful not to ch
28640 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
28650 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68  ta unless .** th
28660 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
28670 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
28680 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
28690 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
286a0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
286b0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
286c0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
286d0 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
286e0 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
286f0 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
28700 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
28710 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
28720 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
28730 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
28740 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
28750 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
28760 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
28770 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
28780 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
28790 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
287a0 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e  occurs, SQLITE_N
287b0 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72  OMEM or an IO er
287c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
287d0 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f  rned.** as appro
287e0 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73  priate. Otherwis
287f0 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  e, SQLITE_OK..*/
28800 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
28810 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
28820 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
28830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28840 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
28850 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
28860 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
28870 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
28880 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
28890 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
288a0 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
288b0 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  ize);..  if( nPa
288c0 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
288d0 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
288e0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
288f0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
28900 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
28910 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
28920 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
28930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
28940 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
28950 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
28960 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
28970 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
28980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28990 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
289a0 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
289b0 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
289c0 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  nt ii;          
289d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
289e0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
289f0 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
28a00 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
28a10 65 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61  e if any page ha
28a20 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s PGHDR_NEED_SYN
28a30 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74  C */..    /* Set
28a40 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
28a50 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
28a60 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
28a70 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
28a80 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
28a90 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
28aa0 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
28ab0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
28ac0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
28ad0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
28ae0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
28af0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
28b00 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  oNotSync==0 );. 
28b10 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
28b20 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  Sync = 1;..    /
28b30 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73  * This trick ass
28b40 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74  umes that both t
28b50 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64  he page-size and
28b60 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65   sector-size are
28b70 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67  .    ** an integ
28b80 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49  er power of 2. I
28b90 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20  t sets variable 
28ba0 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74  pg1 to the ident
28bb0 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20  ifier.    ** of 
28bc0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
28bd0 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
28be0 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a   is located on..
28bf0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d      */.    pg1 =
28c00 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20   ((pPg->pgno-1) 
28c10 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74  & ~(nPagePerSect
28c20 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20  or-1)) + 1;..   
28c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
28c40 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 28  ecount(pPager, (
28c50 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f 75 6e  int *)&nPageCoun
28c60 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  t);.    if( pPg-
28c70 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
28c80 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
28c90 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
28ca0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
28cb0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
28cc0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
28cd0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
28ce0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
28cf0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
28d00 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
28d10 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
28d20 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
28d30 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
28d40 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
28d50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
28d60 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
28d70 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
28d80 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
28d90 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
28da0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
28db0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
28dc0 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64  1+ii;.      PgHd
28dd0 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  r *pPage;.      
28de0 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e  if( pg==pPg->pgn
28df0 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42 69 74  o || !sqlite3Bit
28e00 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
28e10 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20  pInJournal, pg) 
28e20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
28e30 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
28e40 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
28e50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28e60 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
28e70 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
28e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
28e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28ea0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28eb0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
28ec0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28ed0 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
28ee0 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
28ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28f00 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
28f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
28f20 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
28f30 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
28f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28f50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
28f60 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
28f70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28f80 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
28f90 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
28fa0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
28fb0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
28fc0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
28fd0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
28fe0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
28ff0 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
29000 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29010 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
29020 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
29030 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
29040 20 49 66 20 74 68 65 20 50 47 48 44 52 5f 4e 45   If the PGHDR_NE
29050 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73 20  ED_SYNC flag is 
29060 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
29070 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
29080 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
29090 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
290a0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
290b0 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
290c0 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
290d0 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
290e0 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
290f0 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
29100 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
29110 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
29120 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
29130 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
29140 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
29150 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
29160 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
29170 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
29180 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
291a0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
291b0 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
291c0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
291d0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
291e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
291f0 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
29200 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
29210 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
29220 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29230 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
29240 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 7b      if( pPage ){
29250 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
29260 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
29270 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
29280 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
29290 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
292a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
292b0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
292c0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29  Pager->needSync)
292d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  ;.    }..    ass
292e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
292f0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
29300 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
29310 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
29320 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
29330 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
29340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29360 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
29370 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
29380 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
29390 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
293a0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
293b0 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
293c0 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
293d0 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
293e0 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
293f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
29400 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
29410 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
29420 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
29430 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
29440 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
29450 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
29460 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  RTY;.}.#endif../
29470 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
29480 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
29490 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
294a0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
294b0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
294c0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
294d0 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
294e0 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
294f0 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
29500 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
29510 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
29520 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
29530 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
29540 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 68  en.** the page h
29550 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61 73  as been added as
29560 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20 66   a leaf of the f
29570 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20 69  reelist and so i
29580 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e 6f  ts.** content no
29590 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73 2e   longer matters.
295a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
295b0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
295c0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
295d0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
295e0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
295f0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
29600 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65 20   is unused. The 
29610 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
29620 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
29630 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
29640 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
29650 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
29660 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
29670 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
29680 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65 20  n can quadruple 
29690 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
296a0 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f 70  ge .** DELETE op
296b0 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f 69  erations..*/.voi
296c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
296d0 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a 70  ntWrite(PgHdr *p
296e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
296f0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
29700 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  er;.  if( (pPg->
29710 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
29720 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53  Y) && pPager->nS
29730 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20  avepoint==0 ){. 
29740 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
29750 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
29760 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
29770 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
29780 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 49  pPager)));.    I
29790 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
297a0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
297b0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
297c0 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
297d0 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 3b  GHDR_DONT_WRITE;
297e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
297f0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
29800 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
29810 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
29820 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d  g);.#endif.  }.}
29830 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
29840 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
29850 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
29860 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74  value of the dat
29870 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20 63  abase file .** c
29880 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20 73  hange-counter, s
29890 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79 74  tored as a 4-byt
298a0 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
298b0 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61 74  eger starting at
298c0 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74   .** byte offset
298d0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
298e0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
298f0 74 68 65 20 69 73 44 69 72 65 63 74 20 66 6c 61  the isDirect fla
29900 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  g is zero, then 
29910 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62 79 20  this is done by 
29920 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69  calling .** sqli
29930 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
29940 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20  on page 1, then 
29950 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
29960 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a  ntents of the.**
29970 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e 20 74   page data. In t
29980 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 6c  his case the fil
29990 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61 74 65  e will be update
299a0 64 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  d when the curre
299b0 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
299c0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
299d0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69 72 65  **.** The isDire
299e0 63 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e 6c 79  ct flag may only
299f0 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20   be non-zero if 
29a00 74 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20  the library was 
29a10 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69 74 68  compiled.** with
29a20 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
29a30 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  LE_ATOMIC_WRITE 
29a40 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e 20 49  macro defined. I
29a50 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a 2a 20  n this case,.** 
29a60 69 66 20 69 73 44 69 72 65 63 74 20 69 73 20 6e  if isDirect is n
29a70 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
29a80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29a90 69 73 20 75 70 64 61 74 65 64 20 64 69 72 65 63  is updated direc
29aa0 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74 69 6e  tly.** by writin
29ab0 67 20 61 6e 20 75 70 64 61 74 65 64 20 76 65 72  g an updated ver
29ac0 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 75  sion of page 1 u
29ad0 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 74  sing a call to t
29ae0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  he .** sqlite3Os
29af0 57 72 69 74 65 28 29 20 66 75 6e 63 74 69 6f 6e  Write() function
29b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29b10 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
29b20 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
29b30 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
29b40 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69 6e 74  rectMode){.  int
29b50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29b60 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65 20 61  ..  /* Declare a
29b70 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  nd initialize co
29b80 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 27  nstant integer '
29b90 69 73 44 69 72 65 63 74 27 2e 20 49 66 20 74 68  isDirect'. If th
29ba0 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d 77 72  e.  ** atomic-wr
29bb0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
29bc0 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e 20 74   is enabled in t
29bd0 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65 6e 20  his build, then 
29be0 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20 69 73  isDirect.  ** is
29bf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
29c00 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
29c10 20 61 73 20 74 68 65 20 69 73 44 69 72 65 63 74   as the isDirect
29c20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 0a 20  Mode parameter. 
29c30 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63   ** to this func
29c40 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c  tion. Otherwise,
29c50 20 69 74 20 69 73 20 61 6c 77 61 79 73 20 73 65   it is always se
29c60 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a  t to zero..  **.
29c70 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73    ** The idea is
29c80 20 74 68 61 74 20 69 66 20 74 68 65 20 61 74 6f   that if the ato
29c90 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
29ca0 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 20 20  zation is not.  
29cb0 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  ** enabled at co
29cc0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 20  mpile time, the 
29cd0 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f 6d 69  compiler can omi
29ce0 74 20 74 68 65 20 74 65 73 74 73 20 6f 66 0a 20  t the tests of. 
29cf0 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27 20 62   ** 'isDirect' b
29d00 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20 61 73  elow, as well as
29d10 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63 6c 6f   the block enclo
29d20 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  sed in the.  ** 
29d30 22 69 66 28 20 69 73 44 69 72 65 63 74 20 29 22  "if( isDirect )"
29d40 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20 2a 2f   condition..  */
29d50 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29d60 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
29d70 49 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ITE.  const int 
29d80 69 73 44 69 72 65 63 74 20 3d 20 30 3b 0a 20 20  isDirect = 0;.  
29d90 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
29da0 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55 4e 55  Mode==0 );.  UNU
29db0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 73  SED_PARAMETER(is
29dc0 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23 65 6c  DirectMode);.#el
29dd0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
29de0 73 44 69 72 65 63 74 20 3d 20 69 73 44 69 72 65  sDirect = isDire
29df0 63 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66 0a 0a  ctMode;.#endif..
29e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29e10 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
29e20 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69 66 28  ESERVED );.  if(
29e30 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
29e40 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70 50 61  CountDone && pPa
29e50 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
29e60 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
29e70 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
29e80 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20     /* Reference 
29e90 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 20  to page 1 */.   
29ea0 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
29eb0 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ter;           /
29ec0 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
29ed0 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  of change-counte
29ee0 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20 20 20  r field */..    
29ef0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
29f00 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69 73 4f  >tempFile && isO
29f10 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
29f20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  );..    /* Open 
29f30 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
29f40 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
29f50 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
29f60 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
29f70 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b  er, 1, &pPgHdr);
29f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
29f90 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  Hdr==0 || rc==SQ
29fa0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
29fb0 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65 20 77  /* If page one w
29fc0 61 73 20 66 65 74 63 68 65 64 20 73 75 63 63 65  as fetched succe
29fd0 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74 68 69  ssfully, and thi
29fe0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
29ff0 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  t.    ** operati
2a000 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d 6f 64  ng in direct-mod
2a010 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31 20 77  e, make page 1 w
2a020 72 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  ritable..    */.
2a030 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2a040 54 45 5f 4f 4b 20 26 26 20 21 69 73 44 69 72 65  TE_OK && !isDire
2a050 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
2a060 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a070 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
2a080 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  }..    if( rc==S
2a090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a0a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
2a0b0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
2a0c0 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
2a0d0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
2a0e0 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65   */.      change
2a0f0 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74  _counter = sqlit
2a100 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29  e3Get4byte((u8*)
2a110 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
2a120 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67  rs);.      chang
2a130 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
2a140 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
2a150 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
2a160 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
2a170 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20  ounter);..      
2a180 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 69 6e  /* If running in
2a190 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 77 72   direct mode, wr
2a1a0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
2a1b0 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 74 68   of page 1 to th
2a1c0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  e file. */.     
2a1d0 20 69 66 28 20 69 73 44 69 72 65 63 74 20 29 7b   if( isDirect ){
2a1e0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 76  .        const v
2a1f0 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50 67 48  oid *zBuf = pPgH
2a200 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 20  dr->pData;.     
2a210 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2a220 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e 30 20  r->dbFileSize>0 
2a230 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2a240 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
2a250 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
2a260 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
2a270 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  e, 0);.      }..
2a280 20 20 20 20 20 20 2f 2a 20 49 66 20 65 76 65 72        /* If ever
2a290 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 73  ything worked, s
2a2a0 65 74 20 74 68 65 20 63 68 61 6e 67 65 43 6f 75  et the changeCou
2a2b0 6e 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a 2f 0a  ntDone flag. */.
2a2c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a2d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a2e0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
2a2f0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
2a300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2a310 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
2a320 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
2a330 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2a340 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2a350 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
2a360 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
2a370 6e 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  nc the pager fil
2a380 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20  e to disk. This 
2a390 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69  is a no-op for i
2a3a0 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a  n-memory files.*
2a3b0 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74 68 20  * or pages with 
2a3c0 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63  the Pager.noSync
2a3d0 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
2a3e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2a3f0 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  or called on a p
2a400 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 69  ager for which i
2a410 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68  t is a no-op, th
2a420 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
2a430 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
2a440 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
2a450 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
2a460 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2a470 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  t sqlite3PagerSy
2a480 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
2a490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a4c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 66  urn code */.  if
2a4d0 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65  ( MEMDB || pPage
2a4e0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
2a4f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2a500 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2a510 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
2a520 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
2a530 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
2a540 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2a550 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2a560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a570 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
2a580 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
2a590 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
2a5a0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
2a5b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
2a5c0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
2a5d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
2a5e0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
2a5f0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
2a600 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
2a610 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
2a620 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
2a630 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
2a640 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
2a650 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
2a660 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2a670 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 3a 0a  e ensures that:.
2a680 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64 61  **.**   * The da
2a690 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
2a6a0 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 75 70  ge-counter is up
2a6b0 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20 74 68  dated,.**   * th
2a6c0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
2a6d0 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68 65 20  ced (unless the 
2a6e0 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2a6f0 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75 73 65  imization is use
2a700 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c 20 64  d),.**   * all d
2a710 69 72 74 79 20 70 61 67 65 73 20 61 72 65 20 77  irty pages are w
2a720 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61  ritten to the da
2a730 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a 2a 2a  tabase file, .**
2a740 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61 73     * the databas
2a750 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  e file is trunca
2a760 74 65 64 20 28 69 66 20 72 65 71 75 69 72 65 64  ted (if required
2a770 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68  ), and.**   * th
2a780 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a790 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  synced. .**.** T
2a7a0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
2a7b0 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  at remains to co
2a7c0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
2a7d0 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e 61 6c  tion is to final
2a7e0 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74 65 2c  ize .** (delete,
2a7f0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
2a800 6f 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  o the first part
2a810 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c   of) the journal
2a820 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20 64 65   file (or .** de
2a830 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
2a840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
2a850 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
2a860 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
2a870 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
2a880 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
2a890 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
2a8a0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
2a8b0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
2a8c0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
2a8d0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
2a8e0 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
2a8f0 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
2a900 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
2a910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a920 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
2a930 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
2a940 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
2a950 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2a960 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
2a970 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
2a980 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
2a990 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
2a9a0 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
2a9b0 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
2a9c0 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
2a9d0 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
2a9e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2a9f0 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
2aa00 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
2aa10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2aa20 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63  er object */.  c
2aa30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
2aa40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2aa50 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  * If not NULL, t
2aa60 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
2aa70 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  l name */.  int 
2aa80 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20 20 20  noSync          
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2aaa0 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68 65 20  rue to omit the 
2aab0 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64 62 20  xSync on the db 
2aac0 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  file */.){.  int
2aad0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2aae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aaf0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
2ab00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
2ab10 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
2ab20 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
2ab30 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  ode;.  }..  PAGE
2ab40 52 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53  RTRACE(("DATABAS
2ab50 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
2ab60 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65  zMaster=%s nSize
2ab70 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
2ab80 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2ab90 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
2aba0 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20  r->dbSize));..  
2abb0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2abc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
2abd0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
2abe0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
2abf0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
2ac00 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
2ac10 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
2ac20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
2ac30 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
2ac40 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2ac50 69 66 69 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ified ){.    sql
2ac60 69 74 65 33 42 61 63 6b 75 70 52 65 73 74 61 72  ite3BackupRestar
2ac70 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  t(pPager->pBacku
2ac80 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  p);.  }else if( 
2ac90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
2aca0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 70  AGER_SYNCED && p
2acb0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
2acc0 64 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  d ){..    /* The
2acd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
2ace0 20 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61   updates the cha
2acf0 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45 78 61  nge-counter. Exa
2ad00 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20 20 20  ctly how it.    
2ad10 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64 65 70  ** does this dep
2ad20 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20  ends on whether 
2ad30 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69  or not the atomi
2ad40 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a  c-update optimiz
2ad50 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77 61 73  ation.    ** was
2ad60 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
2ad70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20 69 66  ile time, and if
2ad80 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2ad90 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20 20 20  n meets the .   
2ada0 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72 69 74   ** runtime crit
2adb0 65 72 69 61 20 74 6f 20 75 73 65 20 74 68 65 20  eria to use the 
2adc0 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20 20 20  operation: .    
2add0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  **.    **    * T
2ade0 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73  he file-system s
2adf0 75 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d  upports the atom
2ae00 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
2ae10 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20  y for.    **    
2ae20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65    blocks of size
2ae30 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20   page-size, and 
2ae40 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69  .    **    * Thi
2ae50 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
2ae60 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
2ae70 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
2ae80 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20  , and.    **    
2ae90 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61  * Exactly one pa
2aea0 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ge has been modi
2aeb0 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69  fied and store i
2aec0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2aed0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
2aee0 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
2aef0 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 65 6e  ation was not en
2af00 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
2af10 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68 65 0a   time, then the.
2af20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
2af30 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2af40 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  ) function is ca
2af50 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  lled to update t
2af60 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20 2a 2a  he change.    **
2af70 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69 6e 64   counter in 'ind
2af80 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49 66 20  irect-mode'. If 
2af90 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
2afa0 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2afb0 62 75 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  but.    ** is no
2afc0 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74 6f 20  t applicable to 
2afd0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2afe0 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4a 6f  , call sqlite3Jo
2aff0 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a 20 20  urnalCreate().  
2b000 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72    ** to make sur
2b010 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
2b020 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  le has actually 
2b030 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68  been created, th
2b040 65 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 70  en call.    ** p
2b050 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2b060 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
2b070 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
2b080 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
2b090 63 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 2e 20  ct.    ** mode. 
2b0a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
2b0b0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
2b0c0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2b0d0 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20 61 6e   both enabled an
2b0e0 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a 20 20  d applicable,.  
2b0f0 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c 20 70    ** then call p
2b100 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2b110 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
2b120 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
2b130 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20 69 6e  ounter.    ** in
2b140 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65 2e 20   'direct' mode. 
2b150 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2b160 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69   journal file wi
2b170 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20 20 20  ll never be.    
2b180 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72 20 74  ** created for t
2b190 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
2b1a0 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  .    */.#ifdef S
2b1b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2b1c0 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 50 67  MIC_WRITE.    Pg
2b1d0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
2b1e0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
2b1f0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
2b200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2b210 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2b220 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
2b230 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26 20 69  f( !zMaster && i
2b240 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2b250 64 29 20 0a 20 20 20 20 20 26 26 20 70 50 61 67  d) .     && pPag
2b260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
2b270 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
2b280 50 61 67 65 72 29 20 0a 20 20 20 20 20 26 26 20  Pager) .     && 
2b290 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
2b2a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
2b2b0 7a 65 0a 20 20 20 20 20 26 26 20 28 30 3d 3d 28  ze.     && (0==(
2b2c0 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61  pPg = sqlite3Pca
2b2d0 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61  cheDirtyList(pPa
2b2e0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29 20 7c  ger->pPCache)) |
2b2f0 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72 74 79  | 0==pPg->pDirty
2b300 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
2b310 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
2b320 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
2b330 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65  ter via the dire
2b340 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e  ct-write method.
2b350 20 54 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   The .      ** f
2b360 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69  ollowing call wi
2b370 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20 69 6e  ll modify the in
2b380 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
2b390 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
2b3a0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 69 6e   .      ** to in
2b3b0 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
2b3c0 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  d change counter
2b3d0 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20   and then write 
2b3e0 70 61 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a  page 1 .      **
2b3f0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2b400 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2b410 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
2b420 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20 20 20  tomic-write .   
2b430 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f     ** property o
2b440 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d  f the host file-
2b450 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69 73 20  system, this is 
2b460 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  safe..      */. 
2b470 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2b480 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2b490 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20  er(pPager, 1);. 
2b4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2b4c0 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
2b4d0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
2b4e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b4f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b500 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
2b510 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
2b520 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2b530 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20   }.#else.    rc 
2b540 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2b550 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2b560 72 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  r, 0);.#endif.  
2b570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2b580 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2b590 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2b5a0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2b5b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
2b5c0 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
2b5d0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
2b5e0 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
2b5f0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
2b600 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
2b610 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
2b620 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
2b630 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  nal.    ** file.
2b640 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
2b650 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
2b660 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20 20 2a  cuum mode..    *
2b670 2a 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72 65 20  *.    ** Before 
2b680 72 65 61 64 69 6e 67 20 74 68 65 20 70 61 67 65  reading the page
2b690 73 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  s with page numb
2b6a0 65 72 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ers larger than 
2b6b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75 72 72  the .    ** curr
2b6c0 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67  ent value of Pag
2b6d0 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64  er.dbSize, set d
2b6e0 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68  bSize back to th
2b6f0 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 74  e value.    ** t
2b700 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74  hat it took at t
2b710 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2b720 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68  transaction. Oth
2b730 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20  erwise, the.    
2b740 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
2b750 74 65 33 50 61 67 65 72 47 65 74 28 29 20 72 65  te3PagerGet() re
2b760 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61 67 65  turn zeroed page
2b770 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a 20 20  s instead of .  
2b780 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64 61 74    ** reading dat
2b790 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
2b7a0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2b7b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b7c0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b7d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
2b7e0 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  dbSize<pPager->d
2b7f0 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20 20 26  bOrigSize.     &
2b800 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2b810 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55  lMode!=PAGER_JOU
2b820 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
2b830 20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20    ){.      Pgno 
2b840 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b860 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2b870 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2b880 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 69 53     const Pgno iS
2b890 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50  kip = PAGER_MJ_P
2b8a0 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f 2a 20  GNO(pPager); /* 
2b8b0 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70 61 67  Pending lock pag
2b8c0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
2b8d0 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d 20 70   Pgno dbSize = p
2b8e0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 20 20  Pager->dbSize;  
2b8f0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2b900 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f 20 0a   image size */ .
2b910 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2b920 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2b930 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20 20 20  bOrigSize;.     
2b940 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31   for( i=dbSize+1
2b950 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f  ; i<=pPager->dbO
2b960 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a  rigSize; i++ ){.
2b970 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
2b980 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
2b990 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b9a0 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69  l, i) && i!=iSki
2b9b0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  p ){.          P
2b9c0 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20 20 20  gHdr *pPage;    
2b9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2b9e0 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
2b9f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ba00 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
2ba10 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
2ba20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ba30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2ba40 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2ba50 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2ba60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2ba70 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2ba80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
2ba90 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2baa0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2bab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bac0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
2bad0 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
2bae0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
2baf0 20 20 20 7d 20 0a 20 20 20 20 20 20 70 50 61 67     } .      pPag
2bb00 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64 62 53  er->dbSize = dbS
2bb10 69 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ize;.    }.#endi
2bb20 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
2bb30 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
2bb40 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
2bb50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2bb60 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20 20 20  f a master .    
2bb70 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2bb80 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79  name has already
2bb90 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
2bba0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2bbb0 65 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66  e, .    ** or if
2bbc0 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c   zMaster is NULL
2bbd0 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72   (no master jour
2bbe0 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20  nal), then this 
2bbf0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
2bc00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2bc10 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
2bc20 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
2bc30 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ter);.    if( rc
2bc40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2bc50 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2bc60 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2bc70 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
2bc80 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
2bc90 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70  atomic-update op
2bca0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 62 65  timization is be
2bcb0 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 2c  ing.    ** used,
2bcc0 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c 20   this call will 
2bcd0 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65 20 6a  not create the j
2bce0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 70  ournal file or p
2bcf0 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20 20 2a  erform any.    *
2bd00 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20 20 2a  * real IO..    *
2bd10 2f 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a  /.    rc = syncJ
2bd20 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
2bd30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2bd40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2bd50 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2bd60 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  it;..    /* Writ
2bd70 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
2bd80 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
2bd90 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  e file. */.    r
2bda0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
2bdb0 70 61 67 65 6c 69 73 74 28 73 71 6c 69 74 65 33  pagelist(sqlite3
2bdc0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
2bdd0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2bde0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2bdf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2be00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
2be10 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
2be20 45 44 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ED );.      goto
2be30 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2be40 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  e_exit;.    }.  
2be50 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
2be60 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e  leanAll(pPager->
2be70 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f  pPCache);..    /
2be80 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  * If the file on
2be90 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74 68 65   disk is not the
2bea0 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 74 68   same size as th
2beb0 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  e database image
2bec0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 73  ,.    ** then us
2bed0 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e pager_truncate
2bee0 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68 72 69   to grow or shri
2bef0 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65 72 65  nk the file here
2bf00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2bf10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 21   pPager->dbSize!
2bf20 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  =pPager->dbFileS
2bf30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ize ){.      Pgn
2bf40 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d  o nNew = pPager-
2bf50 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65  >dbSize - (pPage
2bf60 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52  r->dbSize==PAGER
2bf70 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
2bf80 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bf90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2bfa0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2bfb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
2bfc0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
2bfd0 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ger, nNew);.    
2bfe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2bff0 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c000 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c010 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2c020 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20 74 68  Finally, sync th
2c030 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2c040 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
2c050 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
2c060 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2c070 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
2c080 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
2c090 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
2c0a0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
2c0b0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
2c0c0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
2c0d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
2c0e0 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
2c0f0 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f 70 68  ;.  }..commit_ph
2c100 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a 20 20  ase_one_exit:.  
2c110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
2c120 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a  OERR_BLOCKED ){.
2c130 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63      /* pager_inc
2c140 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2c150 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f  ) may attempt to
2c160 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
2c170 73 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  sive.    ** lock
2c180 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61   to spill the ca
2c190 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  che and return I
2c1a0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75  OERR_BLOCKED. Bu
2c1b0 74 20 73 69 6e 63 65 20 0a 20 20 20 20 2a 2a 20  t since .    ** 
2c1c0 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
2c1d0 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20  ce the cache is 
2c1e0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74  inconsistent, it
2c1f0 20 69 73 0a 20 20 20 20 2a 2a 20 62 65 74 74 65   is.    ** bette
2c200 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  r to return SQLI
2c210 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2a 2f  TE_BUSY..    **/
2c220 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c230 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74  _BUSY;.  }.  ret
2c240 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2c250 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
2c260 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
2c270 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c280 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d 70 6c  e has been compl
2c290 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74 65 64  etely.** updated
2c2a0 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 65 20   to reflect the 
2c2b0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
2c2c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
2c2d0 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73  saction and.** s
2c2e0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 54  ynced to disk. T
2c2f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c300 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69 6e 20  still exists in 
2c310 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2c320 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e 64 20  .** though, and 
2c330 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
2c340 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e  urs at this poin
2c350 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e 74 75  t it will eventu
2c360 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20  ally.** be used 
2c370 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
2c380 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
2c390 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
2c3a0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
2c3b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
2c3c0 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2c3d0 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68 65 72  nal file, either
2c3e0 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20 0a 2a   by deleting, .*
2c3f0 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72 20  * truncating or 
2c400 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f 69 6e  partially zeroin
2c410 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20 69 74  g it, so that it
2c420 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20   cannot be used 
2c430 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f 75 72  .** for hot-jour
2c440 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e  nal rollback. On
2c450 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20  ce this is done 
2c460 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
2c470 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61 62 6c  is.** irrevocabl
2c480 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  y committed..**.
2c490 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2c4a0 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72  ccurs, an IO err
2c4b0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2c4c0 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61 67 65  ned and the page
2c4d0 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74 6f 20  r.** moves into 
2c4e0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2c4f0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2c500 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2c510 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2c520 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
2c530 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67  eTwo(Pager *pPag
2c540 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
2c550 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2c560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2c570 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
2c580 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65   /* Do not proce
2c590 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72 20  ed if the pager 
2c5a0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
2c5b0 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 2a  e error state. *
2c5c0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2c5d0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
2c5e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2c5f0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
2c600 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
2c610 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
2c620 6c 65 64 20 69 66 20 74 68 65 20 70 61 67 65 72  led if the pager
2c630 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65   is not in at le
2c640 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52  ast.  ** PAGER_R
2c650 45 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 41  ESERVED state. A
2c660 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69 74 65  nd indeed SQLite
2c670 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68 69 73   never does this
2c680 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20 2a 2a  . But it is.  **
2c690 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 74 68   nice to have th
2c6a0 69 73 20 64 65 66 65 6e 73 69 76 65 20 62 6c 6f  is defensive blo
2c6b0 63 6b 20 68 65 72 65 20 61 6e 79 77 61 79 2e 0a  ck here anyway..
2c6c0 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52    */.  if( NEVER
2c6d0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50  (pPager->state<P
2c6e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 29 20 29  AGER_RESERVED) )
2c6f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c700 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2c710 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69 7a 61    /* An optimiza
2c720 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64 61 74  tion. If the dat
2c730 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20 61 63  abase was not ac
2c740 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65 64 20  tually modified 
2c750 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68 69 73  during.  ** this
2c760 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
2c770 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
2c780 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ng in exclusive-
2c790 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20 2a 2a  mode and is.  **
2c7a0 20 75 73 69 6e 67 20 70 65 72 73 69 73 74 65 6e   using persisten
2c7b0 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
2c7c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2c7d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
2c7e0 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f    ** The start o
2c7f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2c800 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  le currently con
2c810 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 6a  tains a single j
2c820 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68 65 61  ournal .  ** hea
2c830 64 65 72 20 77 69 74 68 20 74 68 65 20 6e 52 65  der with the nRe
2c840 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f 20 30  c field set to 0
2c850 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f 75 72  . If such a jour
2c860 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73 0a 20  nal is used as. 
2c870 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   ** a hot-journa
2c880 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75  l during hot-jou
2c890 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c 20 30  rnal rollback, 0
2c8a0 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
2c8b0 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20 74 68   made.  ** to th
2c8c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2c8d0 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
2c8e0 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74 68 65  need to zero the
2c8f0 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2c900 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74 68 65  eader. Since the
2c910 20 70 61 67 65 72 20 69 73 20 69 6e 20 65 78 63   pager is in exc
2c920 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65  lusive mode, the
2c930 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20  re is no need.  
2c940 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79 20 6c  ** to drop any l
2c950 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20 20 2a  ocks either..  *
2c960 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
2c970 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26  dbModified==0 &&
2c980 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2c990 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 70 50  veMode .   && pP
2c9a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
2c9b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
2c9c0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 29  MODE_PERSIST.  )
2c9d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2c9e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2c9f0 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
2ca00 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2ca10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2ca20 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2ca30 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE(("COMMIT %d\
2ca40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
2ca50 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
2ca60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2ca70 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
2ca80 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72  MEMDB || !pPager
2ca90 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
2caa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
2cab0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2cac0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2cad0 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
2cae0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
2caf0 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
2cb00 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
2cb10 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20 64 61   changes. The da
2cb20 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
2cb30 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
2cb40 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  D mode..**.** Th
2cb50 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
2cb60 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73 3a 0a  orms two tasks:.
2cb70 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20 72 6f  **.**   1) It ro
2cb80 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a 6f 75  lls back the jou
2cb90 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73 74 6f  rnal file, resto
2cba0 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62 61 73  ring all databas
2cbb0 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 20  e file and .**  
2cbc0 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61      in-memory ca
2cbd0 63 68 65 20 70 61 67 65 73 20 74 6f 20 74 68 65  che pages to the
2cbe0 20 73 74 61 74 65 20 74 68 65 79 20 77 65 72 65   state they were
2cbf0 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74 72 61   in when the tra
2cc00 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  nsaction.**     
2cc10 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61 6e 64   was opened, and
2cc20 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69 6e 61  .**   2) It fina
2cc30 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61  lizes the journa
2cc40 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61 74 20  l file, so that 
2cc50 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 66  it is not used f
2cc60 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20 20 72  or hot.**      r
2cc70 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79 20 70  ollback at any p
2cc80 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
2cc90 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a 65 63  re..**.** subjec
2cca0 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t to the followi
2ccb0 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e  ng qualification
2ccc0 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68  s:.**.** * If th
2ccd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
2cce0 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 20 77  s not yet open w
2ccf0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2cd00 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20  n is called,.** 
2cd10 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32 29 20    then only (2) 
2cd20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 6e  is performed. In
2cd30 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
2cd40 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c 20 66   is no journal f
2cd50 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f 6c 6c  ile.**   to roll
2cd60 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a 20 49   back..**.** * I
2cd70 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  f in an error st
2cd80 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
2cd90 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68 65 6e  QLITE_FULL, then
2cda0 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a 2a 2a   task (1) is .**
2cdb0 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20 49 66     performed. If
2cdc0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 61 73   successful, tas
2cdd0 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c 65 73  k (2). Regardles
2cde0 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d 65  s of the outcome
2cdf0 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65 72 2c  .**   of either,
2ce00 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2ce10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2ce20 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
2ce30 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e 65 2e  aller.**   (i.e.
2ce40 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 49   either SQLITE_I
2ce50 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45 5f 43  OERR or SQLITE_C
2ce60 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 2a  ORRUPT)..**.** *
2ce70 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
2ce80 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45 52 56   in PAGER_RESERV
2ce90 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61  ED state, then a
2cea0 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68 65 74  ttempt (1). Whet
2ceb0 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f 74 20  her.**   or not 
2cec0 28 31 29 20 69 73 20 73 75 63 63 75 73 73 66 75  (1) is succussfu
2ced0 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70 74 20  l, also attempt 
2cee0 28 32 29 2e 20 49 66 20 73 75 63 63 65 73 73 66  (2). If successf
2cef0 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  ul, return.**   
2cf00 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72  SQLITE_OK. Other
2cf10 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68 65 20  wise, enter the 
2cf20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2cf30 72 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74  return the first
2cf40 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63 6f 64   .**   error cod
2cf50 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 0a  e encountered. .
2cf60 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2cf70 63 61 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f  case there is no
2cf80 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
2cf90 20 64 61 74 61 62 61 73 65 20 77 61 73 20 77 72   database was wr
2cfa0 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20 20 20  itten to. .**   
2cfb0 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20 66 69  So is safe to fi
2cfc0 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
2cfd0 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69 66 20  al file even if 
2cfe0 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a 2a 2a  the playback .**
2cff0 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20 31 29     (operation 1)
2d000 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76 65 72   failed. However
2d010 20 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   the pager must 
2d020 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2d030 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20 74 68  state.**   as th
2d040 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2d050 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
2d060 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70 65 63  e are now suspec
2d070 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e 61 6c  t..**.** * Final
2d080 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45 52 5f  ly, if in PAGER_
2d090 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
2d0a0 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28 31   then attempt (1
2d0b0 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61 74 74  ). Only.**   att
2d0c0 65 6d 70 74 20 28 32 29 20 69 66 20 28 31 29 20  empt (2) if (1) 
2d0d0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 52  is successful. R
2d0e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
2d0f0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  if successful,.*
2d100 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20 65 6e  *   otherwise en
2d110 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2d120 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2d130 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  he error code fr
2d140 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66 61 69  om the .**   fai
2d150 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ling operation..
2d160 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69 73 20  **.**   In this 
2d170 63 61 73 65 20 74 68 65 20 64 61 74 61 62 61 73  case the databas
2d180 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76 65 20  e file may have 
2d190 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2e  been written to.
2d1a0 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20 20 20   So if the.**   
2d1b0 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69  playback operati
2d1c0 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63 63 65  on did not succe
2d1d0 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74 20  ed it would not 
2d1e0 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e 61 6c  be safe to final
2d1f0 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75  ize.**   the jou
2d200 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 6e 65  rnal file. It ne
2d210 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74 20 69  eds to be left i
2d220 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2d230 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20 20 73  m so that.**   s
2d240 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
2d250 73 20 63 61 6e 20 75 73 65 20 69 74 20 74 6f 20  s can use it to 
2d260 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
2d270 62 61 73 65 20 73 74 61 74 65 20 28 62 79 0a 2a  base state (by.*
2d280 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  *   hot-journal 
2d290 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a 69 6e  rollback)..*/.in
2d2a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  t sqlite3PagerRo
2d2b0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
2d2c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2d2d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d2f0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2d300 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 52    PAGERTRACE(("R
2d310 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
2d320 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29  AGERID(pPager)))
2d330 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
2d340 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c 20 21  >dbModified || !
2d350 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
2d360 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  fd) ){.    rc = 
2d370 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
2d380 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50  ction(pPager, pP
2d390 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
2d3a0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  ;.  }else if( pP
2d3b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
2d3c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
2d3d0 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
2d3e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2d3f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2d400 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
2d410 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
2d420 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
2d430 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  }.    rc = pPage
2d440 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65  r->errCode;.  }e
2d450 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2d460 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
2d470 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
2d480 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
2d490 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
2d4a0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
2d4b0 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70  );.      rc2 = p
2d4c0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2d4d0 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2d4e0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2d4f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d500 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d510 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
2d520 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2d530 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2d540 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2d550 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  r, 0);.    }..  
2d560 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
2d570 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
2d580 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20  SizeValid = 0;. 
2d590 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2d5a0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
2d5b0 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43  during a ROLLBAC
2d5c0 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e  K, we can no lon
2d5d0 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61  ger trust the pa
2d5e0 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  ger.    ** cache
2d5f0 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
2d600 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
2d610 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
2d620 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a  ny error .    **
2d630 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20   persistent..   
2d640 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
2d650 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
2d660 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
2d670 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2d680 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
2d690 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2d6a0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
2d6b0 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
2d6c0 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
2d6d0 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
2d6e0 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
2d6f0 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50 61 67  */.u8 sqlite3Pag
2d700 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
2d710 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2d720 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
2d730 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
2d740 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
2d750 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
2d760 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
2d770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d780 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
2d790 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
2d7a0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
2d7b0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
2d7c0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
2d7d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2d7e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2d7f0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
2d800 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
2d810 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
2d820 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
2d830 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
2d840 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
2d850 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
2d860 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
2d870 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
2d880 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d890 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
2d8a0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
2d8b0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
2d8c0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
2d8d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2d8e0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
2d8f0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
2d900 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
2d910 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
2d920 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
2d930 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
2d940 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
2d950 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
2d960 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
2d970 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
2d980 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
2d990 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
2d9a0 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74  SizeValid ? (int
2d9b0 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ) pPager->dbSize
2d9c0 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20   : -1;.  a[4] = 
2d9d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
2d9e0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
2d9f0 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
2da00 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
2da10 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
2da20 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
2da30 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
2da40 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
2da50 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
2da60 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
2da70 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
2da80 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
2da90 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2daa0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2dab0 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
2dac0 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a 2f 0a  emory pager..*/.
2dad0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2dae0 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20 2a 70  IsMemdb(Pager *p
2daf0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
2db00 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   MEMDB;.}../*.**
2db10 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 72   Check that ther
2db20 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e  e are at least n
2db30 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f  Savepoint savepo
2db40 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20 74 68  ints open. If th
2db50 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72 72 65  ere are.** curre
2db60 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e 20 6e  ntly less than n
2db70 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2c  Savepoints open,
2db80 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65 20 6f   then open one o
2db90 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
2dba0 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75 70 20  s.** to make up 
2dbb0 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 2e 20  the difference. 
2dbc0 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
2dbd0 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73 20 61   savepoints is a
2dbe0 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61 6c 20  lready.** equal 
2dbf0 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c 20 74  to nSavepoint, t
2dc00 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2dc10 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2dc20 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
2dc30 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
2dc40 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69  , SQLITE_NOMEM i
2dc50 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2dc60 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
2dc70 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67  rs while opening
2dc80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
2dc90 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e 20 49   file, then an I
2dca0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 0a  O error code is.
2dcb0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  ** returned. Oth
2dcc0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
2dcd0 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
2dce0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
2dcf0 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  int(Pager *pPage
2dd00 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e  r, int nSavepoin
2dd10 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
2dd20 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2dd50 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74  /.  int nCurrent
2dd60 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
2dd70 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  point;        /*
2dd80 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65 72 20   Current number 
2dd90 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f  of savepoints */
2dda0 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69  ..  if( nSavepoi
2ddb0 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26 20 70  nt>nCurrent && p
2ddc0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
2ddd0 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b  l ){.    int ii;
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2de10 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50 61 67  iable */.    Pag
2de20 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65  erSavepoint *aNe
2de30 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2de40 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61 67 65       /* New Page
2de50 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72  r.aSavepoint arr
2de60 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 69  ay */..    /* Ei
2de70 74 68 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f  ther there is no
2de80 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20   active journal 
2de90 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  or the sub-journ
2dea0 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20  al is open or . 
2deb0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2dec0 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72  l is always stor
2ded0 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ed in memory */.
2dee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2def0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d  er->nSavepoint==
2df00 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  0 || isOpen(pPag
2df10 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20 20 20  er->sjfd) ||.   
2df20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
2df30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
2df40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2df50 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f  MEMORY );..    /
2df60 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
2df70 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
2df80 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
2df90 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
2dfa0 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
2dfb0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
2dfc0 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
2dfd0 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
2dfe0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
2dff0 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
2e000 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
2e010 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
2e020 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
2e030 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
2e040 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
2e050 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
2e060 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
2e070 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
2e080 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
2e090 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
2e0a0 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
2e0b0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
2e0c0 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
2e0d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2e0e0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
2e0f0 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
2e100 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
2e110 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
2e120 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2e130 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
2e140 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
2e150 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70 50 61   = aNew;.    pPa
2e160 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
2e170 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
2e180 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
2e190 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
2e1a0 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
2e1b0 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
2e1c0 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75 72 72      for(ii=nCurr
2e1d0 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69  ent; ii<nSavepoi
2e1e0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
2e1f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2e200 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
2e210 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
2e220 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64  Orig = pPager->d
2e230 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  bSize;.      if(
2e240 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2e250 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
2e260 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
2e270 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2e280 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
2e290 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
2e2a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e2b0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
2e2c0 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
2e2d0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
2e2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
2e2f0 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
2e300 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b  pPager->nSubRec;
2e310 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e  .      aNew[ii].
2e320 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 73  pInSavepoint = s
2e330 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
2e340 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
2e350 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 61  e);.      if( !a
2e360 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2e370 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  oint ){.        
2e380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2e390 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
2e3a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20   }..    /* Open 
2e3b0 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
2e3c0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
2e3d0 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a 2f  ready opened. */
2e3e0 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75  .    rc = openSu
2e3f0 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  bJournal(pPager)
2e400 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2e410 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2e420 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
2e430 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  lled to rollback
2e440 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f 6d   or release (com
2e450 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e 74  mit) a savepoint
2e460 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f 69  ..** The savepoi
2e470 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f 72  nt to release or
2e480 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20 6e   rollback need n
2e490 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20 72  ot be the most r
2e4a0 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65 61  ecently .** crea
2e4b0 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 2a  ted savepoint..*
2e4c0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
2e4d0 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
2e4e0 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
2e4f0 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
2e500 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
2e510 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
2e520 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
2e530 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
2e540 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
2e550 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
2e560 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
2e570 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
2e580 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
2e590 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
2e5a0 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
2e5b0 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20 74  occurred since t
2e5c0 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76  he specified sav
2e5d0 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
2e5e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  ed..**.** The sa
2e5f0 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c 62  vepoint to rollb
2e600 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 69  ack or release i
2e610 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2e620 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69 53  parameter .** iS
2e630 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c 75  avepoint. A valu
2e640 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f 20  e of 0 means to 
2e650 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 6f  operate on the o
2e660 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2e670 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73 74  nt.** (the first
2e680 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61 6c   created). A val
2e690 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53 61  ue of (Pager.nSa
2e6a0 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e 73  vepoint-1) means
2e6b0 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20 74   operate.** on t
2e6c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
2e6d0 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69   created savepoi
2e6e0 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69 6e  nt. If iSavepoin
2e6f0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
2e700 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61 76  n.** (Pager.nSav
2e710 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e 20  epoint-1), then 
2e720 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2e730 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2e740 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76 61  If a negative va
2e750 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  lue is passed to
2e760 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
2e770 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74  then the current
2e780 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
2e790 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
2e7a0 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
2e7b0 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  t to calling .**
2e7c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
2e7d0 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65 20  lback() because 
2e7e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
2e7f0 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65  es not terminate
2e800 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
2e810 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ion or unlock th
2e820 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 6a  e database, it j
2e830 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68 65  ust restores the
2e840 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
2e850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2e860 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
2e870 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20 61  ate. .**.** In a
2e880 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61 76  ny case, all sav
2e890 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e 20  epoints with an 
2e8a0 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
2e8b0 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a  an iSavepoint .*
2e8c0 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64 2e  * are destroyed.
2e8d0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65   If this is a re
2e8e0 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  lease operation 
2e8f0 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  (op==SAVEPOINT_R
2e900 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65 6e  ELEASE),.** then
2e910 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76 65   savepoint iSave
2e920 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64 65  point is also de
2e930 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  stroyed..**.** T
2e940 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
2e950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2e960 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72 79  OMEM if a memory
2e970 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
2e980 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20 65  s,.** or an IO e
2e990 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
2e9a0 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2e9b0 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62 61  while rolling ba
2e9c0 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f 69  ck a .** savepoi
2e9d0 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 73  nt. If no errors
2e9e0 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f   occur, SQLITE_O
2e9f0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
2ea00 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  / .int sqlite3Pa
2ea10 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61 67  gerSavepoint(Pag
2ea20 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2ea30 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
2ea40 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
2ea50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2ea60 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
2ea70 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
2ea80 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2ea90 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  LBACK );.  asser
2eaa0 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
2eab0 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
2eac0 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20  T_ROLLBACK );.. 
2ead0 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
2eae0 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2eaf0 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69  nt ){.    int ii
2eb00 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2eb10 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2eb20 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e 65  e */.    int nNe
2eb30 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  w;          /* N
2eb40 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e 69  umber of remaini
2eb50 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61 66  ng savepoints af
2eb60 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f 0a  ter this op. */.
2eb70 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
2eb80 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76 65  ut how many save
2eb90 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69 6c  points will stil
2eba0 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74 65  l be active afte
2ebb0 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f 70  r this.    ** op
2ebc0 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20 74  eration. Store t
2ebd0 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e 65  his value in nNe
2ebe0 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65 73  w. Then free res
2ebf0 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74 65  ources associate
2ec00 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 61  d .    ** with a
2ec10 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68  ny savepoints th
2ec20 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  at are destroyed
2ec30 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
2ec40 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  on..    */.    n
2ec50 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e 74  New = iSavepoint
2ec60 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   + (op==SAVEPOIN
2ec70 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
2ec80 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69 69   for(ii=nNew; ii
2ec90 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2eca0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
2ecb0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2ecc0 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61  estroy(pPager->a
2ecd0 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49  Savepoint[ii].pI
2ece0 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  nSavepoint);.   
2ecf0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e   }.    pPager->n
2ed00 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65 77  Savepoint = nNew
2ed10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
2ed20 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s is a rollback 
2ed30 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79 62  operation, playb
2ed40 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69 65  ack the specifie
2ed50 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20 20  d savepoint..   
2ed60 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
2ed70 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20 69   temp-file, it i
2ed80 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
2ed90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2eda0 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20   has.    ** not 
2edb0 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
2edc0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2edd0 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
2ede0 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20 20   changes to.    
2edf0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
2ee00 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c 61  file, so the pla
2ee10 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  yback operation 
2ee20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a  can be skipped..
2ee30 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
2ee40 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
2ee50 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e 28  LBACK && isOpen(
2ee60 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a  pPager->jfd) ){.
2ee70 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70        PagerSavep
2ee80 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e 74  oint *pSavepoint
2ee90 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26   = (nNew==0)?0:&
2eea0 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2eeb0 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
2eec0 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
2eed0 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
2eee0 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
2eef0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ef00 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
2ef10 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
2ef20 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
2ef30 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75  elease of the ou
2ef40 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e  termost savepoin
2ef50 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20  t, truncate .   
2ef60 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72   ** the sub-jour
2ef70 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74 65  nal to zero byte
2ef80 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20  s in size. */.  
2ef90 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26 26    if( nNew==0 &&
2efa0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
2efb0 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65 6e  ELEASE && isOpen
2efc0 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
2efd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2efe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2eff0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2f000 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
2f010 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b 0a  ager->sjfd, 0);.
2f020 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53        pPager->nS
2f030 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 7d  ubRec = 0;.    }
2f040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2f050 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2f060 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
2f070 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2f080 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
2f090 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2f0a0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
2f0b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f0c0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2f0d0 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
2f0e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56 46  ** Return the VF
2f0f0 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  S structure for 
2f100 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f  the pager..*/.co
2f110 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73 20  nst sqlite3_vfs 
2f120 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73  *sqlite3PagerVfs
2f130 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2f140 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2f150 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pVfs;.}../*.**
2f160 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
2f170 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20   handle for the 
2f180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
2f190 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68  sociated.** with
2f1a0 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
2f1b0 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 4e  s might return N
2f1c0 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65 20  ULL if the file 
2f1d0 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62  has.** not yet b
2f1e0 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  een opened..*/.s
2f1f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c  qlite3_file *sql
2f200 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50 61  ite3PagerFile(Pa
2f210 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2f220 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
2f230 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  d;.}../*.** Retu
2f240 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
2f250 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
2f260 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
2f270 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2f280 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
2f290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2f2a0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2f2b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
2f2c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2f2d0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
2f2e0 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
2f2f0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
2f300 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
2f310 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
2f320 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
2f330 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2f340 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
2f350 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2f360 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
2f370 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
2f380 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2f390 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
2f3a0 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
2f3b0 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
2f3c0 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
2f3d0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
2f3e0 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
2f3f0 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
2f400 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
2f410 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
2f420 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
2f430 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
2f440 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
2f450 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
2f460 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2f470 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2f480 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
2f490 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
2f4a0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
2f4b0 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
2f4c0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
2f4d0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
2f4e0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
2f4f0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
2f500 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
2f510 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
2f520 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
2f530 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
2f540 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
2f550 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
2f560 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
2f570 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
2f580 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
2f590 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
2f5a0 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
2f5b0 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
2f5c0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
2f5d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
2f5e0 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
2f5f0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
2f600 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
2f610 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
2f620 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
2f630 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
2f640 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
2f650 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
2f660 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
2f670 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2f680 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2f690 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
2f6a0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
2f6b0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
2f6c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2f6d0 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
2f6e0 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
2f6f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
2f700 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
2f710 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
2f720 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
2f730 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
2f740 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
2f750 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
2f760 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
2f770 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
2f780 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
2f790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2f7a0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
2f7b0 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
2f7c0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
2f7d0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
2f7e0 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
2f7f0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
2f800 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
2f810 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
2f820 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
2f830 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
2f840 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
2f850 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
2f860 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2f870 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
2f880 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
2f890 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
2f8a0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
2f8b0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
2f8c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f8d0 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  on may return SQ
2f8e0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e  LITE_NOMEM or an
2f8f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2f900 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63  f an error.** oc
2f910 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  curs. Otherwise,
2f920 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
2f930 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
2f940 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
2f950 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
2f960 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
2f970 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73  gno pgno, int is
2f980 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72  Commit){.  PgHdr
2f990 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20   *pPgOld;       
2f9a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2f9b0 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
2f9c0 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f  itten. */.  Pgno
2f9d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
2f9e0 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20  0;       /* Old 
2f9f0 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67  value of pPg->pg
2fa00 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72  no, if sync is r
2fa10 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74  equired */.  int
2fa20 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2fa30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2fa40 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67  urn code */.  Pg
2fa50 6e 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20  no origPgno;    
2fa60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fa70 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
2fa80 6e 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73  number */..  ass
2fa90 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
2faa0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2fab0 20 70 61 67 65 20 62 65 69 6e 67 20 6d 6f 76 65   page being move
2fac0 64 20 69 73 20 64 69 72 74 79 20 61 6e 64 20 68  d is dirty and h
2fad0 61 73 20 6e 6f 74 20 62 65 65 6e 20 73 61 76 65  as not been save
2fae0 64 20 62 79 20 74 68 65 20 6c 61 74 65 73 74 0a  d by the latest.
2faf0 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20    ** savepoint, 
2fb00 74 68 65 6e 20 73 61 76 65 20 74 68 65 20 63 75  then save the cu
2fb10 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
2fb20 66 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  f the page into 
2fb30 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
2fb40 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20  urnal now. This 
2fb50 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 68  is required to h
2fb60 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77  andle the follow
2fb70 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20  ing scenario:.  
2fb80 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b  **.  **   BEGIN;
2fb90 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e  .  **     <journ
2fba0 61 6c 20 70 61 67 65 20 58 2c 20 74 68 65 6e 20  al page X, then 
2fbb0 6d 6f 64 69 66 79 20 69 74 20 69 6e 20 6d 65 6d  modify it in mem
2fbc0 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41  ory>.  **     SA
2fbd0 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a  VEPOINT one;.  *
2fbe0 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65 20 70 61  *       <Move pa
2fbf0 67 65 20 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  ge X to location
2fc00 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c   Y>.  **     ROL
2fc10 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20  LBACK TO one;.  
2fc20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61 67 65 20  **.  ** If page 
2fc30 58 20 77 65 72 65 20 6e 6f 74 20 77 72 69 74 74  X were not writt
2fc40 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
2fc50 75 72 6e 61 6c 20 68 65 72 65 2c 20 69 74 20 77  urnal here, it w
2fc60 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
2fc70 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 73   possible to res
2fc80 74 6f 72 65 20 69 74 73 20 63 6f 6e 74 65 6e 74  tore its content
2fc90 73 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c  s when the "ROLL
2fca0 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a  BACK TO one".  *
2fcb0 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 72 65  * statement were
2fcc0 20 69 73 20 70 72 6f 63 65 73 73 65 64 2e 0a 20   is processed.. 
2fcd0 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72   **.  ** subjour
2fce0 6e 61 6c 50 61 67 65 28 29 20 6d 61 79 20 6e 65  nalPage() may ne
2fcf0 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
2fd00 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 70 50  pace to store pP
2fd10 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a  g->pgno into.  *
2fd20 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61  * one or more sa
2fd30 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 2e  vepoint bitvecs.
2fd40 20 54 68 69 73 20 69 73 20 74 68 65 20 72 65 61   This is the rea
2fd50 73 6f 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  son this functio
2fd60 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72  n.  ** may retur
2fd70 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  n SQLITE_NOMEM..
2fd80 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
2fd90 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
2fda0 59 20 0a 20 20 20 26 26 20 73 75 62 6a 52 65 71  Y .   && subjReq
2fdb0 75 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20  uiresPage(pPg). 
2fdc0 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
2fdd0 28 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c  (rc = subjournal
2fde0 50 61 67 65 28 70 50 67 29 29 0a 20 20 29 7b 0a  Page(pPg)).  ){.
2fdf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fe00 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
2fe10 28 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  (("MOVE %d page 
2fe20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
2fe30 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
2fe40 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
2fe50 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
2fe60 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  no, (pPg->flags&
2fe70 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2fe80 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ?1:0, pgno));.  
2fe90 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
2fea0 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
2feb0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
2fec0 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74  gno))..  /* If t
2fed0 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
2fee0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
2fef0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
2ff00 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
2ff10 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
2ff20 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
2ff30 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
2ff40 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
2ff50 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
2ff60 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
2ff70 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
2ff80 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
2ff90 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
2ffa0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
2ffb0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
2ffc0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
2ffd0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
2ffe0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
2fff0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
30000 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
30010 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
30020 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
30030 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
30040 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
30050 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
30060 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
30070 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
30080 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
30090 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
300a0 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
300b0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
300c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
300d0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
300e0 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
300f0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
30100 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
30110 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
30120 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
30130 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
30140 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
30150 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
30160 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
30170 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
30180 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
30190 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
301a0 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
301b0 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
301c0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
301d0 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
301e0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
301f0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
30200 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
30210 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
30220 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
30230 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
30240 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
30250 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
30260 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
30270 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
30280 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
30290 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
302a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
302b0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
302c0 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20  Drop(pPgOld);.  
302d0 7d 0a 0a 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20  }..  origPgno = 
302e0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c  pPg->pgno;.  sql
302f0 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28 70  ite3PcacheMove(p
30300 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c  Pg, pgno);.  sql
30310 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
30320 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
30330 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
30340 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
30350 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
30360 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
30370 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
30380 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
30390 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
303a0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
303b0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
303c0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
303d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
303e0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
303f0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
30400 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
30410 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
30420 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
30430 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
30440 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
30450 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
30460 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
30470 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
30480 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
30490 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
304a0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
304b0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
304c0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
304d0 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
304e0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
304f0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
30500 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
30510 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
30520 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
30530 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
30540 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
30550 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
30560 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
30570 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
30580 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
30590 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
305a0 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
305b0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
305c0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
305d0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
305e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
305f0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
30600 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
30610 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
30620 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
30630 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
30640 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
30650 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
30660 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
30670 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
30680 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
30690 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
306a0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
306b0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
306c0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
306d0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
306e0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
306f0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
30700 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
30710 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
30720 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
30730 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30740 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
30750 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
30760 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
30770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30780 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
30790 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
307a0 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e  l && needSyncPgn
307b0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
307c0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
307d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
307e0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
307f0 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
30800 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Pgno);.      }. 
30810 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30820 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
30830 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
30840 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
30850 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
30860 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
30870 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
30880 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
30890 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
308a0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
308b0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
308c0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
308d0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  r);.  }..  /*.  
308e0 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
308f0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61  ory database, ma
30900 6b 65 20 73 75 72 65 20 74 68 65 20 6f 72 69 67  ke sure the orig
30910 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e  inal page contin
30920 75 65 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73  ues.  ** to exis
30930 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  t, in case the t
30940 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
30950 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20   to roll back.  
30960 57 65 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  We allocate.  **
30970 20 74 68 65 20 70 61 67 65 20 6e 6f 77 2c 20 69   the page now, i
30980 6e 73 74 65 61 64 20 6f 66 20 61 74 20 72 6f 6c  nstead of at rol
30990 6c 62 61 63 6b 2c 20 62 65 63 61 75 73 65 20 77  lback, because w
309a0 65 20 63 61 6e 20 62 65 74 74 65 72 20 64 65 61  e can better dea
309b0 6c 0a 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 6f  l.  ** with an o
309c0 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72  ut-of-memory err
309d0 6f 72 20 6e 6f 77 2e 20 20 54 69 63 6b 65 74 20  or now.  Ticket 
309e0 23 33 37 36 31 2e 0a 20 20 2a 2f 0a 20 20 69 66  #3761..  */.  if
309f0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 44  ( MEMDB ){.    D
30a00 62 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  bPage *pNew;.   
30a10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30a20 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
30a30 2c 20 6f 72 69 67 50 67 6e 6f 2c 20 26 70 4e 65  , origPgno, &pNe
30a40 77 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  w, 1);.    if( r
30a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
30a60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71  eturn rc;.    sq
30a70 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30a80 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  pNew);.  }..  re
30a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30aa0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
30ab0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
30ac0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
30ad0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
30ae0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
30af0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
30b00 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
30b10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
30b20 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50  Ref>0 || pPg->pP
30b30 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20  ager->memDb );. 
30b40 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61   return pPg->pDa
30b50 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ta;.}../*.** Ret
30b60 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
30b70 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
30b80 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
30b90 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
30ba0 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
30bb0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
30bc0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
30bd0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
30be0 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
30bf0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
30c00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
30c10 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
30c20 72 3f 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29  r?pPg->pExtra:0)
30c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
30c40 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
30c50 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
30c60 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
30c70 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
30c80 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
30c90 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
30ca0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30cb0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
30cc0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30cd0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
30ce0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
30cf0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
30d00 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
30d10 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
30d20 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
30d30 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
30d40 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
30d50 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
30d60 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
30d70 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
30d80 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
30d90 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
30da0 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
30db0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
30dc0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
30dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
30de0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
30df0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
30e00 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
30e10 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
30e20 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
30e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
30e40 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
30e50 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
30e60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
30e70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
30e80 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
30e90 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
30ea0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
30eb0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
30ec0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
30ed0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
30ee0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
30ef0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
30f00 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
30f10 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
30f20 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
30f30 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
30f40 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  iveMode = (u8)eM
30f50 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
30f60 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
30f70 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
30f80 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74  ./*.** Get/set t
30f90 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20  he journal-mode 
30fa0 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
30fb0 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
30fc0 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a  must be one of:.
30fd0 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a  **.**    PAGER_J
30fe0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
30ff0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31000 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a  RNALMODE_DELETE.
31010 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
31020 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
31030 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31040 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
31050 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
31060 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20  RNALMODE_OFF.** 
31070 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
31080 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a  MODE_MEMORY.**.*
31090 2a 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  * If the paramet
310a0 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
310b0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
310c0 61 6c 5f 6d 6f 64 65 20 69 73 20 73 65 74 20 74  al_mode is set t
310d0 6f 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  o the.** value s
310e0 70 65 63 69 66 69 65 64 20 69 66 20 74 68 65 20  pecified if the 
310f0 63 68 61 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65  change is allowe
31100 64 2e 20 20 54 68 65 20 63 68 61 6e 67 65 20 69  d.  The change i
31110 73 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s disallowed.** 
31120 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
31130 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  g reasons:.**.**
31140 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f     *  An in-memo
31150 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  ry database can 
31160 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f  only have its jo
31170 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74  urnal_mode set t
31180 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f  o _OFF.**      o
31190 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  r _MEMORY..**.**
311a0 20 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61     *  The journa
311b0 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62  l mode may not b
311c0 65 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20  e changed while 
311d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
311e0 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54   active..**.** T
311f0 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69  he returned indi
31200 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  cate the current
31210 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
31220 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ed) journal-mode
31230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
31240 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
31250 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
31260 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
31270 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
31280 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
31290 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
312a0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
312b0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
312c0 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ETE.            
312d0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
312e0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
312f0 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
31300 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31310 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
31320 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20  SIST.           
31330 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
31340 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
31350 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
31360 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
31370 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
31380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
31390 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
313a0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 69 66 28  QUERY<0 );.  if(
313b0 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26 26 20   eMode>=0.   && 
313c0 28 21 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65  (!MEMDB || eMode
313d0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
313e0 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
313f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
31400 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
31410 4c 4d 4f 44 45 5f 4f 46 46 29 0a 20 20 20 26 26  LMODE_OFF).   &&
31420 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
31430 66 69 65 64 0a 20 20 20 26 26 20 28 21 69 73 4f  fied.   && (!isO
31440 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
31450 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a   || 0==pPager->j
31460 6f 75 72 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a  ournalOff).  ){.
31470 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
31480 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
31490 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
314a0 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
314b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
314c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
314d0 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
314e0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
314f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
31500 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
31510 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
31520 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
31530 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
31540 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  files..**.** Set
31550 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69  ting the size li
31560 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20  mit to -1 means 
31570 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f  no limit is enfo
31580 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65  rced..** An atte
31590 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d  mpt to set a lim
315a0 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  it smaller than 
315b0 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  -1 is a no-op..*
315c0 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
315d0 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
315e0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
315f0 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
31600 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
31610 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
31620 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
31630 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
31640 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
31650 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
31660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
31670 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31680 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e pPager->pBacku
31690 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
316a0 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a  backup module.**
316b0 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69   in backup.c mai
316c0 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
316d0 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61  nt of this varia
316e0 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65  ble. This module
316f0 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71  .** uses it opaq
31700 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d  uely as an argum
31710 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61  ent to sqlite3Ba
31720 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e  ckupRestart() an
31730 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b  d.** sqlite3Back
31740 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e  upUpdate() only.
31750 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b  .*/.sqlite3_back
31760 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65  up **sqlite3Page
31770 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72  rBackupPtr(Pager
31780 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
31790 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61  urn &pPager->pBa
317a0 63 6b 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  ckup;.}..#endif 
317b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
317c0 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.