/ Hex Artifact Content
Login

Artifact b99d1e9f9c971cf42f4c7ede17117f238e9b9c2b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 35  : pager.c,v 1.55
0350: 33 20 32 30 30 39 2f 30 31 2f 31 36 20 31 36 3a  3 2009/01/16 16:
0360: 32 33 3a 33 38 20 64 61 6e 69 65 6c 6b 31 39 37  23: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 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
1330: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
1340: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
1350: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
1360: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
1370: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1380: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
13a0: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13b0: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
13c0: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
13d0: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
13e0: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
13f0: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1400: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1410: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
1420: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
1450: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
1460: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1480: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1490: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
14a0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
14b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
14c0: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
14d0: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
14e0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
14f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1500: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1510: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
1520: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1530: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
1540: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
1550: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
1560: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
1570: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1580: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1590: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
15a0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
15b0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
15c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
15f0: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1600: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1610: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1620: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
1630: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1640: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
1650: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
1660: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
1670: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1680: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1690: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
16a0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
16b0: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
16c0: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
16d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
16e0: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
16f0: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1700: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1710: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
1720: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
1730: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
1760: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
1770: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1780: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1790: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
17a0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
17b0: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
17c0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
17d0: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
17e0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
17f0: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1810: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
1820: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
1830: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1850: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
1860: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
1870: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1880: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1890: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
18a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
18c0: 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72 43  **.** Pager.errC
18d0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18e0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
18f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1900: 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  or.** or SQLITE_
1910: 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f  FULL. Once one o
1920: 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  f the first thre
1930: 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73 2c  e errors occurs,
1940: 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a 20   it persists.** 
1950: 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 20  and is returned 
1960: 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  as the result of
1970: 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61 67   every major pag
1980: 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54 68  er API call.  Th
1990: 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  e.** SQLITE_FULL
19a0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20   return code is 
19b0: 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72 65  slightly differe
19c0: 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73 20  nt. It persists 
19d0: 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a  only until the.*
19e0: 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75  * next successfu
19f0: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
1a00: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
1a10: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
1a20: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
1a30: 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63 74   does not affect
1a40: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1a50: 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  rGet() and sqlit
1a60: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a  e3PagerLookup().
1a70: 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d 61  ** APIs, they ma
1a80: 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64 20  y still be used 
1a90: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a  successfully..**
1aa0: 0a 2a 2a 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  .** Managing the
1ab0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ac0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1ad0: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1ae0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1af0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1b00: 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61 69  er.dbSize contai
1b10: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
1b20: 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65 20   pages that the 
1b30: 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6d 61 67  database.** imag
1b40: 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74  e currently cont
1b50: 61 69 6e 73 2e 20 41 73 20 74 68 65 20 64 61 74  ains. As the dat
1b60: 61 62 61 73 65 20 69 6d 61 67 65 20 67 72 6f 77  abase image grow
1b70: 73 20 6f 72 20 73 68 72 69 6e 6b 73 20 74 68 69  s or shrinks thi
1b80: 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73  s.** variable is
1b90: 20 75 70 64 61 74 65 64 2e 20 54 68 65 20 76 61   updated. The va
1ba0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46  riable Pager.dbF
1bb0: 69 6c 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73  ileSize contains
1bc0: 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1bd0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1be0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bf0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1c00: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1c10: 62 53 69 7a 65 0a 2a 2a 20 69 66 20 73 6f 6d 65  bSize.** if some
1c20: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
1c30: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
1c40: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1c50: 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72 69 74  but not yet writ
1c60: 74 65 6e 0a 2a 2a 20 6f 75 74 20 66 72 6f 6d 20  ten.** out from 
1c70: 74 68 65 20 63 61 63 68 65 20 74 6f 20 74 68 65  the cache to the
1c80: 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6f 6e 20   actual file on 
1c90: 64 69 73 6b 2e 20 4f 72 20 69 66 20 74 68 65 20  disk. Or if the 
1ca0: 69 6d 61 67 65 20 68 61 73 20 62 65 65 6e 0a 2a  image has been.*
1cb0: 2a 20 74 72 75 6e 63 61 74 65 64 20 62 79 20 61  * truncated by a
1cc0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1cd0: 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cuum operation. 
1ce0: 54 68 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67  The Pager.dbOrig
1cf0: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a  Size variable.**
1d00: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d10: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d30: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1d40: 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
1d50: 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20  ion was opened. 
1d60: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
1d70: 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68 65  all three of the
1d80: 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73 0a  se variables is.
1d90: 2a 2a 20 6f 6e 6c 79 20 67 75 61 72 61 6e 74 65  ** only guarante
1da0: 65 64 20 74 6f 20 62 65 20 63 6f 72 72 65 63 74  ed to be correct
1db0: 20 69 66 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   if the boolean 
1dc0: 50 61 67 65 72 2e 64 62 53 69 7a 65 56 61 6c 69  Pager.dbSizeVali
1dd0: 64 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  d is true..*/.st
1de0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
1df0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1e00: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
1e10: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
1e20: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
1e30: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
1e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1e50: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
1e60: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
1e70: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
1e80: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
1e90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ea0: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
1eb0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
1ec0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
1ed0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ee0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
1ef0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
1f00: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
1f10: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1f30: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
1f40: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
1f50: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f70: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
1f80: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
1f90: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
1fa0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1fb0: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
1fc0: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
1fd0: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
1fe0: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
1ff0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2000: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
2010: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
2020: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
2030: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2040: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2050: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2060: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2070: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2080: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2090: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
20a0: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
20b0: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
20c0: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
20d0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
20e0: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
20f0: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2100: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2110: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2120: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2130: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2140: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2150: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2160: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2170: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
2180: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
2190: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
21c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
21d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2200: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2210: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2220: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2240: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2250: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2260: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2270: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2280: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2290: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
22a0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
22b0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
22c0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20   journalMode;   
22d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20            /* On 
22e0: 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55  of the PAGER_JOU
22f0: 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65  RNALMODE_* value
2300: 73 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69  s */.  u8 dbModi
2310: 66 69 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  fied;           
2320: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2330: 65 72 65 20 61 72 65 20 61 6e 79 20 63 68 61 6e  ere are any chan
2340: 67 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a 2f  ges to the Db */
2350: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
2360: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
2370: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
2380: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
2390: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
23a0: 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b   u8 dbSizeValid;
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c0: 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20  Set when dbSize 
23d0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20  is correct */.  
23e0: 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20 20 20  Pgno dbSize;    
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2400: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
2420: 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69 67 53  /.  Pgno dbOrigS
2430: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2440: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
2450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2460: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 50 67  nsaction */.  Pg
2470: 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b 20 20  no dbFileSize;  
2480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2490: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
24a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24b0: 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c  e */.  u32 vfsFl
24c0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
24d0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
24e0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
24f0: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  n() */.  int err
2500: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
2510: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2520: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2530: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
2540: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
2550: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2560: 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74  r of pages writt
2570: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
2580: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
2590: 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  Init;           
25a0: 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64     /* Quasi-rand
25b0: 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74  om value added t
25c0: 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d  o every checksum
25d0: 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52   */.  int stmtNR
25e0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
25f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
2600: 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73  ecords in stmt s
2610: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
2620: 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20  nt nExtra;      
2630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
2640: 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
2650: 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  s to each in-mem
2660: 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
2670: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2690: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
26a0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
26b0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
26c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
26d0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
26e0: 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  mory pages */.  
26f0: 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20  int mxPage;     
2700: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2710: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
2720: 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69   pages to hold i
2730: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  n cache */.  Pgn
2740: 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20  o mxPgno;       
2750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2760: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65  mum allowed size
2770: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2780: 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 49   */.  Bitvec *pI
2790: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
27a0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72    /* One bit for
27b0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
27c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
27d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c  */.  Bitvec *pAl
27e0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
27f0: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
2800: 65 61 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64  each page marked
2810: 20 61 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b   always-rollback
2820: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
2830: 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2860: 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  /.  char *zJourn
2870: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2880: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a  /* Name of the j
2890: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
28a0: 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72   char *zDirector
28b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
28c0: 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64  Directory hold d
28d0: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
28e0: 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73  nal files */.  s
28f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
2900: 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69   *jfd;     /* Fi
2910: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
2920: 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  or database and 
2930: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c  journal */.  sql
2940: 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b  ite3_file *sjfd;
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2960: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2970: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2a  the sub-journal*
2980: 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48  /.  int (*xBusyH
2990: 61 6e 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20  andler)(void*); 
29a0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63  /* Function to c
29b0: 61 6c 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f  all when busy */
29c0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
29d0: 6e 64 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f  ndlerArg;      /
29e0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65  * Context argume
29f0: 6e 74 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64  nt for xBusyHand
2a00: 6c 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ler */.  i64 jou
2a10: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
2a20: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a30: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
2a40: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a50: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2a60: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2a70: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
2a80: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
2a90: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
2aa0: 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b 20  u32 sectorSize; 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2ac0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
2ad0: 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ze during rollba
2ae0: 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ck */.#ifdef SQL
2af0: 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e  ITE_TEST.  int n
2b00: 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20  Hit, nMiss;     
2b10: 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20         /* Cache 
2b20: 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67  hits and missing
2b30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c   */.  int nRead,
2b40: 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   nWrite;        
2b50: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61    /* Database pa
2b60: 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e  ges read/written
2b70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69   */.#endif.  voi
2b80: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
2b90: 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c  bPage*); /* Call
2ba0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
2bb0: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
2bc0: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
2bd0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
2be0: 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
2bf0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2c00: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2c10: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2c20: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2c30: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2c40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2c50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2c60: 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  dec() */.#endif.
2c70: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
2c80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2c90: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
2ca0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
2cb0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
2cc0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
2cd0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
2ce0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
2d00: 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a  anges */.  i64 j
2d10: 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
2d20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c         /* Size l
2d30: 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74  imit for persist
2d40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ent journal file
2d50: 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a 70  s */.  PCache *p
2d60: 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20 20  PCache;         
2d70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d80: 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a 65   page cache obje
2d90: 63 74 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76  ct */.  PagerSav
2da0: 65 70 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69  epoint *aSavepoi
2db0: 6e 74 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  nt; /* Array of 
2dc0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
2dd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65  s */.  int nSave
2de0: 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  point;          
2df0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e00: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76  elements in aSav
2e10: 65 70 6f 69 6e 74 5b 5d 20 2a 2f 0a 7d 3b 0a 0a  epoint[] */.};..
2e20: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2e30: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
2e40: 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65  bles hold counte
2e50: 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  rs used for.** t
2e60: 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 20  esting purposes 
2e70: 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61 72  only.  These var
2e80: 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78  iables do not ex
2e90: 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d  ist in.** a non-
2ea0: 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20 20  testing build.  
2eb0: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
2ec0: 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d 73  are not thread-s
2ed0: 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  afe..*/.#ifdef S
2ee0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
2ef0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
2f00: 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ddb_count = 0;  
2f10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
2f20: 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20 66  ull pages read f
2f30: 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71  rom DB */.int sq
2f40: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2f50: 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  edb_count = 0;  
2f60: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75   /* Number of fu
2f70: 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ll pages written
2f80: 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71   to DB */.int sq
2f90: 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2fa0: 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20  ej_count = 0;   
2fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2fc0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  ges written to j
2fd0: 6f 75 72 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69  ournal */.# defi
2fe0: 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29  ne PAGER_INCR(v)
2ff0: 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65    v++.#else.# de
3000: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3010: 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  v).#endif..../*.
3020: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
3030: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
3040: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
3050: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
3060: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
3070: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
3080: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
3090: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
30a0: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
30b0: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
30c0: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
30d0: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
30e0: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
30f0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
3100: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
3110: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
3120: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
3130: 69 73 20 62 65 69 6e 67 0a 2a 2a 20 77 72 69 74  is being.** writ
3140: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
3150: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
3160: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
3170: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
3180: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
3190: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
31a0: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
31b0: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
31c0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
31d0: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
31e0: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
31f0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3200: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3210: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3220: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3230: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
3240: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
3250: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
3260: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
3270: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
3280: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
3290: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
32a0: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
32b0: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
32c0: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
32d0: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
32e0: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
32f0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3300: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3310: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3320: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
3330: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
3340: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
3350: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
3360: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
3370: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
3380: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3390: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
33a0: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
33b0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
33c0: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
33d0: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
33e0: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
33f0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3400: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3410: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3420: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3430: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
3440: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
3450: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
3460: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
3470: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
3480: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
3490: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
34a0: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
34b0: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
34c0: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
34d0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
34e0: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
34f0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3500: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3510: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3520: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3530: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3540: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
3550: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
3560: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
3570: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
3580: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
3590: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
35a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
35b0: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
35c0: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
35d0: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
35e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
35f0: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
3600: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
3610: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
3620: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
3630: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
3640: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
3650: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
3660: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
3670: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
3680: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
3690: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
36a0: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
36b0: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
36c0: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
36d0: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
36e0: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
36f0: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
3700: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
3710: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
3720: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
3730: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
3740: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
3750: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
3760: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
3770: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
3780: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
3790: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
37a0: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
37b0: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
37c0: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
37d0: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
37e0: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
37f0: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
3800: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
3810: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
3820: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
3830: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
3840: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
3850: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3860: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
3870: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
3880: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
3890: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
38a0: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
38b0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
38c0: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
38d0: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
38e0: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
38f0: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
3900: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
3910: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
3920: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
3930: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
3940: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
3950: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
3960: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
3970: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
3980: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
3990: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
39a0: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
39b0: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
39c0: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
39d0: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
39e0: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
39f0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
3a00: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
3a10: 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50  .*/./* #define P
3a20: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3a30: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
3a40: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20 2a  x)->pageSize)) *
3a50: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3a60: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 67 6e  MJ_PGNO(x) ((Pgn
3a70: 6f 29 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  o)((PENDING_BYTE
3a80: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
3a90: 29 2b 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  )+1))../*.** The
3aa0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
3ab0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
3ac0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
3ad0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
3ae0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
3af0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3b00: 65 20 69 66 20 69 74 20 69 73 20 6e 65 63 65 73  e if it is neces
3b10: 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 70 61  sary to write pa
3b20: 67 65 20 2a 70 50 67 20 69 6e 74 6f 20 74 68 65  ge *pPg into the
3b30: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   sub-journal..**
3b40: 20 41 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f   A page needs to
3b50: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
3b60: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
3b70: 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
3b80: 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f 72 65 20   one.** or more 
3b90: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
3ba0: 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a 0a 2a 2a  for which:.**.**
3bb0: 20 20 20 2a 20 54 68 65 20 70 61 67 65 2d 6e 75     * The page-nu
3bc0: 6d 62 65 72 20 69 73 20 6c 65 73 73 20 74 68 61  mber is less tha
3bd0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 50 61  n or equal to Pa
3be0: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72  gerSavepoint.nOr
3bf0: 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54  ig, and.**   * T
3c00: 68 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  he bit correspon
3c10: 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65  ding to the page
3c20: 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f 74 20 73  -number is not s
3c30: 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20 50 61 67  et in.**     Pag
3c40: 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
3c50: 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  avepoint..*/.sta
3c60: 74 69 63 20 69 6e 74 20 73 75 62 6a 52 65 71 75  tic int subjRequ
3c70: 69 72 65 73 50 61 67 65 28 50 67 48 64 72 20 2a  iresPage(PgHdr *
3c80: 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  pPg){.  Pgno pgn
3c90: 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
3ca0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
3cb0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
3cc0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
3cd0: 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  ; i<pPager->nSav
3ce0: 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  epoint; i++){.  
3cf0: 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
3d00: 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d 3e 61   *p = &pPager->a
3d10: 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b 0a 20 20  Savepoint[i];.  
3d20: 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69 67 3e 3d    if( p->nOrig>=
3d30: 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71 6c 69 74  pgno && 0==sqlit
3d40: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e  e3BitvecTest(p->
3d50: 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 67  pInSavepoint, pg
3d60: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  no) ){.      ret
3d70: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3d80: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3d90: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
3da0: 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
3db0: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
3dc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
3dd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3de0: 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64 72 20  InJournal(PgHdr 
3df0: 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
3e00: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
3e10: 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  t(pPg->pPager->p
3e20: 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
3e30: 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pgno);.}../*.** 
3e40: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
3e50: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
3e60: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
3e70: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
3e80: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
3e90: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
3ea0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
3eb0: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
3ec0: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
3ed0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
3ee0: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
3ef0: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
3f00: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
3f10: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
3f20: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
3f30: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
3f40: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
3f50: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
3f60: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
3f70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
3f80: 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  [4];.  int rc = 
3f90: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
3fa0: 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29  , ac, sizeof(ac)
3fb0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28  , offset);.  if(
3fc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
3fd0: 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73 71  {.    *pRes = sq
3fe0: 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61 63  lite3Get4byte(ac
3ff0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4000: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4010: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4020: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4030: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4040: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4050: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75  r..*/.#define pu
4060: 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73 71  t32bits(A,B)  sq
4070: 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28 75  lite3Put4byte((u
4080: 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57  8*)A,B)../*.** W
4090: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
40a0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
40b0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
40c0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
40d0: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
40e0: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
40f0: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4100: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4110: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4120: 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74 65  ite32bits(sqlite
4130: 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
4140: 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c 29  offset, u32 val)
4150: 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  {.  char ac[4];.
4160: 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20    put32bits(ac, 
4170: 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  val);.  return s
4180: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64  qlite3OsWrite(fd
4190: 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74 29  , ac, 4, offset)
41a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ;.}../*.** If fi
41b0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
41c0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
41d0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
41e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
41f0: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
4200: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
4210: 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d 3e  k){.  if( !pFd->
4220: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
4230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4240: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
4250: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
4260: 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f  Fd, eLock);.}../
4270: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4280: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  on determines wh
4290: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
42a0: 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
42b0: 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61  timization.** ca
42c0: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 74  n be used with t
42d0: 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f  his pager. The o
42e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
42f0: 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a  be used if:.**.*
4300: 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75 65  *  (a) the value
4310: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44   returned by OsD
4320: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
4330: 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65 73  tics() indicates
4340: 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20   that.**      a 
4350: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 61  database page ma
4360: 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f  y be written ato
4370: 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20  mically, and.** 
4380: 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20 72   (b) the value r
4390: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63  eturned by OsSec
43a0: 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73  torSize() is les
43b0: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
43c0: 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 70  **      to the p
43d0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
43e0: 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
43f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  ion cannot be us
4400: 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ed, 0 is returne
4410: 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65 20  d. If it can be 
4420: 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  used,.** then th
4430: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
4440: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
4450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4460: 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74   when it.** cont
4470: 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61  ains rollback da
4480: 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20 6f  ta for exactly o
4490: 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64  ne page..*/.#ifd
44a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
44b0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74  _ATOMIC_WRITE.st
44c0: 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66  atic int jrnlBuf
44d0: 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  ferSize(Pager *p
44e0: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64 63  Pager){.  int dc
44f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
4500: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
4510: 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  stics */.  int n
4520: 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20  Sector;      /* 
4530: 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  Sector size */. 
4540: 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20   int szPage;    
4550: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
4560: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
4570: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
4580: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
4590: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
45a0: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
45b0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
45c0: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
45d0: 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e 73  ctor = pPager->s
45e0: 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 73  ectorSize;.    s
45f0: 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  zPage = pPager->
4600: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
4610: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
4620: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
4630: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
4640: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
4650: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
4660: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
4670: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
4680: 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20 28   .       (dc & (
4690: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
46a0: 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29  MIC|(szPage>>8))
46b0: 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50   && nSector<=szP
46c0: 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  age) ){.    retu
46d0: 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  rn JOURNAL_HDR_S
46e0: 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52  Z(pPager) + JOUR
46f0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
4700: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4710: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
4720: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
4730: 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
4740: 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  d when an error 
4750: 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
4760: 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e  e pager.** code.
4770: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
4780: 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
4790: 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74   to the pager st
47a0: 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20  ructure, the.** 
47b0: 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72  second the error
47c0: 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62  -code about to b
47d0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20  e returned by a 
47e0: 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69  pager API functi
47f0: 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75  on. .** The valu
4800: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20  e returned is a 
4810: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
4820: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
4830: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  his function. .*
4840: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f  *.** If the seco
4850: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
4860: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
4870: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20  ITE_CORRUPT, or 
4880: 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74  SQLITE_FULL.** t
4890: 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73  he error becomes
48a0: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74   persistent. Unt
48b0: 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  il the persisten
48c0: 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65   error is cleare
48d0: 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74  d,.** subsequent
48e0: 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68   API calls on th
48f0: 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d  is Pager will im
4900: 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e  mediately return
4910: 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72   the same .** er
4920: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
4930: 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72 72  A persistent err
4940: 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  or indicates tha
4950: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
4960: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4970: 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
4980: 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73 74  trusted. This st
4990: 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72  ate can be clear
49a0: 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79  ed by completely
49b0: 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20   discarding .** 
49c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
49d0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e  the pager-cache.
49e0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
49f0: 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68 65  n was active whe
4a00: 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74  n.** the persist
4a10: 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65  ent error occure
4a20: 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c  d, then the roll
4a30: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79  back journal may
4a40: 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72   need.** to be r
4a50: 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74  eplayed..*/.stat
4a60: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
4a70: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
4a80: 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  er);.static int 
4a90: 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65  pager_error(Page
4aa0: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72  r *pPager, int r
4ab0: 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  c){.  int rc2 = 
4ac0: 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73  rc & 0xff;.  ass
4ad0: 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61 67  ert(.       pPag
4ae0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
4af0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
4b00: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
4b10: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  de==SQLITE_OK ||
4b20: 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d  .       (pPager-
4b30: 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66 29  >errCode & 0xff)
4b40: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
4b50: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
4b60: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
4b70: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4b80: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
4b90: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
4ba0: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
4bb0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
4bc0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
4bd0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
4be0: 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73  NLOCK .     && s
4bf0: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43  qlite3PcacheRefC
4c00: 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
4c10: 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b  ache)==0 .    ){
4c20: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
4c30: 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61 64   pager is alread
4c40: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c  y unlocked, call
4c50: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20   pager_unlock() 
4c60: 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  now to.      ** 
4c70: 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
4c80: 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65  state and ensure
4c90: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 2d   that the pager-
4ca0: 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20 20  cache is .      
4cb0: 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  ** completely em
4cc0: 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  pty..      */.  
4cd0: 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
4ce0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
4cf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
4d10: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
4d20: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
4d30: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
4d40: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
4d50: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
4d60: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
4d70: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
4d80: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
4d90: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
4da0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
4db0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4dc0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
4dd0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
4de0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
4df0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
4e00: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
4e10: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
4e20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4e30: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
4e40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4e50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
4e60: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4e70: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
4e80: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
4e90: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
4ea0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4eb0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
4ec0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
4ed0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
4ee0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
4ef0: 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69  >pageSize, (unsi
4f00: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61 67  gned char *)pPag
4f10: 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61  e->pData);.}.sta
4f20: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 73  tic void pager_s
4f30: 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  et_pagehash(PgHd
4f40: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50 61  r *pPage){.  pPa
4f50: 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  ge->pageHash = p
4f60: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
4f70: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  age);.}../*.** T
4f80: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
4f90: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
4fa0: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
4fb0: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
4fc0: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
4fd0: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
4fe0: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
4ff0: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5000: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
5010: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
5020: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
5030: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
5040: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
5050: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
5060: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5070: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5080: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5090: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
50a0: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
50b0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
50c0: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
50d0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
50e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a  pPager->errCode.
50f0: 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66        || (pPg->f
5100: 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
5110: 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48 61  ) || pPg->pageHa
5120: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
5130: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
5140: 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65  lse.#define page
5150: 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20  r_datahash(X,Y) 
5160: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5170: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5180: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5190: 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a  GE(x).#endif  /*
51a0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
51b0: 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68  GES */../*.** Wh
51c0: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
51d0: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
51e0: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
51f0: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
5200: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
5210: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5220: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
5230: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
5240: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
5250: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73  en into memory s
5260: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 63  upplied by the c
5270: 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d  aller. .**.** zM
5280: 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e 74  aster must point
5290: 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20   to a buffer of 
52a0: 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65 72  at least nMaster
52b0: 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64   bytes allocated
52c0: 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65   by.** the calle
52d0: 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  r. This should b
52e0: 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  e sqlite3_vfs.mx
52f0: 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65  Pathname+1 (to e
5300: 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a 2a  nsure there is.*
5310: 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74  * enough space t
5320: 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73 74  o write the mast
5330: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29  er journal name)
5340: 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72 20  . If the master 
5350: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20  journal.** name 
5360: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
5370: 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d  s longer than nM
5380: 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e 63  aster bytes (inc
5390: 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d  luding a.** nul-
53a0: 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65  terminator), the
53b0: 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c 65  n this is handle
53c0: 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74 65  d as if no maste
53d0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a  r journal name.*
53e0: 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20 69  * were present i
53f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  n the journal..*
5400: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
5410: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5420: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 7a  ame is present z
5430: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5440: 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c   to 0 and.** SQL
5450: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5470: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5480: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5490: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
54a0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
54b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
54c0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
54d0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
54e0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
54f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
5500: 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e  signed loop coun
5510: 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ter */.  unsigne
5520: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
5530: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
5540: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
5550: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61  header */..  zMa
5560: 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a  ster[0] = '\0';.
5570: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5580: 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c  sFileSize(pJrnl,
5590: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
55a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
55b0: 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72  zJ<16 ) return r
55c0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
55d0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
55e0: 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66  -16, &len);.  if
55f0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5600: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5610: 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72  if( len>=nMaster
5620: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5630: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
5640: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
5650: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20  (pJrnl, szJ-12, 
5660: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
5670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
5680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
5690: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
56a0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
56b0: 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20  , szJ-8);.  if( 
56c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
56d0: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
56e0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38  aJournalMagic, 8
56f0: 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ) ) return rc;..
5700: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5710: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73  Read(pJrnl, zMas
5720: 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36  ter, len, szJ-16
5730: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5740: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5750: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5760: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
5770: 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65  = '\0';..  /* Se
5780: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5790: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
57a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
57b0: 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20  e */.  for(u=0; 
57c0: 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20  u<len; u++){.   
57d0: 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65   cksum -= zMaste
57e0: 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28  r[u];.   }.  if(
57f0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
5800: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
5810: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5820: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5830: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5840: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5850: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5860: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5870: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5880: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5890: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
58a0: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
58b0: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
58c0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
58d0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
58e0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
58f0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
5900: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c   zMaster[0] = '\
5910: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5940: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5950: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5960: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5970: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5980: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5990: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
59a0: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
59b0: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
59c0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
59d0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
59e0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
59f0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5a00: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5a10: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5a20: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5a30: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5a60: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5a70: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5a80: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5a90: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5aa0: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5ab0: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5ac0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
5ae0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
5af0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66  64 journalHdrOff
5b00: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
5b10: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5b20: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5b30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5b40: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5b50: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5b60: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5b70: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5b80: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5b90: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5ba0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5bb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5bc0: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5bd0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5be0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5bf0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5c00: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5c10: 0a 20 20 72 65 74 75 72 6e 20 6f 66 66 73 65 74  .  return offset
5c20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
5c30: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5c40: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
5c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
5c80: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a  }../*.** Write z
5c90: 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65  eros over the he
5ca0: 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
5cb0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
5cc0: 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63  has the.** effec
5cd0: 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e  t of invalidatin
5ce0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
5cf0: 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e  le and committin
5d00: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  g the.** transac
5d10: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5d20: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
5d30: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5d40: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
5d50: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
5d60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
5d70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
5d80: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
5d90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
5da0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
5db0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
5dc0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
5dd0: 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54  eLimit;..    IOT
5de0: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
5df0: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
5e00: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
5e10: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
5e20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5e30: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
5e40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
5e50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5e70: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
5e80: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
5e90: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
5ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
5eb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5ec0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
5ed0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5ee0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
5ef0: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
5f00: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
5f10: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
5f20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5f30: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
5f40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5f50: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
5f60: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
5f70: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
5f80: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
5f90: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
5fa0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
5fb0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
5fc0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
5fd0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
5fe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
5ff0: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
6000: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
6010: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
6020: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
6030: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
6040: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
6050: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
6060: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
6070: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
6080: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
6090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
60a0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
60b0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
60c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
60d0: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
60e0: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
60f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6100: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
6110: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
6120: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
6130: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
6140: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
6150: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
6160: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6170: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6180: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6190: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
61a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
61b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
61c0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
61d0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
61e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
61f0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
6200: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
6210: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
6220: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
6230: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
6240: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6250: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
6260: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
6270: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
6280: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
6290: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
62a0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
62b0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
62c0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
62d0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
62e0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
62f0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6300: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
6310: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6320: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6330: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6340: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6350: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6360: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
6370: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
6380: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
6390: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
63a0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
63b0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
63c0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
63d0: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
63e0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
63f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
6400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
6410: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
6420: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
6430: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
6440: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
6450: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 20  .  u32 nWrite;. 
6460: 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28 20   int ii;..  if( 
6470: 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f  nHeader>JOURNAL_
6480: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
6490: 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d 20  {.    nHeader = 
64a0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
64b0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Pager);.  }..  /
64c0: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  * If there are a
64d0: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
64e0: 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 6d   and any of them
64f0: 20 77 65 72 65 20 63 72 65 61 74 65 64 20 73 69   were created si
6500: 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f 73  nce the.  ** mos
6510: 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c  t recent journal
6520: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
6530: 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20  ten, update the 
6540: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
6550: 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65 6c  HdrOff.  ** fiel
6560: 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 66  ds now..  */.  f
6570: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
6580: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
6590: 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
65a0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
65b0: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
65c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
65d0: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
65e0: 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20 3d  ii].iHdrOffset =
65f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6600: 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Off;.    }.  }..
6610: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
6620: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
6630: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
6640: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6650: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
6660: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
6670: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6680: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
6690: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
66a0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
66b0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
66c0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
66d0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
66e0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
66f0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
6700: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
6710: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
6720: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
6730: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
6740: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
6750: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
6760: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
6770: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
6780: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
6790: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
67a0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
67b0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
67c0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
67d0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
67e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
67f0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
6800: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
6810: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
6820: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
6830: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
6840: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
6850: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
6860: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
6870: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
6880: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6890: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
68a0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
68b0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
68c0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
68d0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
68e0: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
68f0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
6900: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
6910: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
6920: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
6930: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
6940: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
6950: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
6960: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
6970: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
6980: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
6990: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
69a0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
69b0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
69c0: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
69d0: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
69e0: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
69f0: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
6a00: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
6a10: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
6a20: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
6a30: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
6a40: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
6a50: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
6a60: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
6a70: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
6a80: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
6a90: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
6aa0: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
6ab0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
6ac0: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
6ad0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
6ae0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
6af0: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
6b00: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
6b10: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
6b20: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
6b30: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
6b40: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
6b50: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6b60: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6b70: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
6b80: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
6b90: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6ba0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6bb0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
6bc0: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
6bd0: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6be0: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6bf0: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
6c00: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
6c10: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
6c20: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6c30: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
6c40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6c50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
6c60: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
6c70: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
6c80: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
6c90: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
6ca0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
6cb0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6cc0: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
6cd0: 4f 72 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  OrigSize);.  /* 
6ce0: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6cf0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6d00: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6d10: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6d20: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6d30: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6d40: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6d50: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
6d60: 69 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20  ing the tail of 
6d70: 74 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  the buffer is no
6d80: 74 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76  t necessary.  Ev
6d90: 65 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f  erything.  ** wo
6da0: 72 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20  rks find if the 
6db0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74  following memset
6dc0: 28 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20  () is omitted.  
6dd0: 42 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  But initializing
6de0: 0a 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79  .  ** the memory
6df0: 20 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69   prevents valgri
6e00: 6e 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e  nd from complain
6e10: 69 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77  ing, so we are w
6e20: 69 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74  illing to.  ** t
6e30: 61 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ake the performa
6e40: 6e 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20  nce hit..  */.  
6e50: 6d 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b  memset(&zHeader[
6e60: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6e70: 61 67 69 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20  agic)+16], 0,.  
6e80: 20 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28         nHeader-(
6e90: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6ea0: 61 67 69 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69  agic)+16));..  i
6eb0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6ec0: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
6ed0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
6ee0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
6ef0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6f00: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6f10: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
6f20: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
6f30: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
6f40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
6f50: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
6f60: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
6f70: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
6f80: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
6f90: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
6fa0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
6fb0: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
6fc0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
6fd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
6fe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
6ff0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
7000: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
7010: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7020: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
7030: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
7040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7050: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
7060: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
7070: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
7080: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
7090: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
70a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
70b0: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
70c0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
70d0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
70e0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54 68 65  nal.** file. The
70f0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
7100: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
7110: 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e 20 62   file is given b
7120: 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75  y.** pPager->jou
7130: 72 6e 61 6c 4f 66 66 2e 20 20 53 65 65 20 63 6f  rnalOff.  See co
7140: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
7150: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
7160: 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20 61  alHdr() for.** a
7170: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
7190: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
71a0: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
71b0: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
71c0: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
71d0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
71e0: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
71f0: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
7200: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
7210: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
7220: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
7230: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
7240: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7250: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
7260: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
7270: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
7280: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
7290: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
72a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
72c0: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
72d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
72e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
72f0: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
7300: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
7310: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
7320: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
7330: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
7340: 65 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e  e are undefined.
7350: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
7360: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
7370: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
7380: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7390: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
73a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
73b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
73c0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
73d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
73e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
73f0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
7400: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
7410: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
7420: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
7430: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
7440: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7450: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7460: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
7470: 33 32 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  32 iPageSize;.  
7480: 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65 3b  u32 iSectorSize;
7490: 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  ..  seekJournalH
74a0: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  dr(pPager);.  if
74b0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
74c0: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
74d0: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
74e0: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
74f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
7500: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f  ONE;.  }.  jrnlO
7510: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
7520: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d  rnalOff;..  rc =
7530: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
7540: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
7550: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7560: 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20  c), jrnlOff);.  
7570: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7580: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7590: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b   sizeof(aMagic);
75a0: 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ..  if( memcmp(a
75b0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
75c0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
75d0: 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  gic))!=0 ){.    
75e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
75f0: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
7600: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7610: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
7620: 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72   pNRec);.  if( r
7630: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7640: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7650: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
7660: 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65  rnlOff+4, &pPage
7670: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
7680: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7690: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
76a0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
76b0: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20  jfd, jrnlOff+8, 
76c0: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
76d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
76e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
76f0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
7700: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
7710: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7720: 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 26 69 50   jrnlOff+16, &iP
7730: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
7740: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7750: 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
7760: 53 69 7a 65 3c 35 31 32 20 0a 20 20 20 20 20 7c  Size<512 .     |
7770: 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51 4c 49  | iPageSize>SQLI
7780: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
7790: 20 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67   .     || ((iPag
77a0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
77b0: 7a 65 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  ze)!=0 .    ){. 
77c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
77d0: 61 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  age-size in the 
77e0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
77f0: 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  s invalid, then 
7800: 74 68 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  the process.    
7810: 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
7820: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
7830: 65 72 20 6d 75 73 74 20 68 61 76 65 20 63 72 61  er must have cra
7840: 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  shed before the 
7850: 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20  header.      ** 
7860: 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e 20 74  was synced. In t
7870: 68 69 73 20 63 61 73 65 20 73 74 6f 70 20 72 65  his case stop re
7880: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
7890: 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20  l file here..   
78a0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
78b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
78c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
78d0: 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20 28 75  16 pagesize = (u
78e0: 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20 20  16)iPageSize;.  
78f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7900: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
7910: 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73 69  (pPager, &pagesi
7920: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
7930: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
7940: 20 7c 7c 20 70 61 67 65 73 69 7a 65 3d 3d 28 75   || pagesize==(u
7950: 31 36 29 69 50 61 67 65 53 69 7a 65 20 29 3b 0a  16)iPageSize );.
7960: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
7970: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7980: 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
7990: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
79a0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
79b0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
79c0: 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 72  y .    ** the pr
79d0: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
79e0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
79f0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
7a00: 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 72 65 61   was.    ** crea
7a10: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7a20: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7a30: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7a40: 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 69  routine.    ** i
7a50: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7a60: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7a70: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7a80: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 20   local value.   
7a90: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
7aa0: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
7ab0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
7ac0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
7ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
7ae0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7af0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
7b00: 31 32 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65  12, &iSectorSize
7b10: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
7b20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69  return rc;.    i
7b30: 66 28 20 28 69 53 65 63 74 6f 72 53 69 7a 65 26  f( (iSectorSize&
7b40: 28 69 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 29  (iSectorSize-1))
7b50: 0a 20 20 20 20 20 20 7c 7c 20 69 53 65 63 74 6f  .      || iSecto
7b60: 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20 20 20  rSize<512.      
7b70: 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3e 4d  || iSectorSize>M
7b80: 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  AX_SECTOR_SIZE. 
7b90: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
7ba0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7bb0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7bc0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 69  ->sectorSize = i
7bd0: 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a  SectorSize;.  }.
7be0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7bf0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
7c00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
7c10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c20: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57  _OK;.}.../*.** W
7c30: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
7c40: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
7c50: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
7c60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
7c70: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
7c80: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
7c90: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
7ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7cb0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
7cc0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
7cd0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
7ce0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
7cf0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
7d00: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
7d10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
7d20: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
7d30: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
7d40: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
7d50: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
7d60: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
7d70: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
7d80: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
7d90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
7da0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
7db0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
7dc0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7dd0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7de0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
7df0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
7e00: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
7e10: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
7e20: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
7e30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7e40: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7e50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7e60: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
7e70: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
7e80: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
7e90: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
7ea0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
7eb0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
7ec0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7ed0: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7ee0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7f00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
7f10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
7f20: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
7f30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7f40: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7f50: 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  ; .  i64 jrnlOff
7f60: 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65  ;.  i64 jrnlSize
7f70: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  ;.  u32 cksum = 
7f80: 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73  0;.  char zBuf[s
7f90: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7fa0: 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66  gic)+2*4];..  if
7fb0: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
7fc0: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
7fd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
7fe0: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
7ff0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
8000: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
8010: 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e  _MEMORY ) return
8020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
8030: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8040: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  = 1;..  len = sq
8050: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
8060: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
8070: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
8080: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
8090: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
80a0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
80b0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
80c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
80d0: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
80e0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
80f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8100: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
8110: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
8120: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
8130: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
8140: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
8150: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
8160: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
8170: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
8180: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
8190: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 6a 72  Pager);.  }.  jr
81a0: 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  nlOff = pPager->
81b0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
81c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
81d0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
81e0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
81f0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
8200: 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f 4d 4a  rnlOff, PAGER_MJ
8210: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
8220: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8230: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8240: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b  .  jrnlOff += 4;
8250: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8260: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
8270: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
8280: 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69  n, jrnlOff);.  i
8290: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
82a0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
82b0: 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a  jrnlOff += len;.
82c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75  .  put32bits(zBu
82d0: 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32  f, len);.  put32
82e0: 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63  bits(&zBuf[4], c
82f0: 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  ksum);.  memcpy(
8300: 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e  &zBuf[8], aJourn
8310: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
8320: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
8330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8340: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
8350: 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65  fd, zBuf, 8+size
8360: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8370: 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a  ), jrnlOff);.  j
8380: 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69 7a 65  rnlOff += 8+size
8390: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
83a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
83b0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
83c0: 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49  >noSync;..  /* I
83d0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
83e0: 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72  n peristent-jour
83f0: 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  nal mode, then t
8400: 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a  he physical .  *
8410: 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d  * journal-file m
8420: 61 79 20 65 78 74 65 6e 64 20 70 61 73 74 20 74  ay extend past t
8430: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61  he end of the ma
8440: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
8450: 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74  e.  ** and 8 byt
8460: 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61  es of magic data
8470: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f   just written to
8480: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
8490: 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f  is .  ** dangero
84a0: 75 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  us because the c
84b0: 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ode to rollback 
84c0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69  a hot-journal fi
84d0: 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  le.  ** will not
84e0: 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64   be able to find
84f0: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
8500: 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65  nal name to dete
8510: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
8520: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a  her or not the j
8530: 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a  ournal is hot. .
8540: 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73    **.  ** Easies
8550: 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e  t thing to do in
8560: 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69   this scenario i
8570: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
8580: 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
8590: 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75  file to the requ
85a0: 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20  ired size..  */ 
85b0: 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49  .  if( (rc==SQLI
85c0: 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28 72 63  TE_OK).   && (rc
85d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
85e0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
85f0: 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d 3d 53  , &jrnlSize))==S
8600: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 6a  QLITE_OK.   && j
8610: 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a  rnlSize>jrnlOff.
8620: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71    ){.    rc = sq
8630: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
8640: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
8650: 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lOff);.  }.  ret
8660: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8670: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
8680: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
8690: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
86a0: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
86b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
86c0: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
86d0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
86e0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
86f0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
8700: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
8710: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
8720: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
8730: 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
8740: 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
8750: 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70   &p);.  return p
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
8770: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
8780: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
8790: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
87a0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
87b0: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
87c0: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
87d0: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
87e0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
87f0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
8800: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
8810: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
8820: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
8830: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
8840: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
8850: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
8860: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8870: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
8880: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
8890: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
88a0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
88b0: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
88c0: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
88d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
88e0: 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  l structures in 
88f0: 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70  the Pager.aSavep
8900: 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e 64  oint[] array and
8910: 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61 67   set both.** Pag
8920: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 6e  er.aSavepoint an
8930: 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f 69  d Pager.nSavepoi
8940: 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f 73  nt to zero. Clos
8950: 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  e the sub-journa
8960: 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 70  l.** if it is op
8970: 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 72  en and the pager
8980: 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75   is not in exclu
8990: 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73 74  sive mode..*/.st
89a0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
89b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50 61  eAllSavepoint(Pa
89c0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
89d0: 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69  int ii;.  for(ii
89e0: 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e  =0; ii<pPager->n
89f0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29  Savepoint; ii++)
8a00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
8a10: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
8a20: 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
8a30: 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
8a40: 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
8a50: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8a60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
8a70: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8a80: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
8a90: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
8aa0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
8ab0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
8ac0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
8ad0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
8ae0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
8af0: 74 4e 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tNRec = 0;.}../*
8b00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20  .** Set the bit 
8b10: 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74  number pgno in t
8b20: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
8b30: 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62  t.pInSavepoint b
8b40: 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c 6c  itvecs of.** all
8b50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
8b60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8b70: 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
8b80: 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61  tvecs(Pager *pPa
8b90: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
8ba0: 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20  .  int ii;      
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8bc0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8bd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
8be0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52  E_OK;       /* R
8bf0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20  esult code */.. 
8c00: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
8c10: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
8c20: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67  ; ii++){.    Pag
8c30: 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d  erSavepoint *p =
8c40: 20 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70   &pPager->aSavep
8c50: 6f 69 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66  oint[ii];.    if
8c60: 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67  ( pgno<=p->nOrig
8c70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20   ){.      rc |= 
8c80: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
8c90: 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74  (p->pInSavepoint
8ca0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61  , pgno);.      a
8cb0: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
8cc0: 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  E_OK || rc==SQLI
8cd0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
8ce0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
8cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
8d00: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
8d10: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
8d20: 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72  the pager is cur
8d30: 72 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20  rently in error 
8d40: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74  state, discard t
8d50: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a  he contents of .
8d60: 2a 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ** the cache and
8d70: 20 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72   reset the Pager
8d80: 20 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72   structure inter
8d90: 6e 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68  nal state. If th
8da0: 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65  ere is.** an ope
8db0: 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20  n journal-file, 
8dc0: 74 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69  then the next ti
8dd0: 6d 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b  me a shared-lock
8de0: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
8df0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  on the pager fil
8e00: 65 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e  e (by this or an
8e10: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29  y other process)
8e20: 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  , it will be.** 
8e30: 74 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74  treated as a hot
8e40: 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c  -journal and rol
8e50: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  led back..*/.sta
8e60: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
8e70: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
8e80: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
8e90: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8ea0: 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  de ){.    int rc
8eb0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ;..    /* Always
8ec0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
8ed0: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
8ee0: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
8ef0: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
8f00: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
8f10: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
8f20: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
8f30: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
8f40: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
8f50: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
8f60: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
8f70: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8f80: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8f90: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8fa0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
8fb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8fc0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
8fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
8fe0: 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
8ff0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
9000: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
9010: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
9020: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
9030: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
9040: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
9050: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
9060: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  pAlwaysRollback 
9070: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
9080: 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50  rc = osUnlock(pP
9090: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
90a0: 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  K);.    if( rc )
90b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
90c0: 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65   = rc;.    pPage
90d0: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
90e0: 20 30 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   0;.    IOTRACE(
90f0: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
9100: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a  pPager))..    /*
9110: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
9120: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
9130: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
9140: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
9150: 20 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74   be.    ** trust
9160: 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65  ed. Now that the
9170: 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75   pager file is u
9180: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e  nlocked, the con
9190: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
91a0: 20 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65   ** cache can be
91b0: 20 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74   discarded and t
91c0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61  he error code sa
91d0: 66 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20  fely cleared..  
91e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
91f0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
9200: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
9210: 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72  LITE_OK ) pPager
9220: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
9230: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61 67  TE_OK;.      pag
9240: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
9250: 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 41  ;.      releaseA
9260: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
9270: 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
9280: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9290: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
92a0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
92b0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
92c0: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20  r->dbOrigSize = 
92d0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  0;.    }..    pP
92e0: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
92f0: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
9300: 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
9310: 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d  untDone = 0;.  }
9320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  .}../*.** Execut
9330: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20  e a rollback if 
9340: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
9350: 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f   active and unlo
9360: 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ck the .** datab
9370: 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
9380: 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65 61   pager has alrea
9390: 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20 65  dy entered the e
93a0: 72 72 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20  rror state, .** 
93b0: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
93c0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he rollback..*/.
93d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
93e0: 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
93f0: 63 6b 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ck(Pager *p){.  
9400: 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d  if( p->errCode==
9410: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
9420: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
9430: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
9440: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9450: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c  alloc();.    sql
9460: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
9470: 6b 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  k(p);.    sqlite
9480: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
9490: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
94a0: 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a  unlock(p);.}../*
94b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
94c0: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
94d0: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
94e0: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
94f0: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
9500: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
9510: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
9520: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9530: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
9540: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
9550: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
9560: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
9570: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
9580: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
9590: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
95a0: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
95b0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
95c0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
95d0: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
95e0: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
95f0: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
9600: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
9610: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
9620: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
9630: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
9640: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
9650: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
9660: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
9670: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
9680: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
9690: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
96a0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
96b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
96c0: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
96d0: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
96e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
96f0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
9700: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9710: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
9720: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
9730: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
9740: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
9750: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
9760: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
9770: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
9780: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
9790: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
97a0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
97b0: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
97c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
97d0: 20 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69   hasMaster){.  i
97e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
97f0: 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53  K;.  int rc2 = S
9800: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
9810: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
9820: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
9830: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9840: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  E_OK;.  }.  rele
9850: 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28  aseAllSavepoint(
9860: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
9870: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
9880: 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  en ){.    if( pP
9890: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
98a0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
98b0: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
98c0: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
98d0: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
98e0: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
98f0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
9900: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9910: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
9920: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
9930: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
9940: 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f       if( !isMemo
9950: 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  ryJournal ){.   
9960: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9970: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
9980: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
9990: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
99a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
99b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
99c0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
99d0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
99e0: 41 54 45 0a 20 20 20 20 20 20 20 20 20 26 26 20  ATE.         && 
99f0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  (rc = sqlite3OsT
9a00: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9a10: 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45  jfd, 0))==SQLITE
9a20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
9a30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9a40: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9a50: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9a60: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9a70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
9a80: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
9a90: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9aa0: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9ab0: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49  OURNALMODE_PERSI
9ac0: 53 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ST.    ){.      
9ad0: 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c  rc = zeroJournal
9ae0: 48 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d  Hdr(pPager, hasM
9af0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61  aster);.      pa
9b00: 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
9b10: 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61  , rc);.      pPa
9b20: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9b30: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
9b40: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
9b50: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
9b60: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9b70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
9b80: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9b90: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c  ALMODE_DELETE ||
9ba0: 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c   rc );.      sql
9bb0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
9bc0: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
9bd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9be0: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pen = 0;.      i
9bf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9c00: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
9c10: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
9c20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
9c30: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
9c40: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
9c50: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
9c60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
9c70: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
9c80: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
9c90: 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
9ca0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
9cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ;.    sqlite3Bit
9cc0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
9cd0: 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
9ce0: 63 6b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ck);.    pPager-
9cf0: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
9d00: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
9d10: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9d20: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
9d30: 65 49 74 65 72 61 74 65 44 69 72 74 79 28 70 50  eIterateDirty(pP
9d40: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
9d50: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73  ager_set_pagehas
9d60: 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  h);.#endif.    s
9d70: 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
9d80: 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
9d90: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
9da0: 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
9db0: 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  0;.    pPager->n
9dc0: 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Rec = 0;.  }else
9dd0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
9de0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
9df0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
9e00: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
9e10: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
9e20: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
9e30: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
9e40: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
9e50: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
9e60: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
9e70: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
9e80: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
9e90: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
9ea0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
9eb0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
9ec0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9ed0: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
9ee0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67    pPager->dbOrig
9ef0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
9f00: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
9f10: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
9f20: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20  dSync = 0;.  /* 
9f30: 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
9f40: 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 20 2a  ynced(pPager); *
9f50: 2f 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  /.  sqlite3Pcach
9f60: 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
9f70: 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
9f80: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
9f90: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
9fa0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
9fb0: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
9fc0: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
9fd0: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
9fe0: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9ff0: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
a000: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
a010: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
a020: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
a030: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
a040: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
a050: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
a060: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
a070: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
a080: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
a090: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
a0a0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
a0b0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
a0c0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
a0d0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
a0e0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
a0f0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
a100: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
a110: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
a120: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
a130: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
a140: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
a150: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
a160: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
a170: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
a180: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
a190: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
a1a0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
a1b0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
a1c0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
a1d0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
a1e0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
a1f0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
a200: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
a210: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
a220: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
a230: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
a240: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
a250: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
a260: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
a270: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
a280: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
a290: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
a2a0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
a2b0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
a2c0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
a2d0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
a2e0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
a2f0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
a300: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
a310: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
a320: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
a330: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
a340: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
a350: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
a360: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
a370: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
a380: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
a390: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
a3a0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
a3b0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
a3c0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
a3d0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
a3e0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
a3f0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
a400: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
a410: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
a420: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
a430: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
a440: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
a450: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
a460: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
a470: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a480: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
a490: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
a4a0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
a4b0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
a4c0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
a4d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
a4e0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
a4f0: 20 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72   either the jour
a500: 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d  nal file (if isM
a510: 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a  ainJrnl==1) or.*
a520: 2a 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a  * from the sub-j
a530: 6f 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69  ournal (if isMai
a540: 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c  nJrnl==0) and pl
a550: 61 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65  ayback that page
a560: 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65  ..** The page be
a570: 67 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a  gins at offset *
a580: 70 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65  pOffset into the
a590: 20 66 69 6c 65 2e 20 20 54 68 65 20 20 2a 70 4f   file.  The  *pO
a5a0: 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69  ffset.** value i
a5b0: 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20 74  s increased to t
a5c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
a5d0: 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
a5e0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
a5f0: 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66  The isMainJrnl f
a600: 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20 74  lag is true if t
a610: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
a620: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
a630: 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f   and.** false fo
a640: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
a650: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
a660: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
a670: 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65 63  nal uses.** chec
a680: 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61 74  ksums - the stat
a690: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f  ement journal do
a6a0: 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  es not..**.** If
a6b0: 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e 55   pDone is not NU
a6c0: 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20 61  LL, then it is a
a6d0: 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65 73   record of pages
a6e0: 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65 61   that have alrea
a6f0: 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79 65  dy.** been playe
a700: 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65 20  d back.  If the 
a710: 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65 74  page at *pOffset
a720: 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
a730: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a 2a  n played back.**
a740: 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73 70   (if the corresp
a750: 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69 74  onding pDone bit
a760: 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73 6b   is set) then sk
a770: 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b 2e  ip the playback.
a780: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
a790: 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72 72  e pDone bit corr
a7a0: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
a7b0: 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20 69   *pOffset page i
a7c0: 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20 74  s set.** prior t
a7d0: 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  o returning..*/.
a7e0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a7f0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
a800: 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge(.  Pager *pPa
a810: 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ger,            
a820: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
a830: 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61   being played ba
a840: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61  ck */.  int isMa
a850: 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20  inJrnl,         
a860: 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61        /* 1 -> ma
a870: 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e  in journal. 0 ->
a880: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f   sub-journal. */
a890: 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c  .  i64 *pOffset,
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65   /* Offset of re
a8c0: 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b  cord to playback
a8d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65   */.  int isSave
a8e0: 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pnt,            
a8f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
a900: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
a910: 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63  back */.  Bitvec
a920: 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20   *pDone         
a930: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65          /* Bitve
a940: 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61  c of pages alrea
a950: 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a  dy played back *
a960: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
a970: 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20   PgHdr *pPg;    
a980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a990: 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61  * An existing pa
a9a0: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
a9b0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
a9e0: 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20  umber of a page 
a9f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
aa00: 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20  u32 cksum;      
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa20: 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66   Checksum used f
aa30: 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  or sanity checki
aa40: 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74  ng */.  u8 *aDat
aa50: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
aa60: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
aa70: 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74  ry storage for t
aa80: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c  he page */.  sql
aa90: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20  ite3_file *jfd; 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
aab0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
aac0: 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  r for the journa
aad0: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  l file */..  ass
aae0: 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  ert( (isMainJrnl
aaf0: 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20  &~1)==0 );      
ab00: 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73  /* isMainJrnl is
ab10: 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73   0 or 1 */.  ass
ab20: 65 72 74 28 20 28 69 73 53 61 76 65 70 6e 74 26  ert( (isSavepnt&
ab30: 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20  ~1)==0 );       
ab40: 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69 73 20  /* isSavepnt is 
ab50: 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65  0 or 1 */.  asse
ab60: 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c  rt( isMainJrnl |
ab70: 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f  | pDone );     /
ab80: 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75  * pDone always u
ab90: 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e  sed on sub-journ
aba0: 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  als */.  assert(
abb0: 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44   isSavepnt || pD
abc0: 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70  one==0 );   /* p
abd0: 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20  Done never used 
abe0: 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74  on non-savepoint
abf0: 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28   */..  aData = (
ac00: 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
ac10: 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28  Space;.  assert(
ac20: 20 61 44 61 74 61 20 29 3b 20 20 20 20 20 20 20   aData );       
ac30: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
ac40: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  e must have alre
ac50: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
ac60: 65 64 20 2a 2f 0a 0a 20 20 6a 66 64 20 3d 20 69  ed */..  jfd = i
ac70: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
ac80: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
ac90: 2d 3e 73 6a 66 64 3b 0a 0a 20 20 72 63 20 3d 20  ->sjfd;..  rc = 
aca0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
acb0: 2a 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29  *pOffset, &pgno)
acc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
acd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ace0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
acf0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
ad00: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
ad10: 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29  Size, (*pOffset)
ad20: 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  +4);.  if( rc!=S
ad30: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ad40: 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74  n rc;.  *pOffset
ad50: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
ad60: 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69  Size + 4 + isMai
ad70: 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53  nJrnl*4;..  /* S
ad80: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
ad90: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
ada0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
adb0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
adc0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
add0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
ade0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
adf0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
ae00: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
ae10: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
ae20: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
ae30: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
ae40: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
ae50: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
ae60: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
ae70: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
ae80: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
ae90: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
aea0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
aeb0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
aec0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
aed0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
aee0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
aef0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
af00: 3e 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64  >(Pgno)pPager->d
af10: 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33  bSize || sqlite3
af20: 42 69 74 76 65 63 54 65 73 74 28 70 44 6f 6e 65  BitvecTest(pDone
af30: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72  , pgno) ){.    r
af40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
af50: 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4d 61 69  .  }.  if( isMai
af60: 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20  nJrnl ){.    rc 
af70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
af80: 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20  , (*pOffset)-4, 
af90: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
afa0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
afb0: 0a 20 20 20 20 69 66 28 20 21 69 73 53 61 76 65  .    if( !isSave
afc0: 70 6e 74 20 26 26 20 70 61 67 65 72 5f 63 6b 73  pnt && pager_cks
afd0: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
afe0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
aff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b000: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
b010: 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28    if( pDone && (
b020: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
b030: 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e  ecSet(pDone, pgn
b040: 6f 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  o)) ){.    retur
b050: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
b060: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
b070: 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
b080: 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  ED || pPager->st
b090: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
b0a0: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  SIVE );..  /* If
b0b0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
b0c0: 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
b0d0: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
b0e0: 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68   be a copy of th
b0f0: 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20  is.  ** page in 
b100: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
b110: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75   In this case ju
b120: 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61  st update the pa
b130: 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20  ger cache,.  ** 
b140: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
b150: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
b160: 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64  is left marked d
b170: 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73  irty in this cas
b180: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20  e..  **.  ** An 
b190: 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65  exception to the
b1a0: 20 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20   above rule: If 
b1b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
b1c0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a  in no-sync mode.
b1d0: 20 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20    ** and a page 
b1e0: 69 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20  is moved during 
b1f0: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  an incremental v
b200: 61 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70  acuum then the p
b210: 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74  age may.  ** not
b220: 20 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72   be in the pager
b230: 20 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69   cache. Later: i
b240: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  f a malloc() or 
b250: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
b260: 20 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f    ** during a Mo
b270: 76 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74  vepage() call, t
b280: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
b290: 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63   not be in the c
b2a0: 61 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72  ache.  ** either
b2b0: 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69  . So the conditi
b2c0: 6f 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  on described in 
b2d0: 74 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72  the above paragr
b2e0: 61 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  aph is not.  ** 
b2f0: 61 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20  assert()able..  
b300: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
b310: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
b320: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
b330: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
b340: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
b350: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
b360: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
b370: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
b380: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
b390: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
b3a0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b3b0: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
b3c0: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
b3d0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
b3e0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
b3f0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
b400: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
b410: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
b420: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
b430: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
b440: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
b450: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
b460: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
b470: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
b480: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
b490: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
b4a0: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
b4b0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
b4c0: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
b4d0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
b4e0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
b4f0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
b500: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
b510: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
b520: 74 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64  tents are synced
b530: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72   into the main r
b540: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
b550: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
b560: 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d  , a power loss m
b570: 69 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66  ight leave modif
b580: 69 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a  ied data in the.
b590: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
b5a0: 6c 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e  le without an en
b5b0: 74 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  try in the rollb
b5c0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ack journal that
b5d0: 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72   can.  ** restor
b5e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
b5f0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66  o its original f
b600: 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  orm.  Two condit
b610: 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a  ions must be.  *
b620: 2a 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  * met before wri
b630: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
b640: 62 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20  base files. (1) 
b650: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
b660: 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  t be.  ** locked
b670: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
b680: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
b690: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
b6a0: 20 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20   fully synced.  
b6b0: 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a  ** in the main j
b6c0: 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65  ournal either be
b6d0: 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69  cause the page i
b6e0: 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
b6f0: 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20  r else.  ** the 
b700: 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61  page is marked a
b710: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
b720: 20 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34   **.  ** 2008-04
b730: 2d 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d  -14:  When attem
b740: 70 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20  pting to vacuum 
b750: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
b760: 73 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a  se file, it.  **
b770: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
b780: 66 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74  fail a statement
b790: 20 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74   on a database t
b7a0: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74  hat does not yet
b7b0: 20 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20   exist..  ** Do 
b7c0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77  not attempt to w
b7d0: 72 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65  rite if database
b7e0: 20 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20   file has never 
b7f0: 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a  been opened..  *
b800: 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  /.  pPg = pager_
b810: 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
b820: 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41  gno);.  PAGERTRA
b830: 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
b840: 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
b850: 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
b860: 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
b870: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 2c  D(pPager), pgno,
b880: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
b890: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b8a0: 2c 20 61 44 61 74 61 29 2c 0a 20 20 20 20 20 20  , aData),.      
b8b0: 20 20 20 20 20 20 20 20 20 28 69 73 4d 61 69 6e           (isMain
b8c0: 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e  Jrnl?"main-journ
b8d0: 61 6c 22 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c  al":"sub-journal
b8e0: 22 29 0a 20 20 29 29 3b 0a 20 20 69 66 28 20 28  ").  ));.  if( (
b8f0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b900: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a  AGER_EXCLUSIVE).
b910: 20 20 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c     && (pPg==0 ||
b920: 20 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26   0==(pPg->flags&
b930: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
b940: 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
b950: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20  >fd->pMethods). 
b960: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
b970: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
b980: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
b990: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
b9a0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b9b0: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
b9c0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
b9d0: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
b9e0: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
b9f0: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
ba00: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
ba10: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
ba20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73  .  }else if( !is
ba30: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d  MainJrnl && pPg=
ba40: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
ba50: 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61  this is a rollba
ba60: 63 6b 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e  ck of a savepoin
ba70: 74 20 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e  t and data was n
ba80: 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ot written to.  
ba90: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
baa0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  e and the page i
bab0: 73 20 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c  s not in-memory,
bac0: 20 74 68 65 72 65 20 69 73 20 61 20 70 6f 74 65   there is a pote
bad0: 6e 74 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f  ntial.    ** pro
bae0: 62 6c 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70  blem. When the p
baf0: 61 67 65 20 69 73 20 6e 65 78 74 20 66 65 74 63  age is next fetc
bb00: 68 65 64 20 62 79 20 74 68 65 20 62 2d 74 72 65  hed by the b-tre
bb10: 65 20 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20  e layer, it .   
bb20: 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64   ** will be read
bb30: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
bb40: 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d  se file, which m
bb50: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
bb60: 20 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74   .    ** current
bb70: 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
bb80: 20 54 68 65 72 65 20 61 72 65 20 61 20 63 6f 75   There are a cou
bb90: 70 6c 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74  ple of different
bba0: 20 77 61 79 73 20 74 68 69 73 20 63 61 6e 20 68   ways this can h
bbb0: 61 70 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71  appen. All are q
bbc0: 75 69 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63  uite.    ** obsc
bbd0: 75 72 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e  ure. When runnin
bbe0: 67 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  g in synchronous
bbf0: 20 6d 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20   mode, this can 
bc00: 6f 6e 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20  only happen .   
bc10: 20 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20   ** if the page 
bc20: 69 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  is on the free-l
bc30: 69 73 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ist at the start
bc40: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
bc50: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
bc60: 20 70 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e   populated, then
bc70: 20 6d 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c   moved using sql
bc80: 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
bc90: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
bca0: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
bcb0: 69 73 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d  is to add an in-
bcc0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74  memory page to t
bcd0: 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
bce0: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  ing.    ** the d
bcf0: 61 74 61 20 6a 75 73 74 20 72 65 61 64 20 66 72  ata just read fr
bd00: 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  om the sub-journ
bd10: 61 6c 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67  al. Mark the pag
bd20: 65 20 61 73 20 64 69 72 74 79 20 0a 20 20 20 20  e as dirty .    
bd30: 2a 2a 20 61 6e 64 20 69 66 20 74 68 65 20 70 61  ** and if the pa
bd40: 67 65 72 20 72 65 71 75 69 72 65 73 20 61 20 6a  ger requires a j
bd50: 6f 75 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65  ournal-sync, the
bd60: 6e 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  n mark the page 
bd70: 61 73 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69  as .    ** requi
bd80: 72 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ring a journal-s
bd90: 79 6e 63 20 62 65 66 6f 72 65 20 69 74 20 69 73  ync before it is
bda0: 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
bdb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73 53  .    assert( isS
bdc0: 61 76 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66  avepnt );.    if
bdd0: 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
bde0: 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
bdf0: 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20  er, pgno, &pPg, 
be00: 31 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  1)) ){.      ret
be10: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
be20: 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20    pPg->flags &= 
be30: 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44  ~PGHDR_NEED_READ
be40: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
be50: 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
be60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
be70: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
be80: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
be90: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
bea0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
beb0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
bec0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
bed0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
bee0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
bef0: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
bf00: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
bf10: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
bf20: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
bf30: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
bf40: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
bf50: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
bf60: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
bf70: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
bf80: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
bf90: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
bfa0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
bfb0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
bfc0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
bfd0: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
bfe0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
bff0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
c000: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
c010: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
c020: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
c030: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
c040: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
c050: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
c060: 26 26 20 28 21 69 73 53 61 76 65 70 6e 74 20 7c  && (!isSavepnt |
c070: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
c080: 6c 4f 66 66 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f  lOff<=pPager->jo
c090: 75 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20  urnalHdr) ){.   
c0a0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e     /* If the con
c0b0: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61  tents of this pa
c0c0: 67 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73  ge were just res
c0d0: 74 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  tored from the m
c0e0: 61 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  ain .      ** jo
c0f0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
c100: 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73   its content mus
c110: 74 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72  t be as they wer
c120: 65 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20  e when the .    
c130: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
c140: 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65   was first opene
c150: 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
c160: 77 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20  we can mark the 
c170: 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  page.      ** as
c180: 20 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68   clean, since th
c190: 65 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e  ere will be no n
c1a0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20  eed to write it 
c1b0: 6f 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20  out to the..    
c1c0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
c1d0: 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70  ere is one excep
c1e0: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c  tion to this rul
c1f0: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  e. If the page i
c200: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20  s being rolled. 
c210: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20       ** back as 
c220: 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f  part of a savepo
c230: 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e  int (or statemen
c240: 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  t) rollback from
c250: 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e   an .      ** un
c260: 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f  synced portion o
c270: 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
c280: 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  al file, then it
c290: 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20   is not safe.   
c2a0: 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68     ** to mark th
c2b0: 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
c2c0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
c2d0: 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67   marking the pag
c2e0: 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c  e as.      ** cl
c2f0: 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74  ean will clear t
c300: 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  he PGHDR_NEED_SY
c310: 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74  NC flag. Since t
c320: 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20  he page is.     
c330: 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74   ** already in t
c340: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c350: 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67  (recorded in Pag
c360: 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61  er.pInJournal) a
c370: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  nd.      ** the 
c380: 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
c390: 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c  flag is cleared,
c3a0: 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
c3b0: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20  written to.     
c3c0: 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e   ** again within
c3d0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
c3e0: 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61  n, it will be ma
c3f0: 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75  rked as dirty bu
c400: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  t.      ** the P
c410: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
c420: 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  lag will not be 
c430: 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68  set. It could th
c440: 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20  en potentially. 
c450: 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74       ** be writt
c460: 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20  en out into the 
c470: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
c480: 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c  fore its journal
c490: 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73   file.      ** s
c4a0: 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64  egment is synced
c4b0: 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63  . If a crash occ
c4c0: 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f  urs during or fo
c4d0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20  llowing this,.  
c4e0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c4f0: 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65  corruption may e
c500: 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nsue..      */. 
c510: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
c520: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
c530: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
c540: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
c550: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
c560: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
c570: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
c580: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
c590: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
c5a0: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
c5b0: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
c5c0: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
c5d0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
c5e0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
c5f0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
c600: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
c610: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
c620: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
c630: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
c640: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
c650: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
c660: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
c670: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
c680: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
c690: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
c6a0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
c6b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
c6c0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
c6d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c6e0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
c6f0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
c700: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
c710: 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
c720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
c730: 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74  oks ahead into t
c740: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
c750: 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69  file and determi
c760: 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
c770: 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72  r not the next r
c780: 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72  ecord (the recor
c790: 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74  d that begins at
c7a0: 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20   file.** offset 
c7b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c7c0: 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  ff) is a well-fo
c7d0: 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64  rmed page record
c7e0: 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f   consisting.** o
c7f0: 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e  f a valid page n
c800: 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61  umber, pPage->pa
c810: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
c820: 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65  content, followe
c830: 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20  d.** by a valid 
c840: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  checksum..**.** 
c850: 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20  The pager never 
c860: 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68  needs to know th
c870: 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  is in order to d
c880: 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69  o its job.   Thi
c890: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
c8a0: 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77  only used from w
c8b0: 69 74 68 20 61 73 73 65 72 74 28 29 20 61 6e 64  ith assert() and
c8c0: 20 74 65 73 74 63 61 73 65 28 29 20 6d 61 63 72   testcase() macr
c8d0: 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  os..*/.static in
c8e0: 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  t pagerNextJourn
c8f0: 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 50 61  alPageIsValid(Pa
c900: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c910: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
c920: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
c930: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
c940: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  age */.  u32 cks
c950: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  um;           /*
c960: 20 54 68 65 20 70 61 67 65 20 63 68 65 63 6b 73   The page checks
c970: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  um */.  int rc; 
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c990: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
c9a0: 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 73   read operations
c9b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
c9c0: 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20 54 68  le *fd;    /* Th
c9d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
c9e0: 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  r from which we 
c9f0: 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f 0a 20  are reading */. 
ca00: 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20   u8 *aData;     
ca10: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74        /* Content
ca20: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
ca30: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70  .  /* Read the p
ca40: 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61 64 65  age number heade
ca50: 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50 61 67  r */.  fd = pPag
ca60: 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20 3d 20  er->jfd;.  rc = 
ca70: 72 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70  read32bits(fd, p
ca80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca90: 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  f, &pgno);.  if(
caa0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cab0: 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20  { return 0; }   
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cae0: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
caf0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
cb00: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
cb10: 70 50 61 67 65 72 29 20 29 7b 20 72 65 74 75 72  pPager) ){ retur
cb20: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 2f  n 0; }         /
cb30: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28  *NO_TEST*/.  if(
cb40: 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67   pgno>(Pgno)pPag
cb50: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20 72 65  er->dbSize ){ re
cb60: 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20  turn 0; }       
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cb80: 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a  *NO_TEST*/..  /*
cb90: 20 52 65 61 64 20 74 68 65 20 63 68 65 63 6b 73   Read the checks
cba0: 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  um */.  rc = rea
cbb0: 64 33 32 62 69 74 73 28 66 64 2c 20 70 50 61 67  d32bits(fd, pPag
cbc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 70  er->journalOff+p
cbd0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
cbe0: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  4, &cksum);.  if
cbf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cc00: 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f  /*NO_TEST*/..  /
cc40: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 20  * Read the data 
cc50: 61 6e 64 20 76 65 72 69 66 79 20 74 68 65 20 63  and verify the c
cc60: 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61 44 61  hecksum */.  aDa
cc70: 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67 65 72  ta = (u8*)pPager
cc80: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
cc90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
cca0: 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  d(fd, aData, pPa
ccb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 70  ger->pageSize, p
ccc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ccd0: 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  f+4);.  if( rc!=
cce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
ccf0: 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
cd20: 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61 67 65  EST*/.  if( page
cd30: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
cd40: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
cd50: 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20   return 0; }    
cd60: 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
cd70: 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 63  EST*/..  /* Reac
cd80: 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 6c  h this point onl
cd90: 79 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  y if the page is
cda0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65 74 75   valid */.  retu
cdb0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
cdc0: 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  * !defined(NDEBU
cdd0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
cde0: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
cdf0: 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 61  ST) */../*.** Pa
ce00: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
ce10: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
ce20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ce30: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
ce40: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
ce50: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
ce60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ce70: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
ce80: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ce90: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
cea0: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
ceb0: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
cec0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ced0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
cee0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
cef0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
cf00: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
cf10: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
cf20: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
cf30: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
cf40: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
cf50: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
cf60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
cf70: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
cf80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
cf90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
cfa0: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
cfb0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
cfc0: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
cfd0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
cfe0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
cff0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
d000: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
d010: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
d020: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
d030: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
d040: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
d050: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
d060: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
d070: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
d080: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
d090: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
d0a0: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
d0b0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
d0c0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
d0d0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
d0e0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
d0f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
d100: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
d110: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
d120: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
d130: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
d140: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
d150: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
d160: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
d170: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d180: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
d190: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
d1a0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
d1b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d1c0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
d1d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d1e0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
d1f0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
d200: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
d210: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
d220: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
d230: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
d240: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
d250: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
d260: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
d270: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
d280: 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  3Malloc(pVfs->sz
d290: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
d2a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
d2b0: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
d2c0: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
d2d0: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
d2e0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
d2f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d300: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
d310: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
d320: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
d330: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
d340: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
d350: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d360: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
d370: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
d380: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
d390: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d3a0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
d3b0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
d3c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
d3d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
d3e0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
d3f0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
d400: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d410: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
d420: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
d430: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
d440: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
d450: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
d460: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
d470: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
d480: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
d490: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
d4a0: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
d4b0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
d4c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d4d0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
d4e0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
d4f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
d500: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
d510: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
d520: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
d530: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
d540: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
d550: 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d  e3Malloc((int)nM
d560: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
d570: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
d580: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
d590: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
d5a0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
d5b0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
d5c0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
d5d0: 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
d5e0: 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
d5f0: 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
d600: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d610: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
d620: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
d630: 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f  , (int)nMasterJo
d640: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69  urnal, 0);.    i
d650: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d660: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
d670: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
d680: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
d690: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
d6a0: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
d6b0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
d6c0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
d6d0: 20 20 20 20 69 6e 74 20 65 78 69 73 74 73 3b 0a      int exists;.
d6e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
d6f0: 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
d700: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54   zJournal, SQLIT
d710: 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
d720: 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20 20 20   &exists);.     
d730: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d740: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d750: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
d760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d770: 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a 20 20  if( exists ){.  
d780: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
d790: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
d7a0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
d7b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
d7c0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
d7d0: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
d7e0: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
d7f0: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
d800: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
d810: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
d820: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
d830: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
d840: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
d850: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
d860: 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   c;.        int 
d870: 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f  flags = (SQLITE_
d880: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51  OPEN_READONLY|SQ
d890: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
d8a0: 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20  OURNAL);.       
d8b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
d8c0: 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e  pen(pVfs, zJourn
d8d0: 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c  al, pJournal, fl
d8e0: 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ags, 0);.       
d8f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d900: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
d910: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
d920: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
d930: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
d940: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a  MasterJournal(pJ
d950: 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50  ournal, zMasterP
d960: 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  tr, nMasterPtr);
d970: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d980: 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c  OsClose(pJournal
d990: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
d9a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
d9b0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
d9c0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
d9d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
d9e0: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b   c = zMasterPtr[
d9f0: 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28  0]!=0 && strcmp(
da00: 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73  zMasterPtr, zMas
da10: 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  ter)==0;.       
da20: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20   if( c ){.      
da30: 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61      /* We have a
da40: 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64   match. Do not d
da50: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da70: 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
da80: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
da90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
daa0: 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  }.      zJournal
dab0: 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c   += (sqlite3Strl
dac0: 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31  en30(zJournal)+1
dad0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  );.    }.  }.  .
dae0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
daf0: 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
db00: 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61  ster, 0);..delma
db10: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
db20: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
db30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
db40: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
db50: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
db60: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
db70: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
db80: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(pMaster);.  }.
db90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
dba0: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
dbb0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
dbc0: 49 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  If the main data
dbd0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65  base file is ope
dbe0: 6e 20 61 6e 64 20 61 6e 20 65 78 63 6c 75 73 69  n and an exclusi
dbf0: 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  ve lock is held,
dc00: 20 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 74 68   .** truncate th
dc10: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
dc20: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
dc30: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
dc40: 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 70 61  number .** of pa
dc50: 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ges..**.** It mi
dc60: 67 68 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ght might be the
dc70: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 66   case that the f
dc80: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 73  ile on disk is s
dc90: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50 61 67  maller than nPag
dca0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e 20 68  e..** This can h
dcb0: 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70  appen, for examp
dcc0: 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20 69 6e  le, if we are in
dcd0: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 61   the middle of a
dce0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
dcf0: 77 68 69 63 68 20 68 61 73 20 65 78 74 65 6e 64  which has extend
dd00: 65 64 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  ed the file size
dd10: 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70 61 67   and the new pag
dd20: 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c  es are still all
dd30: 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68   held.** in cach
dd40: 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53 45 52  e, then an INSER
dd50: 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f 65 73  T or UPDATE does
dd60: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c   a statement rol
dd70: 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20  lback.  Some.** 
dd80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
dd90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
dda0: 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75 73 65   can get confuse
ddb0: 64 20 69 66 20 79 6f 75 20 74 72 79 20 74 6f 0a  d if you try to.
ddc0: 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69  ** truncate a fi
ddd0: 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20  le to some size 
dde0: 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
ddf0: 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74 6c 79  han it currently
de00: 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63   is,.** so detec
de10: 74 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20  t this case and 
de20: 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a  write a single z
de30: 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68 65 20  ero byte to the 
de40: 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a  end of the new.*
de50: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  * file instead..
de60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
de70: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
de80: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
de90: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
dea0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
deb0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
dec0: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
ded0: 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e 66  IVE && pPager->f
dee0: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
def0: 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69     i64 currentSi
df00: 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  ze, newSize;.   
df10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
df20: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
df30: 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65  fd, &currentSize
df40: 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d  );.    newSize =
df50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
df60: 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20  e*(i64)nPage;.  
df70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
df80: 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69  _OK && currentSi
df90: 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ze!=newSize ){. 
dfa0: 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74       if( current
dfb0: 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a  Size>newSize ){.
dfc0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
dfd0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
dfe0: 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69  Pager->fd, newSi
dff0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
e000: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
e010: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
e020: 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c  ager->fd, "", 1,
e030: 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20   newSize-1);.   
e040: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
e050: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
e060: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
e070: 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61  dbFileSize = nPa
e080: 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
e090: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
e0a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
e0b0: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
e0c0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
e0d0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
e0e0: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20  ctor size is at 
e0f0: 6c 65 61 73 74 20 61 73 20 62 69 67 20 61 73 20  least as big as 
e100: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
e110: 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73  reported.** by s
e120: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
e130: 7a 65 28 29 2e 20 54 68 65 20 6d 69 6e 69 6d 75  ze(). The minimu
e140: 6d 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  m sector size is
e150: 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
e160: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
e170: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
e180: 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  ){.  assert(pPag
e190: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
e1a0: 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
e1b0: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
e1c0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
e1d0: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
e1e0: 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
e1f0: 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
e200: 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
e210: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
e220: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
e230: 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
e240: 63 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  cih case the OsS
e250: 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
e260: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
e270: 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
e280: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
e290: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
e2a0: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
e2b0: 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
e2c0: 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
e2d0: 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
e2e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e2f0: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
e300: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
e310: 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
e320: 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 70 50  R_SIZE ){.    pP
e330: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e340: 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49   = MAX_SECTOR_SI
e350: 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ZE;.  }.}../*.**
e360: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
e370: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
e380: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
e390: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
e3a0: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
e3b0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
e3c0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
e3d0: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
e3e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e3f0: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
e400: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
e410: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
e420: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
e430: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
e440: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
e450: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
e460: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
e470: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
e480: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
e490: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
e4a0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
e4b0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
e4c0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
e4d0: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
e4e0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
e4f0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
e500: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
e510: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
e520: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
e530: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
e540: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
e550: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
e560: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
e570: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
e580: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
e590: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
e5a0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
e5b0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
e5c0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
e5d0: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
e5e0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
e5f0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
e600: 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  s the sector siz
e610: 65 2e 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a  e.  The header.*
e620: 2a 20 20 20 20 20 20 20 69 73 20 74 68 69 73 20  *       is this 
e630: 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69  many bytes in si
e640: 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62  ze..**  (6)  4 b
e650: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
e660: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
e670: 74 68 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a  the page case..*
e680: 2a 20 20 28 37 29 20 20 34 20 62 79 74 65 20 69  *  (7)  4 byte i
e690: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
e6a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
e6b0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
e6c0: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
e6d0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
e6e0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
e6f0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
e700: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
e710: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
e720: 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20  al.).**  (8)  N 
e730: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
e740: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
e750: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
e760: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
e770: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
e780: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
e790: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
e7a0: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
e7b0: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
e7c0: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
e7d0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
e7e0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
e7f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
e800: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
e810: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
e820: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
e830: 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a  TF-8..**  (9)  Z
e840: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
e850: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
e860: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
e870: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
e880: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
e890: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
e8a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
e8b0: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
e8c0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
e8d0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
e8e0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
e8f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
e900: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
e910: 66 69 72 73 74 20 38 20 69 74 65 6d 73 20 61 62  first 8 items ab
e920: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
e930: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
e940: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
e950: 20 6f 66 20 74 68 65 20 39 74 68 20 69 74 65 6d   of the 9th item
e960: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
e970: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
e980: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
e990: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
e9a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
e9b0: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
e9c0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
e9d0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
e9e0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
e9f0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
ea00: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
ea10: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
ea20: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
ea30: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
ea40: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
ea50: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
ea60: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
ea70: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
ea80: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
ea90: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
eaa0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
eab0: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
eac0: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
ead0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
eae0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
eaf0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
eb00: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
eb10: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
eb20: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
eb30: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
eb40: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
eb50: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
eb60: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
eb70: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
eb80: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
eb90: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
eba0: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
ebb0: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
ebc0: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
ebd0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
ebe0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
ebf0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
ec00: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
ec10: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
ec20: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
ec30: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
ec40: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
ec50: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
ec60: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
ec70: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
ec80: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
ec90: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
eca0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ecb0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
ecc0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
ecd0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
ece0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
ecf0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
ed00: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
ed10: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
ed20: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
ed30: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
ed40: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
ed50: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
ed60: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
ed70: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
ed80: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
ed90: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
eda0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
edb0: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
edc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
edd0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
ede0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
edf0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
ee00: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
ee10: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
ee20: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
ee30: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
ee40: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
ee50: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
ee60: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
ee70: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
ee80: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
ee90: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
eea0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
eeb0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
eec0: 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
eed0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
eee0: 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
eef0: 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  s;.  i64 szJ;   
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ef10: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   Size of the jou
ef20: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74  rnal file in byt
ef30: 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63  es */.  u32 nRec
ef40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ef50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65   /* Number of Re
ef60: 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75  cords in the jou
ef70: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b  rnal */.  u32 u;
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c     /* Unsigned l
efa0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
efb0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
efc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
efd0: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
efe0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
eff0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f010: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
f020: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
f030: 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20    int res = 1;  
f040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f050: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f060: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
f070: 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  ) */.  char *zMa
f080: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
f090: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
f0a0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
f0b0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
f0c0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
f0d0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
f0e0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
f0f0: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
f100: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
f110: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
f120: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f130: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
f140: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f150: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
f160: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
f170: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f180: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
f190: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
f1a0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
f1b0: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
f1c0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
f1d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
f1e0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
f1f0: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
f200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
f210: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
f220: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
f230: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
f240: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
f250: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
f260: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
f270: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
f280: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
f290: 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
f2a0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
f2b0: 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
f2c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
f2d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
f2e0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
f2f0: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
f300: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
f310: 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
f320: 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
f330: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
f340: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
f350: 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
f360: 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
f370: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
f380: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f390: 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
f3a0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
f3b0: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
f3c0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
f3d0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
f3e0: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
f3f0: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
f400: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
f410: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
f420: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
f430: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
f440: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
f450: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
f460: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
f470: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
f480: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
f490: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
f4a0: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
f4b0: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
f4c0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
f4d0: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
f4e0: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
f4f0: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
f500: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
f510: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
f520: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
f530: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
f540: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
f550: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
f560: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
f570: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
f580: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
f590: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
f5a0: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
f5b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f5c0: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
f5d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
f5e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f5f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
f600: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
f610: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
f620: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
f630: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
f640: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
f650: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
f660: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
f670: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
f680: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
f690: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
f6a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
f6b0: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
f6c0: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
f6d0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
f6e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
f6f0: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
f700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
f710: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
f720: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
f730: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
f740: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
f750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f760: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
f770: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
f780: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
f790: 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
f7a0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
f7b0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
f7c0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
f7d0: 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  er));.    }..   
f7e0: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
f7f0: 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61   and this rollba
f800: 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73  ck is of a trans
f810: 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62  action created b
f820: 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72  y this.    ** pr
f830: 6f 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69  ocess and if thi
f840: 73 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68  s is the final h
f850: 65 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75  eader in the jou
f860: 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65  rnal, then it me
f870: 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ans.    ** that 
f880: 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  this part of the
f890: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
f8a0: 6e 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61  ng filled but ha
f8b0: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20  s not yet been. 
f8c0: 20 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20     ** synced to 
f8d0: 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74  disk.  Compute t
f8e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
f8f0: 65 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  es based on the 
f900: 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a  remaining.    **
f910: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
f920: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f930: 20 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20   The third term 
f940: 6f 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20  of the test was 
f950: 61 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63  added to fix tic
f960: 6b 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a  ket #2565..    *
f970: 2a 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62  * When rolling b
f980: 61 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  ack a hot journa
f990: 6c 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79  l, nRec==0 alway
f9a0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
f9b0: 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75   next.    ** chu
f9c0: 6e 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nk of the journa
f9d0: 6c 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20  l contains zero 
f9e0: 70 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c  pages to be roll
f9f0: 65 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20  ed back.  But.  
fa00: 20 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20    ** when doing 
fa10: 61 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74  a ROLLBACK and t
fa20: 68 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b  he nRec==0 chunk
fa30: 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75   is the last chu
fa40: 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  nk in.    ** the
fa50: 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61   journal, it mea
fa60: 6e 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ns that the jour
fa70: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
fa80: 6e 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20  n additional.   
fa90: 20 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e   ** pages that n
faa0: 65 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eed to be rolled
fab0: 20 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74   back and that t
fac0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
fad0: 65 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c  es .    ** shoul
fae0: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61  d be computed ba
faf0: 73 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  sed on the journ
fb00: 61 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20  al file size..  
fb10: 20 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73    */.    testcas
fb20: 65 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  e( nRec==0 && !i
fb30: 73 48 6f 74 0a 20 20 20 20 20 20 20 20 20 26 26  sHot.         &&
fb40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fb50: 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
fb60: 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61 67  SZ(pPager)!=pPag
fb70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20  er->journalOff. 
fb80: 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a 4a          && ((szJ
fb90: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
fba0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
fbb0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3e  _PG_SZ(pPager))>
fbc0: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 61  0.         && pa
fbd0: 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61  gerNextJournalPa
fbe0: 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65 72  geIsValid(pPager
fbf0: 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
fc00: 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48   nRec==0 && !isH
fc10: 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20 70 50  ot &&.        pP
fc20: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
fc30: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
fc40: 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
fc50: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20  >journalOff ){. 
fc60: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e 74       nRec = (int
fc70: 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  )((szJ - pPager-
fc80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
fc90: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
fca0: 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ger));.    }..  
fcb0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
fcc0: 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
fcd0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
fce0: 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
fcf0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
fd00: 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
fd10: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
fd20: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
fd30: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
fd40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
fd50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
fd60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
fd70: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
fd80: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
fd90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
fda0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
fdb0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
fdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
fdd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
fde0: 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  mxPg;.    }..   
fdf0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
fe00: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
fe10: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
fe20: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
fe30: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
fe40: 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
fe50: 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
fe60: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
fe70: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
fe80: 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
fe90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
fea0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
feb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
fec0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
fed0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
fee0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
fef0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
ff00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
ff10: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ff20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ff30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
ff40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
ff50: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
ff60: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
ff70: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
ff80: 70 72 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20  probably.       
ff90: 20 20 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65     ** going to e
ffa0: 6e 64 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72  nd up being corr
ffb0: 75 70 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72  upt.  It is corr
ffc0: 75 70 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f  upt to us, anyho
ffd0: 77 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  w..          ** 
ffe0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
fff0: 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65   process to come
10000 20 61 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69   along can fix i
10010 74 2e 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20  t.....          
10020 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
10030 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10040 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
10050 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10060 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
10070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10080 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
10090 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
100a0 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
100b0 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61 20   /* Following a 
100c0 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64 61  rollback, the da
100d0 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75  tabase file shou
100e0 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69 74  ld be back in it
100f0 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
10100 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20 74  state prior to t
10110 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
10120 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f 20  transaction, so 
10130 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a 20  invoke the.  ** 
10140 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
10150 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d 63  UNCHANGED file-c
10160 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74 6f  ontrol method to
10170 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20 2a   disable the.  *
10180 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61 74  * assertion that
10190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
101a0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f 64   counter was mod
101b0 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ified..  */.  as
101c0 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65 72  sert(.    pPager
101d0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d  ->fd->pMethods==
101e0 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ||.    sqlite3
101f0 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50  OsFileControl(pP
10200 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45 5f  ager->fd,SQLITE_
10210 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
10220 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f 4b  ED,0)>=SQLITE_OK
10230 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
10240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10250 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
10260 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
10270 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
10280 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
10290 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
102a0 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
102b0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d  Pathname+1);.  }
102c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
102d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
102e0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
102f0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
10300 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
10310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
10320 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61  SQLITE_OK && zMa
10330 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29  ster[0] && res )
10340 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
10350 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a  e was a master j
10360 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20  ournal and this 
10370 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74  routine will ret
10380 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20  urn success,.   
10390 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
103a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
103b0 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
103c0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
103d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
103e0 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20  lmaster(pPager, 
103f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20  zMaster);.  }.. 
10400 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
10410 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
10420 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
10430 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
10440 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
10450 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
10460 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
10470 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
10480 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
10490 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
104a0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
104b0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
104c0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
104d0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
104e0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
104f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
10500 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
10510 53 61 76 65 70 6f 69 6e 74 2e 20 20 4f 72 2c 20  Savepoint.  Or, 
10520 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
10530 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
10540 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
10550 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10560 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
10570 63 61 73 65 20 70 53 61 76 65 70 6f 69 6e 74 3d  case pSavepoint=
10580 3d 4e 55 4c 4c 20 6f 63 63 75 72 73 20 77 68 65  =NULL occurs whe
10590 6e 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  n a ROLLBACK TO 
105a0 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b  command is invok
105b0 65 64 0a 2a 2a 20 6f 6e 20 61 20 53 41 56 45 50  ed.** on a SAVEP
105c0 4f 49 4e 54 20 74 68 61 74 20 69 73 20 61 20 74  OINT that is a t
105d0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
105e0 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
105f0 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
10600 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
10610 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
10620 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
10630 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
10640 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10650 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73    /* Effective s
10660 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ize of the main 
10670 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
10680 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20   iHdrOff;       
10690 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
106a0 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66  first segment of
106b0 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65   main-journal re
106c0 63 6f 72 64 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  cords */.  Pgno 
106d0 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
106e0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
106f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
10700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
10710 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
10720 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44   */.  Bitvec *pD
10730 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  one = 0;       /
10740 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73 75  * Bitvec to ensu
10750 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64 20  re pages played 
10760 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20 2a  back only once *
10770 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
10780 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73 65   a bitvec to use
10790 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65   to store the se
107a0 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65  t of pages rolle
107b0 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  d back */.  if( 
107c0 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  pSavepoint ){.  
107d0 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65    pDone = sqlite
107e0 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 53  3BitvecCreate(pS
107f0 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29  avepoint->nOrig)
10800 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65  ;.    if( !pDone
10810 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10820 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10830 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
10840 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
10850 62 61 73 65 20 62 61 63 6b 20 74 6f 20 74 68 65  base back to the
10860 20 73 69 7a 65 20 69 74 20 77 61 73 20 62 65 66   size it was bef
10870 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 61  ore the .  ** sa
10880 76 65 70 6f 69 6e 74 20 62 65 69 6e 67 20 72 65  vepoint being re
10890 76 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65  verted was opene
108a0 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  d..  */.  pPager
108b0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65  ->dbSize = pSave
108c0 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69  point ? pSavepoi
108d0 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67  nt->nOrig : pPag
108e0 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
108f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10900 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
10910 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 55  HARED );..  /* U
10920 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  se pPager->journ
10930 61 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66  alOff as the eff
10940 65 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74  ective size of t
10950 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
10960 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
10970 54 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20  The actual file 
10980 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
10990 74 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a  than this in.  *
109a0 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  * PAGER_JOURNALM
109b0 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20  ODE_TRUNCATE or 
109c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
109d0 45 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20  E_PERSIST.  But 
109e0 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61  anything.  ** pa
109f0 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  st pPager->journ
10a00 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d  alOff is off-lim
10a10 69 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a  its to us..  */.
10a20 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e    szJ = pPager->
10a30 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f  journalOff;..  /
10a40 2a 20 42 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69  * Begin by rolli
10a50 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
10a60 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f  from the main jo
10a70 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61  urnal starting a
10a80 74 0a 20 20 2a 2a 20 50 61 67 65 72 53 61 76 65  t.  ** PagerSave
10a90 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e  point.iOffset an
10aa0 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20  d continuing to 
10ab0 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
10ac0 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68   header..  ** Th
10ad0 65 72 65 20 6d 69 67 68 74 20 62 65 20 72 65 63  ere might be rec
10ae0 6f 72 64 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ords in the main
10af0 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 68 61   journal that ha
10b00 76 65 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  ve a page number
10b10 0a 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68  .  ** greater th
10b20 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  an the current d
10b30 61 74 61 62 61 73 65 20 73 69 7a 65 20 28 70 50  atabase size (pP
10b40 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 20 62 75  ager->dbSize) bu
10b50 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c  t those.  ** wil
10b60 6c 20 62 65 20 73 6b 69 70 70 65 64 20 61 75 74  l be skipped aut
10b70 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20 50 61 67  omatically.  Pag
10b80 65 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  es are added to 
10b90 70 44 6f 6e 65 20 61 73 20 74 68 65 79 0a 20 20  pDone as they.  
10ba0 2a 2a 20 61 72 65 20 70 6c 61 79 65 64 20 62 61  ** are played ba
10bb0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ck..  */.  if( p
10bc0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
10bd0 20 69 48 64 72 4f 66 66 20 3d 20 70 53 61 76 65   iHdrOff = pSave
10be0 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
10bf0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
10c00 69 48 64 72 4f 66 66 73 65 74 20 3a 20 73 7a 4a  iHdrOffset : szJ
10c10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
10c20 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53 61 76 65  urnalOff = pSave
10c30 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65 74 3b 0a  point->iOffset;.
10c40 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
10c50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
10c60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 69  er->journalOff<i
10c70 48 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  HdrOff ){.      
10c80 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
10c90 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
10ca0 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 72 2d  ger, 1, &pPager-
10cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20  >journalOff, 1, 
10cc0 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 61 73  pDone);.      as
10cd0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
10ce0 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d 0a 20  _DONE );.    }. 
10cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
10d00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10d10 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f   0;.  }..  /* Co
10d20 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e 67 20 62  ntinue rolling b
10d30 61 63 6b 20 72 65 63 6f 72 64 73 20 6f 75 74 20  ack records out 
10d40 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
10d50 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a  nal starting at.
10d60 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a    ** the first j
10d70 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
10d80 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  en and continuin
10d90 67 20 75 6e 74 69 6c 20 74 68 65 20 65 66 66 65  g until the effe
10da0 63 74 69 76 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  ctive end.  ** o
10db0 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  f the main journ
10dc0 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e 74 69 6e  al file.  Contin
10dd0 75 65 20 74 6f 20 73 6b 69 70 20 6f 75 74 2d 6f  ue to skip out-o
10de0 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 6e  f-range pages an
10df0 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  d.  ** continue 
10e00 61 64 64 69 6e 67 20 70 61 67 65 73 20 72 6f 6c  adding pages rol
10e10 6c 65 64 20 62 61 63 6b 20 74 6f 20 70 44 6f 6e  led back to pDon
10e20 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  e..  */.  while(
10e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10e40 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
10e50 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20 20 20 20  lOff<szJ ){.    
10e60 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
10e70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10e80 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
10e90 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
10ea0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
10eb0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
10ec0 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
10ed0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
10ee0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
10ef0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
10f00 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
10f10 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
10f20 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
10f30 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
10f40 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
10f50 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
10f60 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
10f70 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
10f80 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
10f90 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
10fa0 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
10fb0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
10fc0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
10fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28 6e  .    assert( !(n
10fe0 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20  JRec==0.        
10ff0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
11000 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48  nalHdr+JOURNAL_H
11010 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70  DR_SZ(pPager)!=p
11020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11030 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 28  f.         && ((
11040 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
11050 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
11060 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
11070 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26  ))>0.         &&
11080 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61   pagerNextJourna
11090 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50 61  lPageIsValid(pPa
110a0 67 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20  ger)).    );.   
110b0 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20   if( nJRec==0 . 
110c0 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
110d0 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
110e0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
110f0 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ==pPager->journa
11100 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20  lOff.    ){.    
11110 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d    nJRec = (szJ -
11120 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11130 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  Off)/JOURNAL_PG_
11140 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
11150 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  }.    for(ii=0; 
11160 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11170 20 69 69 3c 6e 4a 52 65 63 20 26 26 20 70 50 61   ii<nJRec && pPa
11180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c  ger->journalOff<
11190 73 7a 4a 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  szJ; ii++){.    
111a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
111b0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
111c0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65  Pager, 1, &pPage
111d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
111e0 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20  , pDone);.      
111f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
11200 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 7d  TE_DONE );.    }
11210 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
11220 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
11230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11240 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20 2f 2a  ff==szJ );..  /*
11250 20 46 69 6e 61 6c 6c 79 2c 20 20 72 6f 6c 6c 62   Finally,  rollb
11260 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
11270 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
11280 20 50 61 67 65 20 74 68 61 74 20 77 65 72 65 0a   Page that were.
11290 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
112a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f 75 74 20  rolled back out 
112b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
112c0 6e 61 6c 20 28 61 6e 64 20 61 72 65 20 68 65 6e  nal (and are hen
112d0 63 65 20 69 6e 20 70 44 6f 6e 65 29 0a 20 20 2a  ce in pDone).  *
112e0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
112f0 64 2e 20 20 4f 75 74 2d 6f 66 2d 72 61 6e 67 65  d.  Out-of-range
11300 20 70 61 67 65 73 20 61 72 65 20 61 6c 73 6f 20   pages are also 
11310 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
11320 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
11330 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  {.    i64 offset
11340 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
11350 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
11360 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
11370 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
11380 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
11390 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 69 69 3c 28  =SQLITE_OK&&ii<(
113a0 75 33 32 29 70 50 61 67 65 72 2d 3e 73 74 6d 74  u32)pPager->stmt
113b0 4e 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  NRec; ii++){.   
113c0 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65     assert( offse
113d0 74 20 3d 3d 20 69 69 2a 28 34 2b 70 50 61 67 65  t == ii*(4+pPage
113e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a  r->pageSize) );.
113f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
11400 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
11410 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 26 6f  ge(pPager, 0, &o
11420 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
11430 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11440 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
11450 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
11460 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
11470 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
11480 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11490 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
114a0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
114b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
114c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
114d0 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
114e0 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
114f0 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
11500 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
11510 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
11520 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
11530 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
11540 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
11550 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
11560 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
11570 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
11580 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
11590 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
115a0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
115b0 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
115c0 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
115d0 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
115e0 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
115f0 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
11600 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
11610 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
11620 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
11630 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
11640 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
11650 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
11660 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
11670 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11680 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
11690 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
116a0 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
116b0 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
116c0 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
116d0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
116e0 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
116f0 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
11700 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
11710 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
11720 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
11730 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
11740 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
11750 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
11760 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
11770 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
11780 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
117a0 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
117b0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
117c0 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
117d0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
117e0 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
117f0 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
11800 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
11810 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
11820 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
11830 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
11840 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
11850 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
11860 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
11870 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
11880 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
118a0 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
118b0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
118c0 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
118d0 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
118e0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
118f0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
11900 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
11910 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
11920 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
11930 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
11940 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
11950 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
11960 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
11970 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
11980 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
11990 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
119b0 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
119c0 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
119d0 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
119e0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
119f0 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
11a00 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
11a10 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
11a20 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
11a30 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
11a40 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
11a50 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
11a60 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
11a70 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
11a80 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
11a90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11aa0 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
11ab0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11ac0 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
11ad0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
11ae0 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
11af0 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
11b00 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
11b10 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
11b20 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
11b30 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
11b40 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
11b50 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
11b60 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
11b70 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
11b80 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
11b90 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
11ba0 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11bb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11bc0 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
11bd0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
11be0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
11bf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
11c00 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
11c10 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
11c20 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
11c30 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
11c40 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
11c50 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
11c60 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
11c70 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
11c80 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
11c90 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
11ca0 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
11cb0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
11cc0 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
11cd0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
11ce0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
11cf0 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
11d00 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
11d10 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
11d20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
11d30 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
11d40 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
11d50 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
11d60 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
11d70 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
11d80 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
11d90 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
11da0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  s closed..*/.sta
11db0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
11dc0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
11dd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
11de0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
11df0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
11e00 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
11e10 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
11e20 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
11e30 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
11e40 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
11e50 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
11e60 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
11e70 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
11e80 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
11e90 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
11ea0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
11eb0 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
11ec0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
11ed0 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
11ee0 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
11ef0 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
11f00 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
11f10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
11f20 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
11f30 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
11f40 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
11f50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
11f60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11f70 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
11f80 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
11f90 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
11fa0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11fb0 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
11fc0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
11fd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
11fe0 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
11ff0 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a  s(void *,PgHdr *
12000 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  );../*.** Create
12010 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
12020 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
12030 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
12040 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
12050 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
12060 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
12070 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
12080 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
12090 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
120a0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
120b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
120c0 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
120d0 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
120e0 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
120f0 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
12100 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
12110 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
12120 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
12130 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
12140 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
12150 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
12160 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
12170 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
12180 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
12190 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
121a0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
121b0 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
121c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
121d0 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
121e0 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
121f0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
12200 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
12210 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
12220 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
12230 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
12240 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
12250 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12260 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
12270 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
12280 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12290 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
122a0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
122b0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
122c0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
122d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
122e0 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
122f0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
12300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
12310 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
12320 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
12330 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
12340 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
12350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12360 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
12370 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
12380 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
12390 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
123a0 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
123b0 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
123c0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
123d0 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
123e0 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
123f0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
12400 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
12410 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
12420 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
12430 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
12440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12450 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
12460 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
12470 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
12480 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
12490 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
124a0 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
124b0 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
124c0 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
124d0 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
124e0 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
124f0 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
12500 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
12510 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
12520 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
12530 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73  eSize();.  int s
12540 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
12550 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
12560 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
12570 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
12580 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
12590 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
125a0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
125b0 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
125c0 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
125d0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
125e0 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
125f0 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d  lSize(pVfs);.  }
12600 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
12610 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
12620 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
12630 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  e();.  }..  /* T
12640 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
12650 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
12660 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
12670 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
12680 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
12690 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
126a0 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
126b0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
126c0 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
126d0 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
126e0 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
126f0 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
12700 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
12710 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
12720 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
12730 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
12740 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
12750 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
12760 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
12770 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
12780 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
12790 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
127a0 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
127b0 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
127c0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
127d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
127e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  OMEM;.    }.#ifn
127f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12800 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
12810 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
12820 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
12830 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
12840 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  = 1;.      zPath
12850 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  name[0] = 0;.   
12860 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
12870 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73    {.      rc = s
12880 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
12890 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
128a0 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
128b0 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
128c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
128d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
128e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
128f0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
12900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12910 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  }.    nPathname 
12920 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12930 30 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  0(zPathname);.  
12940 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
12950 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
12960 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
12970 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
12980 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
12990 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
129a0 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
129b0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
129c0 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68  ure */.    pcach
129d0 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20  eSize      +    
129e0 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
129f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a   object */.    j
12a00 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b  ournalFileSize +
12a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  e journal file s
12a30 74 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20  tructure */ .   
12a40 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20   pVfs->szOsFile 
12a50 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
12a60 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65  The main db file
12a70 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
12a80 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20  ileSize * 2 +   
12a90 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a      /* The two j
12aa0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20  ournal files */ 
12ab0 0a 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65  .    3*nPathname
12ac0 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20 20   + 40           
12ad0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a   /* zFilename, z
12ae0 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72  Directory, zJour
12af0 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66  nal */.  );.  if
12b00 28 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20  ( !pPager ){.   
12b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
12b20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
12b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12b40 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  M;.  }.  pPager-
12b50 3e 70 50 43 61 63 68 65 20 3d 20 28 50 43 61 63  >pPCache = (PCac
12b60 68 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  he *)&pPager[1];
12b70 0a 20 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a  .  pPtr = ((u8 *
12b80 29 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70  )&pPager[1]) + p
12b90 63 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61  cacheSize;.  pPa
12ba0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
12bb0 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67  vfsFlags;.  pPag
12bc0 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65  er->fd = (sqlite
12bd0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
12be0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b  fs->szOsFile*0];
12bf0 0a 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20  .  pPager->sjfd 
12c00 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
12c10 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
12c20 73 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72  sFile];.  pPager
12c30 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  ->jfd = (sqlite3
12c40 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
12c50 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72  s->szOsFile+jour
12c60 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20  nalFileSize];.  
12c70 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
12c80 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72  e = (char*)&pPtr
12c90 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b  [pVfs->szOsFile+
12ca0 32 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  2*journalFileSiz
12cb0 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  e];.  pPager->zD
12cc0 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
12cd0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50  er->zFilename[nP
12ce0 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
12cf0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d  ager->zJournal =
12d00 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63   &pPager->zDirec
12d10 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  tory[nPathname+1
12d20 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66  ];.  pPager->pVf
12d30 73 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20  s = pVfs;.  if( 
12d40 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  zPathname ){.   
12d50 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
12d60 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68  zFilename, zPath
12d70 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b  name, nPathname+
12d80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  1);.    sqlite3_
12d90 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
12da0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
12db0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
12dc0 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
12dd0 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
12de0 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29  e[0] && !memDb )
12df0 7b 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e  {.    if( nPathn
12e00 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74  ame>(pVfs->mxPat
12e10 68 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a  hname - (int)siz
12e20 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  eof("-journal"))
12e30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12e40 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
12e50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e60 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
12e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12e80 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
12e90 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
12ea0 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
12ed0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
12ee0 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
12ef0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
12f00 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
12f10 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
12f20 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
12f30 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
12f40 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
12f50 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  s,.      ** choo
12f60 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
12f70 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
12f80 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
12f90 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
12fa0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
12fb0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
12fc0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
12fd0 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  m of:.      **. 
12fe0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c       **    + SQL
12ff0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
13000 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20  _SIZE,.      ** 
13010 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
13020 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
13030 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
13040 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
13050 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
13060 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
13070 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
13080 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lly..      */.  
13090 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
130a0 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
130b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  ly ){.        se
130c0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
130d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
130e0 20 73 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67   szPageDflt<pPag
130f0 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29  er->sectorSize )
13100 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61  {.          szPa
13110 67 65 44 66 6c 74 20 3d 20 70 50 61 67 65 72 2d  geDflt = pPager-
13120 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
13130 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
13140 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
13150 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
13160 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
13170 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
13180 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
13190 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
131a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
131b0 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
131c0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
131d0 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
131e0 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
131f0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13200 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
13210 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
13220 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13230 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
13240 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
13250 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
13260 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
13270 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
13280 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
13290 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
132a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
132b0 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
132c0 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
132d0 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20   ) szPageDflt = 
132e0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
132f0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
13300 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
13310 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d  ageDflt>SQLITE_M
13320 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
13330 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
13340 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
13350 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
13360 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
13370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13380 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
13390 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
133a0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
133b0 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
133c0 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
133d0 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
133e0 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
133f0 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
13400 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
13410 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
13420 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
13430 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
13440 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
13450 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
13460 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
13470 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
13480 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
13490 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
134a0 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
134b0 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
134c0 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
134d0 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
134e0 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
134f0 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
13500 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
13510 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
13520 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
13530 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
13540 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13550 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
13560 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
13570 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
13580 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
13590 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
135a0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
135b0 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d  szPageDflt);.  }
135c0 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
135d0 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69  or occured in ei
135e0 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
135f0 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46  ks above..  ** F
13600 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
13610 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
13620 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  e the file..  **
13630 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
13640 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
13650 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
13660 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
13670 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
13680 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
13690 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
136a0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  || !pPager->pTmp
136b0 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Space ){.    sql
136c0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
136d0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
136e0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
136f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
13700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
13710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
13720 0a 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20  .  }.  nExtra = 
13730 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
13740 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
13750 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
13760 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
13770 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
13780 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
13790 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
137a0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
137b0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
137c0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
137d0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
137e0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
137f0 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
13800 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
13810 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
13820 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
13830 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
13840 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20  ilename))..  /* 
13850 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44  Fill in Pager.zD
13860 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20  irectory[] */.  
13870 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
13880 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65  Directory, pPage
13890 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
138a0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f  athname+1);.  fo
138b0 72 28 69 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  r(i=sqlite3Strle
138c0 6e 33 30 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  n30(pPager->zDir
138d0 65 63 74 6f 72 79 29 3b 20 0a 20 20 20 20 20 20  ectory); .      
138e0 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
138f0 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
13900 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
13910 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
13920 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
13930 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20  = 0;..  /* Fill 
13940 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  in Pager.zJourna
13950 6c 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61  l[] */.  if( zPa
13960 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65  thname ){.    me
13970 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  mcpy(pPager->zJo
13980 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  urnal, pPager->z
13990 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
139a0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
139b0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
139c0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
139d0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
139e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
139f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30  er->zJournal = 0
13a00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67  ;.  }..  /* pPag
13a10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
13a20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
13a30 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  ->useJournal = (
13a40 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  u8)useJournal;. 
13a50 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
13a60 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64 6c 6f 63  ock = (noReadloc
13a70 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 29 20 3f  k && readOnly) ?
13a80 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  1:0;.  /* pPager
13a90 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
13aa0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
13ab0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
13ac0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
13ad0 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
13ae0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
13af0 64 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20  d = (u8)memDb;. 
13b00 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
13b10 65 20 3d 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a  e = szPageDflt;.
13b20 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
13b30 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
13b40 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
13b50 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
13b60 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
13b70 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
13b80 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
13b90 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
13ba0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
13bb0 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
13bc0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
13bd0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
13be0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13bf0 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
13c00 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
13c10 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
13c20 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
13c30 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
13c40 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
13c50 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
13c60 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
13c70 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
13c80 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
13c90 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
13ca0 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
13cb0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
13cc0 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
13cd0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
13ce0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
13cf0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
13d00 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
13d10 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
13d20 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
13d30 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
13d40 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
13d50 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
13d60 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
13d70 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
13d80 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
13d90 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d  c = (pPager->tem
13da0 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
13db0 72 6e 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50  rnal) ?1:0;.  pP
13dc0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
13dd0 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
13de0 3f 30 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ?0:1;.  pPager->
13df0 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c  sync_flags = SQL
13e00 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b  ITE_SYNC_NORMAL;
13e10 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
13e20 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
13e30 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
13e40 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
13e50 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
13e60 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
13e70 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78  er->nExtra = nEx
13e80 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  tra;.  pPager->j
13e90 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
13ea0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
13eb0 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49  _JOURNAL_SIZE_LI
13ec0 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50  MIT;.  assert(pP
13ed0 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
13ee0 64 73 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20  ds||tempFile);. 
13ef0 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
13f00 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65  Pager);.  if( me
13f10 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65  mDb ){.    pPage
13f20 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d  r->journalMode =
13f30 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
13f40 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  DE_MEMORY;.  }. 
13f50 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73   /* pPager->xBus
13f60 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
13f70 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
13f80 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20  usyHandlerArg = 
13f90 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
13fa0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
13fb0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
13fc0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
13fd0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
13fe0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  er;.  return SQL
13ff0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14000 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61   Set the busy ha
14010 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a  ndler function..
14020 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
14030 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c  agerSetBusyhandl
14040 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  er(.  Pager *pPa
14050 67 65 72 2c 20 0a 20 20 69 6e 74 20 28 2a 78 42  ger, .  int (*xB
14060 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
14070 20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75   *),.  void *pBu
14080 73 79 48 61 6e 64 6c 65 72 41 72 67 0a 29 7b 20  syHandlerArg.){ 
14090 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42 75 73   .  pPager->xBus
140a0 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75 73 79  yHandler = xBusy
140b0 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61 67 65  Handler;.  pPage
140c0 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
140d0 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  rg = pBusyHandle
140e0 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rArg;.}../*.** S
140f0 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
14100 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
14110 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
14120 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
14130 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
14140 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
14150 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
14160 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
14170 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
14180 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
14190 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
141a0 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
141b0 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
141c0 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
141d0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
141e0 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
141f0 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
14200 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
14210 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
14220 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
14230 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
14240 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
14250 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
14260 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20  t)(DbPage*)){.  
14270 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
14280 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
14290 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
142a0 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67  ge size to *pPag
142b0 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75  eSize. If the su
142c0 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73  ggest new page s
142d0 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72  ize is.** inappr
142e0 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e  opriate, then an
142f0 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
14300 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f  e size is set to
14310 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62   that.** value b
14320 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
14330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14340 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
14350 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75  Pager *pPager, u
14360 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a  16 *pPageSize){.
14370 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67 65    int rc = pPage
14380 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69 66  r->errCode;.  if
14390 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
143a0 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 53  ){.    u16 pageS
143b0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
143c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
143d0 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61  geSize==0 || (pa
143e0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
143f0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
14400 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29  MAX_PAGE_SIZE) )
14410 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53 69  ;.    if( pageSi
14420 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21 3d  ze && pageSize!=
14430 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14440 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
14450 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20 70  r->memDb==0 || p
14460 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 30  Pager->dbSize==0
14470 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  ).     && sqlite
14480 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
14490 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
144a0 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
144b0 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28    char *pNew = (
144c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61  char *)sqlite3Pa
144d0 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69 7a  geMalloc(pageSiz
144e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  e);.      if( !p
144f0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  New ){.        r
14500 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14510 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14520 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
14530 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14540 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
14550 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
14560 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50  .        if( !pP
14570 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73 65  ager->memDb ) se
14580 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
14590 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  er);.        sql
145a0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
145b0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
145c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
145d0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65  >pTmpSpace = pNe
145e0 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  w;.        sqlit
145f0 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65 53  e3PcacheSetPageS
14600 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
14610 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  che, pageSize);.
14620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14630 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28    *pPageSize = (
14640 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65  u16)pPager->page
14650 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
14660 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14670 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
14680 20 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61   to the "tempora
14690 72 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20  ry page" buffer 
146a0 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  held internally.
146b0 2a 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e  ** by the pager.
146c0 20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66    This is a buff
146d0 65 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65  er that is big e
146e0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68  nough to hold th
146f0 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74  e.** entire cont
14700 65 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73  ent of a databas
14710 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75  e page.  This bu
14720 66 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74  ffer is used int
14730 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e  ernally.** durin
14740 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77  g rollback and w
14750 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74  ill be overwritt
14760 65 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f  en whenever a ro
14770 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
14780 2e 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64  .  But other mod
14790 75 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f  ules are free to
147a0 20 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20   use it too, as 
147b0 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f  long as.** no ro
147c0 6c 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70  llbacks are happ
147d0 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ening..*/.void *
147e0 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
147f0 53 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61  Space(Pager *pPa
14800 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
14810 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14820 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
14830 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  pt to set the ma
14840 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70  ximum database p
14850 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50  age count if mxP
14860 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
14870 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61   .** Make no cha
14880 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69  nges if mxPage i
14890 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  s zero or negati
148a0 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72  ve.  And never r
148b0 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78  educe the.** max
148c0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
148d0 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e  below the curren
148e0 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
148f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  tabase..**.** Re
14900 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61  gardless of mxPa
14910 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63  ge, return the c
14920 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70  urrent maximum p
14930 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
14940 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  t sqlite3PagerMa
14950 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72  xPageCount(Pager
14960 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
14970 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50  Page){.  if( mxP
14980 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70 50 61  age>0 ){.    pPa
14990 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78  ger->mxPgno = mx
149a0 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Page;.  }.  sqli
149b0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
149c0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
149d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d  return pPager->m
149e0 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  xPgno;.}../*.** 
149f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  The following se
14a00 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72  t of routines ar
14a10 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c  e used to disabl
14a20 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a  e the simulated.
14a30 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63  ** I/O error mec
14a40 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72  hanism.  These r
14a50 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
14a60 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61   to avoid simula
14a70 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e  ted.** errors in
14a80 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65   places where we
14a90 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
14aa0 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  ut errors..**.**
14ab0 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45   Unless -DSQLITE
14ac0 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c  _TEST=1 is used,
14ad0 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
14ae0 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a  are all no-ops.*
14af0 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e  * and generate n
14b00 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65  o code..*/.#ifde
14b10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78  f SQLITE_TEST.ex
14b20 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14b30 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
14b40 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
14b50 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
14b60 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  it;.static int s
14b70 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64  aved_cnt;.void d
14b80 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
14b90 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29  _io_errors(void)
14ba0 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20  {.  saved_cnt = 
14bb0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
14bc0 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69  _pending;.  sqli
14bd0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
14be0 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69  ding = -1;.}.voi
14bf0 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  d enable_simulat
14c00 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69  ed_io_errors(voi
14c10 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  d){.  sqlite3_io
14c20 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
14c30 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65   saved_cnt;.}.#e
14c40 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73  lse.# define dis
14c50 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
14c60 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
14c70 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
14c80 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
14c90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
14ca0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
14cb0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
14cc0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
14cd0 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
14ce0 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
14cf0 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
14d00 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
14d10 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
14d20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
14d30 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
14d40 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
14d50 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
14d60 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
14d70 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
14d80 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
14d90 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
14da0 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
14db0 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
14dc0 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
14dd0 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
14de0 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
14df0 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
14e00 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
14e10 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
14e20 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
14e30 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
14e40 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
14e50 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
14e60 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
14e70 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
14e80 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
14e90 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
14ea0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
14eb0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
14ec0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14ed0 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
14ee0 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
14ef0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
14f00 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
14f10 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
14f20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
14f30 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
14f40 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
14f50 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
14f60 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
14f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
14f80 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
14f90 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
14fa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
14fb0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
14fc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
14fd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
14fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
15000 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
15010 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
15020 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
15030 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
15040 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
15050 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
15060 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
15070 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
15080 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
15090 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
150a0 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
150b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
150c0 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
150d0 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
150e0 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
150f0 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
15100 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
15110 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
15120 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
15130 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
15140 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
15150 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
15160 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15170 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
15180 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
15190 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69    i64 n = 0;.  i
151a0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
151b0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
151c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
151d0 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ode ){.    rc = 
151e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
151f0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
15200 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
15210 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 7b  ->dbSizeValid ){
15220 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
15230 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
15240 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70  e {.    assert(p
15250 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15260 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
15270 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
15280 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
15290 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28  thods).     && (
152a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
152b0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
152c0 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f  d, &n))!=SQLITE_
152d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
152e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
152f0 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
15300 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
15310 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61  if( n>0 && n<pPa
15320 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
15330 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20  .      n = 1;.  
15340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
15350 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
15360 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
15370 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
15380 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
15390 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
153a0 3e 64 62 53 69 7a 65 20 3d 20 28 50 67 6e 6f 29  >dbSize = (Pgno)
153b0 6e 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  n;.      pPager-
153c0 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 28 50  >dbFileSize = (P
153d0 67 6e 6f 29 6e 3b 0a 20 20 20 20 20 20 70 50 61  gno)n;.      pPa
153e0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
153f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
15400 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
15410 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
15420 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
15430 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
15440 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
15450 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
15460 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e 3b  xPgno = (Pgno)n;
15470 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61 67  .  }.  if( pnPag
15480 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65  e ){.    *pnPage
15490 20 3d 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a 20   = (int)n;.  }. 
154a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
154b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  K;.}../*.** Forw
154c0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
154d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
154e0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
154f0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  );../*.** Try to
15500 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
15510 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
15520 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
15530 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
15540 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
15550 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
15560 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
15570 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
15580 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
15590 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
155a0 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
155b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
155c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
155d0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
155e0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
155f0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
15600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
15610 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
15620 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
15630 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
15640 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
15650 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
15660 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
15670 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
15680 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
15690 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
156a0 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
156b0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
156c0 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
156d0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
156e0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
156f0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
15700 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
15710 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
15720 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
15730 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
15740 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
15750 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
15760 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
15770 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
15780 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
15790 61 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  alid==0 );..  if
157a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
157b0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
157c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
157e0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
157f0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
15800 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
15810 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
15820 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
15830 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
15840 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
15850 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
15860 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15880 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
15890 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
158a0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
158b0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
158c0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
158d0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
158e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
158f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15900 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
15910 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e   Truncate the in
15920 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
15930 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e   file image to n
15940 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73  Page pages. This
15950 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f   .** function do
15960 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  es not actually 
15970 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62  modify the datab
15980 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ase file on disk
15990 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65  . It .** just se
159a0 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  ts the internal 
159b0 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
159c0 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61  er object so tha
159d0 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61  t the .** trunca
159e0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e  tion will be don
159f0 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65  e when the curre
15a00 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
15a10 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a  s committed..*/.
15a20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
15a30 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50  rTruncateImage(P
15a40 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
15a50 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73  no nPage){.  ass
15a60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
15a70 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73  izeValid );.  as
15a80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
15a90 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20  Size>=nPage );. 
15aa0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
15ab0 3d 20 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nPage;.}../*.*
15ac0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
15ad0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
15ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
15af0 6d 61 67 65 20 69 6e 20 70 61 67 65 73 2e 20 54  mage in pages. T
15b00 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
15b10 64 69 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c  differs from sql
15b20 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15b30 6e 74 28 29 20 69 6e 20 74 77 6f 20 77 61 79 73  nt() in two ways
15b40 3a 0a 2a 2a 0a 2a 2a 20 20 61 29 20 49 74 20 6d  :.**.**  a) It m
15b50 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
15b60 64 20 77 68 65 6e 20 61 74 20 6c 65 61 73 74 20  d when at least 
15b70 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  one reference to
15b80 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20   a database.**  
15b90 20 20 20 70 61 67 65 20 69 73 20 68 65 6c 64 2e     page is held.
15ba0 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
15bb0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
15bc0 73 65 20 73 69 7a 65 20 69 73 20 61 6c 72 65 61  se size is alrea
15bd0 64 79 0a 2a 2a 20 20 20 20 20 6b 6e 6f 77 6e 20  dy.**     known 
15be0 61 6e 64 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  and a call to sq
15bf0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
15c00 29 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  ) is not require
15c10 64 2e 0a 2a 2a 0a 2a 2a 20 20 62 29 20 54 68 65  d..**.**  b) The
15c20 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
15c30 20 6e 6f 74 20 61 64 6a 75 73 74 65 64 20 66 6f   not adjusted fo
15c40 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  r the locking pa
15c50 67 65 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ge..*/.Pgno sqli
15c60 74 65 33 50 61 67 65 72 49 6d 61 67 65 53 69 7a  te3PagerImageSiz
15c70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
15c80 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
15c90 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
15ca0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
15cb0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 7d 0a 23 65  er->dbSize;.}.#e
15cc0 6e 64 69 66 20 20 2f 2a 20 69 66 6e 64 65 66 20  ndif  /* ifndef 
15cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
15ce0 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
15cf0 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
15d00 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
15d10 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
15d20 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
15d30 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
15d40 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
15d50 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
15d60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
15d70 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
15d80 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
15d90 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
15da0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
15db0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
15dc0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
15dd0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
15de0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
15df0 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
15e00 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
15e10 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
15e20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
15e30 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
15e40 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
15e50 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
15e60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
15e70 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
15e80 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
15e90 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
15ea0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
15eb0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
15ec0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
15ed0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
15ee0 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
15ef0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
15f00 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
15f10 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
15f20 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
15f30 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
15f40 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
15f50 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
15f60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
15f70 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
15f80 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
15f90 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
15fa0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
15fb0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
15fc0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
15fd0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
15fe0 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
15ff0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
16000 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 2f 2a 20  MEMDB ){.    /* 
16010 53 65 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  Set Pager.journa
16020 6c 48 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74  lHdr to -1 for t
16030 68 65 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68  he benefit of th
16040 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
16050 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  () .    ** call 
16060 77 68 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64  which may be mad
16070 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  e from within pa
16080 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
16090 62 61 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20  back(). If it.  
160a0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20    ** is not -1, 
160b0 74 68 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65  then the unsynce
160c0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20  d portion of an 
160d0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
160e0 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20  e may.    ** be 
160f0 70 6c 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f  played back into
16100 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
16110 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
16120 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20  e occurs while. 
16130 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
16140 70 70 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74  ppening, the dat
16150 61 62 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65  abase may become
16160 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f   corrupt..    */
16170 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
16180 72 6e 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20  rnalHdr = -1;.  
16190 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
161a0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
161b0 3b 0a 20 20 7d 0a 20 20 65 6e 61 62 6c 65 5f 73  ;.  }.  enable_s
161c0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
161d0 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  rs();.  sqlite3E
161e0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
161f0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
16200 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
16210 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
16220 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
16230 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
16240 29 29 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  )).  if( pPager-
16250 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
16260 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
16270 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
16280 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 69  .  }.  sqlite3Bi
16290 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
162a0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
162b0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
162c0 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
162d0 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
162e0 3b 0a 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61  ;.  releaseAllSa
162f0 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b  vepoint(pPager);
16300 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
16310 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
16320 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
16330 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
16340 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
16350 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
16360 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
16370 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
16380 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
16390 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
163a0 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65  }.  */..  sqlite
163b0 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72  3PageFree(pPager
163c0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
163d0 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
163e0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
163f0 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  he);.  sqlite3_f
16400 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
16410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16420 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
16430 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  (NDEBUG) || defi
16440 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
16450 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16460 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
16470 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
16480 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73   data..*/.Pgno s
16490 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
164a0 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29  umber(DbPage *p)
164b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67  {.  return p->pg
164c0 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
164d0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
164e0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
164f0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
16500 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
16510 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
16520 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
16530 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
16540 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
16550 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  ge *pPg){.  sqli
16560 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50 67  te3PcacheRef(pPg
16570 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16580 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16590 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
165a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
165b0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
165c0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
165d0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
165e0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
165f0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
16600 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
16610 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
16620 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
16630 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
16640 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
16650 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
16660 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
16670 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
16680 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
16690 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
166a0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
166b0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
166c0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
166d0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
166e0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
166f0 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
16700 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
16710 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
16720 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
16730 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
16740 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
16750 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
16760 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
16770 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
16780 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16790 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
167a0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
167b0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
167c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
167d0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
167e0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
167f0 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
16800 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
16810 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
16820 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
16830 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
16840 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
16850 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
16860 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
16870 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
16880 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
16890 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
168a0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
168b0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
168c0 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
168d0 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
168e0 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
168f0 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
16900 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
16910 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
16920 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
16930 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
16940 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
16950 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
16960 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
16970 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16980 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
16990 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
169a0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
169b0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
169c0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
169d0 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
169e0 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
169f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
16a00 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
16a10 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
16a20 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
16a30 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
16a40 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
16a50 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
16a60 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
16a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
16a80 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
16a90 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
16aa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16ab0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f    /* Sync the jo
16ac0 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64  urnal before mod
16ad0 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20  ifying the main 
16ae0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61  database.  ** (a
16af0 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73  ssuming there is
16b00 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69   a journal and i
16b10 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  t needs to be sy
16b20 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  nced.).  */.  if
16b30 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
16b40 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nc ){.    assert
16b50 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
16b60 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ile );.    if( p
16b70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
16b80 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
16b90 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
16ba0 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20        int iDc = 
16bb0 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
16bc0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
16bd0 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
16be0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16bf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
16c00 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  ..      if( 0==(
16c10 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
16c20 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
16c30 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e  .        i64 jrn
16c40 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
16c50 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
16c60 0a 20 20 20 20 20 20 20 20 75 38 20 7a 4d 61 67  .        u8 zMag
16c70 69 63 5b 38 5d 3b 0a 0a 20 20 20 20 20 20 20 20  ic[8];..        
16c80 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
16c90 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
16ca0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
16cb0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
16cc0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
16cd0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
16ce0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
16cf0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
16d00 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
16d10 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
16d20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
16d30 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
16d40 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
16d50 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
16d60 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
16d70 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
16d80 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
16d90 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
16da0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
16db0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
16dc0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
16dd0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
16de0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
16df0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
16e00 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 72 61 6e 73  onnections trans
16e10 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20 63  action), and a c
16e20 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66 61  rash or power-fa
16e30 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a  ilure .        *
16e40 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 6e  * occurs after n
16e50 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 62  Rec is updated b
16e60 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 63  ut before this c
16e70 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73  onnection writes
16e80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79   .        ** any
16e90 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74 68  thing else to th
16ea0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
16eb0 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c 73  or commits/rolls
16ec0 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20 20   back its .     
16ed0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
16ee0 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20  n), then SQLite 
16ef0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66 75  may become confu
16f00 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20 74  sed when doing t
16f10 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  he .        ** h
16f20 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
16f30 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65  ack following re
16f40 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20 72  covery. It may r
16f50 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20 20  oll back all.   
16f60 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73 20       ** of this 
16f70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74 61  connections data
16f80 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20 74  , then proceed t
16f90 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 74  o rolling back t
16fa0 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20 20  he old,.        
16fb0 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 64  ** out-of-date d
16fc0 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
16fd0 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63 6f   it. Database co
16fe0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
16ff0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
17000 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
17010 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75 72  his, if the jour
17020 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61 70  nal file does ap
17030 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  pear to contain.
17040 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61 6c          ** a val
17050 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f 77  id header follow
17060 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  ing Pager.journa
17070 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74 65  lOff, then write
17080 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20 20   a 0x00.        
17090 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20 73  ** byte to the s
170a0 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70 72  tart of it to pr
170b0 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62 65  event it from be
170c0 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e 0a  ing recognized..
170d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
170e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
170f0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
17100 64 2c 20 7a 4d 61 67 69 63 2c 20 38 2c 20 6a 72  d, zMagic, 8, jr
17110 6e 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20  nlOff);.        
17120 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17130 4b 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  K && 0==memcmp(z
17140 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
17150 61 67 69 63 2c 20 38 29 20 29 7b 0a 20 20 20 20  agic, 8) ){.    
17160 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
17170 73 74 20 75 38 20 7a 65 72 6f 62 79 74 65 20 3d  st u8 zerobyte =
17180 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
17190 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
171a0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
171b0 7a 65 72 6f 62 79 74 65 2c 20 31 2c 20 6a 72 6e  zerobyte, 1, jrn
171c0 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 7d  lOff);.        }
171d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
171e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
171f0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
17200 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
17210 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17220 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
17230 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
17240 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74  e nRec value int
17250 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
17260 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e  le header. If in
17270 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  .        ** full
17280 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64  -synchronous mod
17290 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  e, sync the jour
172a0 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20  nal first. This 
172b0 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20  ensures that.   
172c0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61       ** all data
172d0 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20   has really hit 
172e0 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20  the disk before 
172f0 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
17300 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20  to mark.        
17310 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69  ** it as a candi
17320 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63  date for rollbac
17330 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  k..        **.  
17340 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
17350 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66   not required if
17360 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
17370 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74  media supports t
17380 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41  he.        ** SA
17390 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
173a0 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74  ty. Because in t
173b0 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
173c0 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20  ot possible .   
173d0 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62       ** for garb
173e0 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61  age data to be a
173f0 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66  ppended to the f
17400 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69  ile, the nRec fi
17410 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  eld.        ** i
17420 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
17430 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e   0xFFFFFFFF when
17440 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
17450 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20  der is written. 
17460 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65         ** and ne
17470 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
17480 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20  updated..       
17490 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
174a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
174b0 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49   && 0==(iDc&SQLI
174c0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
174d0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
174e0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
174f0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
17500 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
17510 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20  ager)));.       
17520 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
17530 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
17540 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
17550 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
17560 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
17570 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
17580 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17590 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
175a0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
175b0 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20        jrnlOff = 
175c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
175d0 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
175e0 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
175f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
17600 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
17610 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66  , pPager, jrnlOf
17620 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  f, 4));.        
17630 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
17640 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
17650 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e  nlOff, pPager->n
17660 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
17670 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
17680 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17690 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
176a0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
176b0 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
176c0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
176d0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
176e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
176f0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
17700 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
17710 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
17720 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
17730 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
17740 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
17750 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
17760 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
17770 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
17780 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
17790 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
177a0 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
177b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
177c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
177d0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
177e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
177f0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
17800 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
17810 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
17820 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
17830 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
17840 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
17850 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
17860 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28  eClearSyncFlags(
17870 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
17880 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17890 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
178a0 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
178b0 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
178c0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
178d0 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
178e0 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
178f0 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
17900 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
17910 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20   file. No calls 
17920 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74  are made.** to t
17930 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f  he page-cache to
17940 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73 20   mark the pages 
17950 61 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20  as clean. It is 
17960 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
17970 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c  ty.** of the cal
17980 6c 65 72 20 74 6f 20 75 73 65 20 50 63 61 63 68  ler to use Pcach
17990 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50  eCleanAll() or P
179a0 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
179b0 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20   to mark.** the 
179c0 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a  pages as clean..
179d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
179e0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
179f0 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
17a00 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
17a10 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
17a20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17a40 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
17a50 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
17a60 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
17a70 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
17a80 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
17a90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
17aa0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
17ab0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
17ac0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
17ad0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17ae0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
17af0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
17b00 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
17b10 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
17b20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
17b30 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
17b40 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
17b50 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
17b60 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
17b70 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
17b80 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
17b90 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
17ba0 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
17bb0 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
17bc0 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
17bd0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
17be0 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
17bf0 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
17c00 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
17c10 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
17c20 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
17c30 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
17c40 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
17c50 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
17c60 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
17c70 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
17c80 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
17c90 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
17ca0 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
17cb0 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
17cc0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
17cd0 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
17ce0 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
17cf0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
17d00 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
17d10 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
17d20 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
17d30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17d40 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
17d50 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
17d60 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
17d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17d80 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
17d90 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
17da0 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
17db0 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
17dc0 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
17dd0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
17de0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
17df0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
17e00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17e10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17e20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77  urn rc;.  }..  w
17e30 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a  hile( pList ){..
17e40 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
17e50 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
17e60 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
17e70 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20   it now. */.    
17e80 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
17e90 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
17ea0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
17eb0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20  ->tempFile);.   
17ec0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17ed0 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
17ee0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c  ger, pPager->fd,
17ef0 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67   pPager->vfsFlag
17f00 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  s);.      if( rc
17f10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17f20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
17f30 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
17f40 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
17f50 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
17f60 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
17f70 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
17f80 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
17f90 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67  means sqlite3Pag
17fa0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
17fb0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
17fc0 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
17fd0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
17fe0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
17ff0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
18000 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
18010 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
18020 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
18030 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
18040 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
18050 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30 3d 3d  r->dbSize && 0==
18060 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26 50 47  (pList->flags&PG
18070 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20  HDR_DONT_WRITE) 
18080 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
18090 73 65 74 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67  set = (pList->pg
180a0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
180b0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
180c0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d     char *pData =
180d0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
180e0 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c  pList->pData, pL
180f0 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a  ist->pgno, 6);..
18100 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
18110 28 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  (("STORE %d page
18120 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
18130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18140 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
18150 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
18160 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
18170 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20 20 20  sh(pList)));.   
18180 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
18190 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
181a0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
181b0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
181c0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
181d0 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
181e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
181f0 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
18200 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
18210 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
18220 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
18230 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
18240 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
18250 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
18260 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
18270 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
18280 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
18290 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
182a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
182b0 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
182c0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
182d0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
182e0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
182f0 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65    pPager->dbFile
18300 53 69 7a 65 20 3d 20 70 4c 69 73 74 2d 3e 70 67  Size = pList->pg
18310 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  no;.      }.    
18320 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
18330 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
18340 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
18350 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
18360 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18370 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
18380 6f 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  o));.    }.#endi
18390 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
183a0 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65 66  eturn rc;.#ifdef
183b0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
183c0 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70  GES.    pList->p
183d0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
183e0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b  pagehash(pList);
183f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73  .#endif.    pLis
18400 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74  t = pList->pDirt
18410 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  y;.  }..  return
18420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18430 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 70 61 67  *.** Add the pag
18440 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
18450 72 6e 61 6c 2e 20 49 74 20 69 73 20 74 68 65 20  rnal. It is the 
18460 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69  callers responsi
18470 62 69 6c 69 74 79 20 74 6f 0a 2a 2a 20 75 73 65  bility to.** use
18480 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67   subjRequiresPag
18490 65 28 29 20 74 6f 20 63 68 65 63 6b 20 74 68 61  e() to check tha
184a0 74 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72  t it is really r
184b0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 0a  equired before .
184c0 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
184d0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
184e0 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
184f0 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
18500 67 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  g){.  int rc;.  
18510 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70 50  void *pData = pP
18520 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67 65  g->pData;.  Page
18530 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18540 3e 70 50 61 67 65 72 3b 0a 20 20 69 36 34 20 6f  >pPager;.  i64 o
18550 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
18560 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67  stmtNRec*(4+pPag
18570 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18580 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
18590 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
185a0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
185b0 20 37 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41   7);..  PAGERTRA
185c0 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
185d0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
185e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
185f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  , pPg->pgno));..
18600 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
18610 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
18620 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
18630 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a  ->dbOrigSize );.
18640 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
18650 74 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  ts(pPager->sjfd,
18660 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
18670 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  no);.  if( rc==S
18680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18690 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
186a0 69 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ite(pPager->sjfd
186b0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
186c0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
186d0 65 74 2b 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28  et+4);.  }.  if(
186e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
186f0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
18700 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  mtNRec++;.    as
18710 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
18720 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
18730 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
18740 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
18750 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
18760 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18770 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
18780 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
18790 6c 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68  led by the pcach
187a0 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20  e layer when it 
187b0 68 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65  has reached some
187c0 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20  .** soft memory 
187d0 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d  limit. The argum
187e0 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ent is a pointer
187f0 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20   to a purgeable 
18800 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74  Pager .** object
18810 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18820 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65  attempts to make
18830 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20   a single dirty 
18840 70 61 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f  page that has no
18850 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
18860 72 65 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f  references (if o
18870 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e  ne exists) clean
18880 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
18890 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20  be recycled .** 
188a0 62 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61  by the pcache la
188b0 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yer..*/.static i
188c0 6e 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76  nt pagerStress(v
188d0 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70  oid *p, PgHdr *p
188e0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
188f0 61 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29  ager = (Pager *)
18900 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  p;.  int rc = SQ
18910 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
18920 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
18930 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
18940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
18950 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
18960 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
18970 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
18980 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
18990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
189a0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
189b0 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
189c0 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75      rc = syncJou
189d0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
189e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
189f0 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
18a00 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20  >fullSync && .  
18a10 20 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e        !(pPager->
18a20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
18a30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
18a40 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20  EMORY) &&.      
18a50 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76    !(sqlite3OsDev
18a60 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
18a70 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
18a80 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
18a90 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29  _APPEND).      )
18aa0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
18ab0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
18ac0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
18ad0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
18ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18af0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
18b10 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
18b20 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70        if( pPg->p
18b30 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 53 69  gno>pPager->dbSi
18b40 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75 69 72  ze && subjRequir
18b50 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a 20  esPage(pPg) ){. 
18b60 20 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a         rc = subj
18b70 6f 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b  ournalPage(pPg);
18b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18bb0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
18bc0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
18bd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18bf0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
18c00 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18c10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
18c20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18c30 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
18c40 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
18c50 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
18c60 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
18c70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
18c80 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
18c90 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ean(pPg);.  }.  
18ca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
18cb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
18cc0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
18cd0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
18ce0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
18cf0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
18d00 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
18d10 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
18d20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
18d30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18d50 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
18d60 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
18d70 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
18d80 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
18d90 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
18da0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
18db0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
18dc0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
18dd0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
18de0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  nal..**.** Retur
18df0 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e  n negative if un
18e00 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
18e10 65 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20  e the status of 
18e20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
18e30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18e40 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68  does not open th
18e50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
18e60 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a  o examine its.**
18e70 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65   content.  Hence
18e80 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  , the journal mi
18e90 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ght contain the 
18ea0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
18eb0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
18ec0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64   that has been d
18ed0 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63  eleted, and henc
18ee0 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f  e not be hot.  O
18ef0 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  r.** the header 
18f00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  of the journal m
18f10 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f  ight be zeroed o
18f20 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
18f30 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69  e.** does not di
18f40 73 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73  scover these cas
18f50 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20  es of a non-hot 
18f60 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65  journal - if the
18f70 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
18f80 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
18f90 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f  ot empty this ro
18fa0 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74  utine assumes it
18fb0 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65  .** is hot.  The
18fc0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
18fd0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
18fe0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
18ff0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
19000 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
19010 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f  ot and will no-o
19020 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
19030 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
19040 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
19050 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73  t *pExists){.  s
19060 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
19070 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
19080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19090 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69  TE_OK;.  int exi
190a0 73 74 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c  sts = 0;.  int l
190b0 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 61 73 73  ocked = 0;.  ass
190c0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
190d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
190e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
190f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19100 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
19110 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d   );.  *pExists =
19120 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
19130 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
19140 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
19150 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
19160 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
19170 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19180 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
19190 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
191a0 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
191b0 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
191c0 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
191d0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
191e0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
191f0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
19200 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20    int nPage;.   
19210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19220 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
19230 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
19240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19250 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e  OK ){.     if( n
19260 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
19270 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
19280 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
19290 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
192a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
192b0 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
192c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
192d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
192e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
192f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
19300 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
19310 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
19320 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
19330 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
19340 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
19350 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
19360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
19370 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
19380 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
19390 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
193a0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
193b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
193c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
193d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
193e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
193f0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
19400 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
19410 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
19420 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
19430 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
19440 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
19450 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
19460 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19470 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47  , offset);.  PAG
19480 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
19490 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
194a0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
194b0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
194c0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
194d0 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
194e0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69  ger, pgno));.  i
194f0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
19500 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19510 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
19520 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
19530 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
19540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
19570 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
19580 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
19590 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
195a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
195b0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
195c0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
195d0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
195e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
195f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
19600 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
19610 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 29  _pagehash(pPg)))
19620 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19630 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
19640 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
19650 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73   to obtain the s
19660 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69  hared lock requi
19670 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61  red before.** da
19680 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66  ta may be read f
19690 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
196a0 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72  che. If the shar
196b0 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65  ed lock has alre
196c0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61  ady.** been obta
196d0 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
196e0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
196f0 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c  **.** Immediatel
19700 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
19710 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  g the shared loc
19720 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  k (if required),
19730 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
19740 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68  * checks for a h
19750 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ot-journal file.
19760 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
19770 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  , an emergency r
19780 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65  ollback.** is pe
19790 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74  rformed immediat
197a0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
197b0 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  nt pagerSharedLo
197c0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
197d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
197e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
197f0 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b  sErrorReset = 0;
19800 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
19810 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
19820 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
19830 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
19840 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
19850 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
19860 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
19870 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
19880 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  s the chance to 
19890 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
198a0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
198b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
198c0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
198d0 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
198e0 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
198f0 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
19900 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
19910 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
19920 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
19930 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63  .   && sqlite3Pc
19940 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
19950 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
19960 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
19970 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  ode .  ){.    if
19980 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
19990 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69  lOpen ){.      i
199a0 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b  sErrorReset = 1;
199b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
199c0 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
199d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65  ITE_OK;.    page
199e0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
199f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
19a00 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c  e pager is still
19a10 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61   in an error sta
19a20 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65  te, do not proce
19a30 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20  ed. The error . 
19a40 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62   ** state will b
19a50 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d  e cleared at som
19a60 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
19a70 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70  uture when all p
19a80 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65  age .  ** refere
19a90 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64  nces are dropped
19aa0 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63   and the cache c
19ab0 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e  an be discarded.
19ac0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
19ad0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
19ae0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
19af0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
19b00 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
19b10 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
19b20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19b30 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19b40 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65  K || isErrorRese
19b50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
19b60 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
19b70 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
19b80 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  nt isHotJournal 
19b90 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
19ba0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
19bb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
19bc0 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
19bd0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
19be0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
19bf0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
19c00 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
19c10 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
19c20 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
19c30 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
19c40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19c50 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
19c60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
19c70 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
19c80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19c90 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
19ca0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
19cb0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
19cc0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
19cd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
19ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
19cf0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
19d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
19d10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19d20 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
19d30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
19d40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
19d50 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
19d60 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
19d70 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
19d80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
19d90 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
19da0 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
19db0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
19dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19dd0 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
19de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
19df0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
19e00 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  r, &isHotJournal
19e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19e30 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
19e40 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
19e50 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72  .    if( isError
19e60 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f  Reset || isHotJo
19e70 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  urnal ){.      /
19e80 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
19e90 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
19ea0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
19eb0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
19ec0 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
19ed0 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
19ee0 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
19ef0 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
19f00 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
19f10 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
19f20 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
19f30 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
19f40 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
19f50 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
19f60 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
19f70 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
19f80 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
19f90 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
19fa0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
19fb0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
19fc0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
19fd0 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
19fe0 20 0a 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e   .      ** back.
19ff0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
1a000 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   ** Because the 
1a010 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53  intermediate RES
1a020 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
1a030 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65  t requested, the
1a040 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64  .      ** second
1a050 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
1a060 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
1a070 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
1a080 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  fail to.      **
1a090 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20   obtain its own 
1a0a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1a0b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a0c0 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ile..      */.  
1a0d0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a0e0 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f  state<EXCLUSIVE_
1a0f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  LOCK ){.        
1a100 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1a110 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45  ck(pPager->fd, E
1a120 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1a130 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1a140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a150 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1a160 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1a170 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
1a180 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1a190 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1a1a0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1a1b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1a1c0 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f       }. .      /
1a1d0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
1a1e0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
1a1f0 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
1a200 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
1a210 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65      ** exclusive
1a220 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
1a230 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a240 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
1a250 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  en and.      ** 
1a260 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
1a270 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
1a280 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
1a290 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
1a2a0 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
1a2b0 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
1a2c0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1a2d0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
1a2e0 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  uires.      ** a
1a2f0 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65   read/write file
1a300 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a   handle..      *
1a310 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 45  /.      if( !isE
1a320 72 72 6f 72 52 65 73 65 74 20 26 26 20 70 50 61  rrorReset && pPa
1a330 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a340 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
1a350 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20 20 20  nt res;.        
1a360 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
1a370 63 65 73 73 28 70 56 66 73 2c 70 50 61 67 65 72  cess(pVfs,pPager
1a380 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c 49 54  ->zJournal,SQLIT
1a390 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
1a3a0 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20 20 69  &res);.        i
1a3b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1a3d0 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 20  ( res ){.       
1a3e0 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20       int fout = 
1a3f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
1a400 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
1a410 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c  EN_READWRITE|SQL
1a420 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1a430 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20  URNAL;.         
1a440 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1a450 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a460 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a470 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
1a480 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1a490 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
1a4a0 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20  fd, f, &fout);. 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1a4c0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
1a4d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
1a4e0 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20  >pMethods );.   
1a4f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1a500 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 66 6f  =SQLITE_OK && fo
1a510 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1a520 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  EADONLY ){.     
1a530 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1a540 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1a560 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
1a570 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
1a580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a5a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a       /* If the j
1a5b0 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
1a5c0 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e  exist, that mean
1a5d0 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
1a5e0 63 65 73 73 0a 20 20 20 20 20 20 20 20 20 20 20  cess.           
1a5f0 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
1a600 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a  rolled it back *
1a610 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
1a620 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1a630 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1a640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a670 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1a680 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1a690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a6a0 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
1a6b0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1a6c0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
1a6d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1a6e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
1a6f0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
1a700 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1a710 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1a720 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62   .      /* Playb
1a730 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
1a740 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
1a750 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
1a760 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  rite.      ** lo
1a770 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
1a780 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 20   the read lock. 
1a790 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65 20  Purge the cache 
1a7a0 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20  before.      ** 
1a7b0 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
1a7c0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f 20   hot-journal so 
1a7d0 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65 6e  that we don't en
1a7e0 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20 20  d up with.      
1a7f0 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  ** an inconsiste
1a800 6e 74 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  nt cache..      
1a810 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
1a820 50 63 61 63 68 65 43 6c 65 61 72 28 70 50 61 67  PcacheClear(pPag
1a830 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
1a840 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1a850 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1a860 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
1a870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a880 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1a890 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1a8a0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
1a8b0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1a8c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
1a8d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1a8e0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
1a8f0 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
1a900 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1a910 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
1a920 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
1a930 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
1a940 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
1a950 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
1a960 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
1a970 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
1a980 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
1a990 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
1a9a0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
1a9b0 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
1a9c0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
1a9d0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
1a9e0 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
1a9f0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
1aa00 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
1aa10 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
1aa20 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
1aa30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
1aa40 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
1aa50 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
1aa60 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
1aa70 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
1aa80 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
1aa90 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
1aaa0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1aab0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1aac0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1aad0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1aae0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
1aaf0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
1ab00 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
1ab10 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
1ab20 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
1ab30 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
1ab40 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
1ab50 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
1ab60 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
1ab70 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
1ab80 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
1ab90 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
1aba0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
1abb0 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
1abc0 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
1abd0 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
1abe0 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
1abf0 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
1ac00 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
1ac10 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
1ac20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
1ac30 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
1ac40 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
1ac50 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
1ac60 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
1ac70 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1ac80 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1ac90 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
1aca0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
1acb0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
1acc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1acd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1ace0 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69  er, 0);..      i
1acf0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1ad00 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  de ){.        rc
1ad10 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1ad20 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  de;.        goto
1ad30 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
1ad40 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
1ad50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
1ad60 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  lid );.      if(
1ad70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1ad80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54  0 ){.        IOT
1ad90 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
1ada0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1adb0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
1adc0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  s)));.        rc
1add0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
1ade0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62  (pPager->fd, &db
1adf0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
1ae00 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34  (dbFileVers), 24
1ae10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ae20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ae30 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1ae40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ailed;.        }
1ae50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ae60 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
1ae70 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
1ae80 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
1ae90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
1aea0 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
1aeb0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
1aec0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
1aed0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
1aee0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  0 ){.        pag
1aef0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
1af00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1af10 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1af20 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1af30 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
1af40 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1af50 20 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64   );.  }.. failed
1af60 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
1af70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1af80 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
1af90 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78  s a no-op for ex
1afa0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
1afb0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1afc0 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67  ases. */.    pag
1afd0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
1afe0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1aff0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
1b000 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
1b010 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
1b020 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
1b030 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
1b040 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1b050 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1b060 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
1b070 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
1b080 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1b090 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
1b0a0 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
1b0b0 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
1b0c0 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
1b0d0 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
1b0e0 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
1b0f0 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
1b100 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
1b110 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
1b120 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
1b130 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
1b140 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
1b150 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1b160 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
1b170 45 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69  ED_READ ){.    i
1b180 6e 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61  nt rc = readDbPa
1b190 67 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20  ge(pPg->pPager, 
1b1a0 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  pPg, pPg->pgno);
1b1b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1b1c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b1d0 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
1b1e0 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a  GHDR_NEED_READ;.
1b1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b200 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b210 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1b220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b230 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
1b240 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
1b250 61 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20  ached zero, and 
1b260 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
1b270 20 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c   in the.** middl
1b280 65 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61  e of a write tra
1b290 6e 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e  nsaction or open
1b2a0 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ed in exclusive 
1b2b0 6d 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e  mode, unlock it.
1b2c0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
1b2d0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
1b2e0 75 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67  used(Pager *pPag
1b2f0 65 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69  er){.  if( (sqli
1b300 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1b310 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1b320 65 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21  e)==0).    && (!
1b330 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1b340 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d  eMode || pPager-
1b350 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a  >journalOff>0) .
1b360 20 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e    ){.    pagerUn
1b370 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
1b380 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPager);.  }.}..
1b390 2f 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67  /*.** Drop a pag
1b3a0 65 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  e from the cache
1b3b0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63   using sqlite3Pc
1b3c0 61 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a  acheDrop()..**.*
1b3d0 2a 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  * If this means 
1b3e0 74 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f  there are now no
1b3f0 20 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65   pages with refe
1b400 72 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20  rences to them, 
1b410 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
1b420 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
1b430 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b440 65 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f  e is removed..*/
1b450 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
1b460 65 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67  erDropPage(DbPag
1b470 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1b480 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1b490 70 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65  pPager;.  sqlite
1b4a0 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29  3PcacheDrop(pPg)
1b4b0 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  ;.  pagerUnlockI
1b4c0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
1b4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
1b4e0 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1b4f0 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
1b500 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
1b510 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
1b520 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
1b530 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
1b540 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
1b550 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
1b560 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
1b570 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
1b580 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
1b590 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
1b5a0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1b5b0 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
1b5c0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
1b5d0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1b5e0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1b5f0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
1b600 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
1b610 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
1b620 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
1b630 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
1b640 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
1b650 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
1b660 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
1b670 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
1b680 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
1b690 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
1b6a0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
1b6b0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
1b6c0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
1b6d0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
1b6e0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
1b6f0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
1b700 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
1b710 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
1b720 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1b730 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
1b740 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1b750 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1b760 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1b770 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
1b780 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
1b790 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
1b7a0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
1b7b0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1b7c0 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
1b7d0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
1b7e0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
1b7f0 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
1b800 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
1b810 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
1b820 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
1b830 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
1b840 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
1b850 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
1b860 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
1b870 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
1b880 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
1b890 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
1b8a0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
1b8b0 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
1b8c0 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
1b8d0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
1b8e0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
1b8f0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
1b900 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
1b910 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1b920 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
1b930 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
1b940 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1b950 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
1b960 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
1b970 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
1b980 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
1b990 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
1b9a0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
1b9b0 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
1b9c0 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
1b9d0 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
1b9e0 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
1b9f0 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
1ba00 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
1ba10 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
1ba20 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
1ba30 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
1ba40 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
1ba50 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
1ba60 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1ba70 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
1ba80 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
1ba90 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1baa0 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
1bab0 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
1bac0 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
1bad0 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
1bae0 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
1baf0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bb00 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
1bb10 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
1bb20 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
1bb30 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
1bb40 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1bb50 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
1bb60 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1bb70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1bb80 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1bb90 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1bba0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
1bbb0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1bbc0 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
1bbd0 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
1bbe0 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
1bbf0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1bc00 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
1bc10 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
1bc20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
1bc30 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
1bc40 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
1bc50 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
1bc60 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  Hdr *pPg = 0;.  
1bc70 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bc80 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1bc90 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a  ==PAGER_UNLOCK .
1bca0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1bcb0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
1bcc0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1bcd0 3e 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67  >0 .       || pg
1bce0 6e 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a  no==1.  );..  /*
1bcf0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
1bd00 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
1bd10 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1bd20 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
1bd30 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72  e.  ** number gr
1bd40 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
1bd50 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71   or zero, is req
1bd60 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  uested..  */.  i
1bd70 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
1bd80 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
1bd90 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
1bda0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1bdb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1bdc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bdd0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  PT;.  }..  /* Ma
1bde0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
1bdf0 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
1be00 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
1be10 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  / .  assert( pPa
1be20 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  ger!=0 );.  *ppP
1be30 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  age = 0;..  /* I
1be40 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1be50 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1be60 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1be70 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1be80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1be90 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1bea0 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1beb0 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1bec0 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1bed0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1bee0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1bef0 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1bf00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bf10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1bf20 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1bf30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1bf40 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1bf50 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
1bf60 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
1bf70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
1bf80 70 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a  pgno, 1, &pPg);.
1bf90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bfa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1bfb0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
1bfc0 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29  pPg->pPager==0 )
1bfd0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
1bfe0 65 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65  er cache has cre
1bff0 61 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e  ated a new page.
1c000 20 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65   Its content nee
1c010 64 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65  ds to .    ** be
1c020 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
1c030 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61    */.    int nMa
1c040 78 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  x;.    PAGER_INC
1c050 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29  R(pPager->nMiss)
1c060 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
1c070 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
1c080 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74  memset(pPg->pExt
1c090 72 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  ra, 0, pPager->n
1c0a0 45 78 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20  Extra);..    rc 
1c0b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1c0c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
1c0d0 26 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20  &nMax);.    if( 
1c0e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c0f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
1c100 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1c110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c120 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e      }..    if( n
1c130 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
1c140 20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74   MEMDB || noCont
1c150 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ent ){.      if(
1c160 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78   pgno>pPager->mx
1c170 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
1c180 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c190 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1c1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1c1b0 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  LL;.      }.    
1c1c0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
1c1d0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
1c1e0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1c1f0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
1c200 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66  {.        pPg->f
1c210 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
1c220 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d  ED_READ;.      }
1c230 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1c240 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20  "ZERO %p %d\n", 
1c250 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1c260 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c270 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
1c280 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67  (pPager, pPg, pg
1c290 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1c2a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1c2b0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1c2c0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
1c2d0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
1c2e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1c2f0 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67  ; */.        pag
1c300 65 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b  erDropPage(pPg);
1c310 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c320 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1c330 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1c340 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
1c350 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
1c360 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1c370 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Pg);.#endif.  }e
1c380 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1c390 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
1c3a0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1c3b0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  che. */.    asse
1c3c0 72 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65  rt(sqlite3Pcache
1c3d0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
1c3e0 3e 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70  >pPCache)>0 || p
1c3f0 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47  gno==1);.    PAG
1c400 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1c410 6e 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21  nHit);.    if( !
1c420 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  noContent ){.   
1c430 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65     rc = pager_ge
1c440 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1c450 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1c460 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1c470 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1c480 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c490 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1c4a0 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20  .  }..  *ppPage 
1c4b0 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
1c4c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c4d0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
1c4e0 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
1c4f0 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
1c500 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
1c510 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
1c520 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
1c530 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1c540 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
1c550 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
1c560 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
1c570 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
1c580 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
1c590 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
1c5a0 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1c5b0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
1c5c0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
1c5d0 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
1c5e0 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
1c5f0 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
1c600 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
1c610 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1c620 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
1c630 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
1c640 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
1c650 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
1c660 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
1c670 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
1c680 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
1c690 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
1c6a0 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
1c6b0 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
1c6c0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1c6d0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1c6e0 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  g = 0;.  assert(
1c6f0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
1c700 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
1c710 29 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65  );..  if( (pPage
1c720 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1c730 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70  UNLOCK).   && (p
1c740 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
1c750 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1c760 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
1c770 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a  LITE_FULL).  ){.
1c780 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1c790 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
1c7a0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c  PCache, pgno, 0,
1c7b0 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72   &pPg);.  }..  r
1c7c0 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
1c7d0 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
1c7e0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
1c7f0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1c800 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1c810 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
1c820 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
1c830 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1c840 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
1c850 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
1c860 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
1c870 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
1c880 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1c890 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
1c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
1c8b0 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
1c8c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
1c8d0 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
1c8e0 29 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a  ){.  if( pPg ){.
1c8f0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
1c900 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1c910 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1c920 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a  heRelease(pPg);.
1c930 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49      pagerUnlockI
1c940 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
1c950 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1c960 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1c970 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * If the main jo
1c980 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
1c990 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
1c9a0 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ed, ensure that 
1c9b0 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  the.** sub-journ
1c9c0 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 20  al file is open 
1c9d0 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69 6e  too. If the main
1c9e0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20   journal is not 
1c9f0 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66 75  open,.** this fu
1ca00 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1ca10 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  p..**.** SQLITE_
1ca20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
1ca30 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f 65  f everything goe
1ca40 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 70  s according to p
1ca50 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20 53 51 4c 49  lan. An .** SQLI
1ca60 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
1ca70 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1ca80 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
1ca90 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  to .** sqlite3Os
1caa0 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  Open() fails..*/
1cab0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
1cac0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
1cad0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1cae0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1caf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1cb00 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 21 70  ournalOpen && !p
1cb10 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65  Pager->sjfd->pMe
1cb20 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 66 28  thods ){.    if(
1cb30 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1cb40 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1cb50 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
1cb60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d  {.      sqlite3M
1cb70 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50  emJournalOpen(pP
1cb80 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20  ager->sjfd);.   
1cb90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1cba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
1cbb0 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
1cbc0 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51  pPager->sjfd, SQ
1cbd0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1cbe0 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  RNAL);.    }.  }
1cbf0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cc00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1cc10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1cc20 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1cc30 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1cc40 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1cc50 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1cc60 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1cc70 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1cc80 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1cc90 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1cca0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1ccb0 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1ccc0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1ccd0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1cce0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1ccf0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1cd00 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1cd10 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1cd20 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1cd30 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33  ager){.  sqlite3
1cd40 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61  _vfs *pVfs = pPa
1cd50 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74  ger->pVfs;.  int
1cd60 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
1cd70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1cd80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1cd90 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
1cda0 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20 20 69 6e  N_CREATE);..  in
1cdb0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
1cdc0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1cdd0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1cde0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1cdf0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1ce00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ce10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1ce20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1ce30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1ce40 65 72 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  er, 0);.  pPager
1ce50 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
1ce60 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
1ce70 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
1ce80 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
1ce90 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
1cea0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1ceb0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
1cec0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
1ced0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a  n_journal;.  }..
1cee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1cef0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a  urnalOpen==0 ){.
1cf00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1cf10 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
1cf20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1cf30 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1cf40 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CLOSE|SQLITE_OPE
1cf50 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3b  N_TEMP_JOURNAL);
1cf60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cf70 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49    flags |= (SQLI
1cf80 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1cf90 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  RNAL);.    }.   
1cfa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1cfb0 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1cfc0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
1cfd0 52 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  RY ){.      sqli
1cfe0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65  te3MemJournalOpe
1cff0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  n(pPager->jfd);.
1d000 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d010 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1d020 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1d030 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1d040 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  TE.      rc = sq
1d050 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e  lite3JournalOpen
1d060 28 0a 20 20 20 20 20 20 20 20 20 20 70 56 66 73  (.          pVfs
1d070 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1d080 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  al, pPager->jfd,
1d090 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66   flags, jrnlBuff
1d0a0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20  erSize(pPager). 
1d0b0 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1d0c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d0d0 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1d0e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
1d0f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67  Pager->jfd, flag
1d100 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  s, 0);.#endif.  
1d110 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d120 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
1d130 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
1d140 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 70 50  ethods );.    pP
1d150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1d160 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1d170 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1d180 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1d190 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
1d1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d1b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1d1c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
1d1d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d1e0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
1d1f0 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
1d200 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
1d210 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
1d220 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1d230 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  l;.    }.  }.  p
1d240 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d250 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
1d260 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1d270 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1d280 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1d290 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
1d2a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1d2b0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
1d2c0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
1d2d0 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
1d2e0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1d2f0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
1d300 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
1d310 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1d320 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
1d330 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1d340 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1d350 3e 6e 53 61 76 65 70 6f 69 6e 74 20 26 26 20 72  >nSavepoint && r
1d360 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d370 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62      rc = openSub
1d380 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1d390 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1d3a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1d3b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
1d3c0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1d3d0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
1d3e0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1d3f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
1d400 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   0);.    if( rc=
1d410 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d420 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d430 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1d440 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61    return rc;..fa
1d450 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1d460 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42  rnal:.  sqlite3B
1d470 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
1d480 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
1d490 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
1d4a0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
1d4b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d4c0 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
1d4d0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
1d4e0 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
1d4f0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
1d500 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
1d510 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
1d520 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
1d530 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1d540 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73  mitPhaseTwo() is
1d550 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1d560 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1d570 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
1d580 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1d590 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69  e3PagerClose() i
1d5a0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1d5b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1d5c0 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
1d5d0 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
1d5e0 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
1d5f0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
1d600 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
1d610 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
1d620 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
1d630 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
1d640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1d650 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
1d660 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
1d670 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
1d680 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65  ly to.** acquire
1d690 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1d6a0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1d6b0 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
1d6c0 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  hat there is.** 
1d6d0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1d6e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1d6f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ase..**.** The s
1d700 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1d710 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75  indicates how mu
1d720 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  ch space in byte
1d730 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
1d740 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75   a.** master jou
1d750 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61  rnal file-name a
1d760 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1d770 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  he journal when 
1d780 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
1d790 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
1d7a0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
1d7b0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
1d7c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
1d7d0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  For temporary.**
1d7e0 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
1d7f0 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
1d800 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
1d810 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
1d820 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20  is an.** actual 
1d830 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
1d840 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1d850 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1d860 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72  ase is already r
1d870 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74  eserved for writ
1d880 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ing, this routin
1d890 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
1d8a0 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73  .** If exFlag is
1d8b0 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20   true, go ahead 
1d8c0 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55  and get an EXCLU
1d8d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1d8e0 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61   file.** immedia
1d8f0 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20  tely instead of 
1d900 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65  waiting until we
1d910 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68   try to flush th
1d920 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a  e cache.  The.**
1d930 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72   exFlag is ignor
1d940 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ed if a transact
1d950 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
1d960 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
1d970 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1d980 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  DbPage *pPg, int
1d990 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65   exFlag){.  Page
1d9a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d9b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1d9c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d9d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1d9e0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
1d9f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1da00 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1da10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1da20 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1da30 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
1da40 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
1da50 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
1da60 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1da70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1da80 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
1da90 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
1daa0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
1dab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dac0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1dad0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
1dae0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78 46  D;.      if( exF
1daf0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72  lag ){.        r
1db00 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1db10 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1db20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1db30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1db40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1db50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1db60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1db70 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1db80 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 50 41  ache = 0;.    PA
1db90 47 45 52 54 52 41 43 45 28 28 22 54 52 41 4e 53  GERTRACE(("TRANS
1dba0 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
1dbb0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 29 3b  GERID(pPager)));
1dbc0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1dbd0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1dbe0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1dbf0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
1dc00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1dc10 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1dc20 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1dc30 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1dc40 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1dc50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
1dc60 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1dc70 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1dc80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1dc90 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1dca0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1dcb0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1dcc0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1dcd0 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
1dce0 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1dcf0 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1dd00 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1dd10 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1dd20 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1dd30 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1dd40 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1dd50 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1dd60 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1dd70 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1dd80 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
1dd90 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1dda0 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
1ddb0 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
1ddc0 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
1ddd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1dde0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1ddf0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1de00 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  rt( pPager->dbOr
1de10 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  igSize==0 );.   
1de20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1de30 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1de40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1de50 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1de60 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67  er, 0);.    pPag
1de70 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
1de80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
1de90 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
1dea0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1deb0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
1dec0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1ded0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1dee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1def0 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
1df00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1df10 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1df20 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1df30 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1df40 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1df50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1df60 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1df70 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1df80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1df90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dfa0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
1dfb0 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
1dfc0 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
1dfd0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1dfe0 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
1dff0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1e000 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
1e010 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
1e020 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
1e030 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
1e040 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
1e050 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1e060 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e070 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
1e080 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
1e090 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
1e0a0 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
1e0b0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
1e0c0 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
1e0d0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
1e0e0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
1e0f0 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
1e100 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1e110 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
1e120 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
1e130 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
1e140 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
1e150 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
1e160 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
1e170 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
1e180 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
1e190 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
1e1a0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
1e1b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e1c0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
1e1d0 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
1e1e0 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
1e1f0 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
1e200 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1e210 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
1e220 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
1e230 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
1e240 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
1e250 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
1e260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1e270 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
1e280 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
1e290 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e2a0 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50 61  t() or sqlite3Pa
1e2b0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  gerRollback() to
1e2c0 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74  .** reset..*/.st
1e2d0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
1e2e0 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
1e2f0 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
1e300 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
1e310 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e320 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1e330 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e340 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
1e350 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
1e360 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1e370 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
1e380 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1e390 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1e3a0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
1e3b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1e3c0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
1e3d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1e3e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
1e3f0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1e400 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
1e410 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
1e420 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1e430 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1e440 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
1e450 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
1e460 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
1e470 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1e480 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
1e490 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
1e4a0 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
1e4b0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
1e4c0 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
1e4d0 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
1e4e0 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
1e4f0 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
1e500 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
1e510 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
1e520 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
1e530 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
1e540 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1e550 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
1e560 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
1e570 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
1e580 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
1e590 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
1e5a0 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
1e5b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1e5c0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
1e5d0 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
1e5e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e5f0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
1e600 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
1e610 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
1e620 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1e630 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
1e640 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
1e650 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
1e660 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
1e670 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1e680 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1e690 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
1e6a0 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a 52  l(pPg) && !subjR
1e6b0 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67 29  equiresPage(pPg)
1e6c0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1e6d0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1e6e0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
1e6f0 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
1e700 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
1e710 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
1e720 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1e730 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
1e740 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
1e750 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
1e760 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
1e770 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
1e780 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
1e790 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
1e7a0 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
1e7b0 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
1e7c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1e7d0 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
1e7e0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
1e7f0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
1e800 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1e810 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e820 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1e830 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1e840 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1e850 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
1e860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1e890 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1e8a0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1e8b0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
1e8c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1e8d0 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
1e8e0 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  Journal.        
1e8f0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1e900 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1e910 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1e920 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1e930 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1e940 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1e950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e960 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1e970 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1e980 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1e990 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
1e9a0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
1e9b0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
1e9c0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
1e9d0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
1e9e0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
1e9f0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
1ea00 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1ea10 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1ea20 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
1ea30 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1ea40 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
1ea50 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1ea60 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
1ea70 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1ea80 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
1ea90 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1eaa0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1eab0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
1eac0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
1ead0 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
1eae0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  ze ){.        u3
1eaf0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
1eb00 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
1eb10 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
1eb20 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
1eb30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1eb40 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
1eb50 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
1eb60 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1eb70 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1eb80 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1eb90 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1eba0 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1ebb0 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1ebc0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1ebd0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
1ebe0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1ebf0 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
1ec00 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1ec10 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1ec20 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
1ec30 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
1ec40 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
1ec50 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
1ec60 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1ec70 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1ec80 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
1ec90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1eca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ecb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ecc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1ecd0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1ece0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1ecf0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed10 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1ed20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
1ed30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1ed40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1ed50 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
1ed60 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
1ed70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1ed80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ed90 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1eda0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1edb0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
1edc0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
1edd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1ede0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1edf0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
1ee00 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1ee10 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
1ee20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ee30 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1ee50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1ee60 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ee70 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
1ee80 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1ee90 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
1eea0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
1eeb0 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52 4e 41  ERTRACE(("JOURNA
1eec0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
1eed0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
1eee0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1eef0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1ef00 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1ef10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
1ef20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1ef30 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
1ef40 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
1ef50 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20 20 20  h(pPg)));..     
1ef60 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20 61 6e     /* Even if an
1ef70 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c 6c 20   IO or diskfull 
1ef80 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77  error occurred w
1ef90 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  hile journalling
1efa0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1efb0 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c 6f 63  page in the bloc
1efc0 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74 68 65  k above, set the
1efd0 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61 67 20   need-sync flag 
1efe0 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 20 20  for the page..  
1eff0 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69        ** Otherwi
1f000 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74 72 61  se, when the tra
1f010 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
1f020 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c 6f 67  ed back, the log
1f030 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ic in.        **
1f040 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61   playback_one_pa
1f050 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e 6b 20  ge() will think 
1f060 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1f070 65 64 73 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eds to be restor
1f080 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ed.        ** in
1f090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f0a0 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20 49 4f  le. And if an IO
1f0b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
1f0c0 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a 20 20  ile doing so,.  
1f0d0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 6f        ** then co
1f0e0 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66 6f 6c  rruption may fol
1f0f0 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  low..        */.
1f100 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
1f110 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1f120 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c           pPg->fl
1f130 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
1f140 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20  D_SYNC;.        
1f150 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1f160 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
1f170 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  }..        /* An
1f180 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1f190 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
1f1a0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1f1b0 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  The .        ** 
1f1c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
1f1d0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1f1e0 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
1f1f0 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ve..        */. 
1f200 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1f210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f220 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f230 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1f240 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
1f250 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1f260 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1f270 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
1f280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f290 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
1f2a0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
1f2b0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1f2c0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d     testcase( rc=
1f2d0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
1f2e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f2f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1f300 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
1f310 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  EM );.        rc
1f320 20 7c 3d 20 61 64 64 54 6f 53 61 76 65 70 6f 69   |= addToSavepoi
1f330 6e 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72  ntBitvecs(pPager
1f340 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1f350 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f370 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
1f380 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
1f390 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1f3a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1f3b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f3c0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1f3d0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1f3e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1f3f0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
1f400 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
1f410 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1f420 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1f430 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1f440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f450 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 41    PAGERTRACE(("A
1f460 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1f470 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1f480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f490 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1f4a0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20  , pPg->pgno,.   
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 50              ((pP
1f4c0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1f4d0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29 29  EED_SYNC)?1:0)))
1f4e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f4f0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1f500 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1f510 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1f520 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1f530 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1f540 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1f550 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1f560 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1f570 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1f580 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1f590 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1f5a0 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1f5b0 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1f5c0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1f5d0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1f5e0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1f5f0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1f600 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1f610 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67 65  subjRequiresPage
1f620 28 70 50 67 29 20 29 7b 0a 20 20 20 20 20 20 72  (pPg) ){.      r
1f630 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61  c = subjournalPa
1f640 67 65 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  ge(pPg);.    }. 
1f650 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1f660 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1f670 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
1f680 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1f690 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1f6a0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
1f6b0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1f6c0 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  <pPg->pgno ){.  
1f6d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1f6e0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1f6f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1f700 53 69 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f  Size==(PAGER_MJ_
1f710 50 47 4e 4f 28 70 50 61 67 65 72 29 2d 31 29 20  PGNO(pPager)-1) 
1f720 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1f730 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
1f740 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f760 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1f770 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
1f780 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
1f790 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
1f7a0 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
1f7b0 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1f7c0 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
1f7d0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
1f7e0 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
1f7f0 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
1f800 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1f810 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1f820 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
1f830 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
1f840 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
1f850 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1f860 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
1f870 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
1f880 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
1f890 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
1f8a0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
1f8b0 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
1f8c0 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
1f8d0 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
1f8e0 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
1f8f0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1f900 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
1f910 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1f920 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
1f930 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1f940 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1f950 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1f960 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1f970 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1f980 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1f990 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
1f9a0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
1f9b0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1f9c0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1f9d0 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65  e);..  if( nPage
1f9e0 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1f9f0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1fa00 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1fa10 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1fa20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1fa30 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1fa40 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1fa50 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1fa60 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1fa70 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1fa80 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1fa90 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1faa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fab0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1fac0 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1fad0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1fae0 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65   ii;.    int nee
1faf0 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
1fb00 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74  /* Set the doNot
1fb10 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20  Sync flag to 1. 
1fb20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
1fb30 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  we cannot allow 
1fb40 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  a journal.    **
1fb50 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72   header to be wr
1fb60 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68  itten between th
1fb70 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65  e pages journale
1fb80 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1fb90 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  on..    */.    a
1fba0 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1fbb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fbc0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1fbd0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1fbe0 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
1fbf0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
1fc00 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
1fc10 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
1fc20 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
1fc30 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
1fc40 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
1fc50 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
1fc60 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
1fc70 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
1fc80 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
1fc90 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1fca0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1fcb0 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
1fcc0 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
1fcd0 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
1fce0 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
1fcf0 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  ;..    sqlite3Pa
1fd00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1fd10 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61  ger, (int *)&nPa
1fd20 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66  geCount);.    if
1fd30 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67  ( pPg->pgno>nPag
1fd40 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
1fd50 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67  nPage = (pPg->pg
1fd60 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20  no - pg1)+1;.   
1fd70 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b   }else if( (pg1+
1fd80 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
1fd90 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  )>nPageCount ){.
1fda0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
1fdb0 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a  ageCount+1-pg1;.
1fdc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fdd0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65   nPage = nPagePe
1fde0 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20  rSector;.    }. 
1fdf0 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e     assert(nPage>
1fe00 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  0);.    assert(p
1fe10 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  g1<=pPg->pgno);.
1fe20 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b      assert((pg1+
1fe30 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f  nPage)>pPg->pgno
1fe40 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
1fe50 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63  ; ii<nPage && rc
1fe60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b  ==SQLITE_OK; ii+
1fe70 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  +){.      Pgno p
1fe80 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20  g = pg1+ii;.    
1fe90 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
1fea0 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50        if( pg==pP
1feb0 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69  g->pgno || !sqli
1fec0 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
1fed0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1fee0 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20  , pg) ){.       
1fef0 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d   if( pg!=PAGER_M
1ff00 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1ff10 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ff20 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1ff30 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1ff40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1ff50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ff60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1ff70 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1ff80 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1ff90 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1ffa0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1ffb0 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
1ffc0 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
1ffd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ffe0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
1fff0 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  r->needSync);.  
20000 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20010 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20020 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
20030 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
20050 6c 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d  lse if( (pPage =
20060 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
20070 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b  ager, pg))!=0 ){
20080 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
20090 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
200a0 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
200b0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
200c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
200d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
200e0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
200f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20100 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 47      /* If the PG
20110 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
20120 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
20130 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
20140 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
20150 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
20160 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
20170 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
20180 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
20190 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
201a0 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
201b0 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
201c0 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
201d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
201e0 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
201f0 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
20200 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
20210 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
20220 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
20230 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
20240 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
20250 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
20260 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
20270 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
20280 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
20290 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a  r->noSync==0 );.
202a0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
202b0 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64  ii<nPage && need
202c0 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Sync; ii++){.   
202d0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
202e0 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
202f0 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29  (pPager, pg1+ii)
20300 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
20310 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
20320 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d   pPage->flags |=
20330 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
20340 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
20350 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
20360 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
20370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
20380 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
20390 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
203a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
203b0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
203c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
203d0 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
203e0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
203f0 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
20400 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
20410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20420 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
20430 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
20440 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
20450 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
20460 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
20470 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
20480 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
20490 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
204a0 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
204b0 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
204c0 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
204d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
204e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
204f0 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
20500 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
20510 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  rn pPg->flags&PG
20520 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e  HDR_DIRTY;.}.#en
20530 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
20540 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
20550 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
20560 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
20570 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
20580 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
20590 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70  mation on page p
205a0 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  Pg back to the d
205b0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
205c0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
205d0 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
205e0 20 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61   dirty.  This ha
205f0 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
20600 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  le, when.** the 
20610 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64  page has been ad
20620 64 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66  ded as a leaf of
20630 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
20640 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74  d so its.** cont
20650 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61  ent no longer ma
20660 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tters..**.** The
20670 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
20680 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
20690 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
206a0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
206b0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
206c0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
206d0 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
206e0 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
206f0 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
20700 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
20710 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
20720 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
20730 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
20740 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
20750 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
20760 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
20770 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
20780 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
20790 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
207a0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
207b0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
207c0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
207d0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
207e0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
207f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
20800 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 62  alled, set the b
20810 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
20820 20 74 6f 20 70 44 62 50 61 67 65 20 69 6e 0a 2a   to pDbPage in.*
20830 2a 20 74 68 65 20 50 61 67 65 72 2e 70 41 6c 77  * the Pager.pAlw
20840 61 79 73 52 6f 6c 6c 62 61 63 6b 20 62 69 74 76  aysRollback bitv
20850 65 63 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ec.  Subsequent 
20860 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
20870 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
20880 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
20890 61 6d 65 20 70 61 67 65 20 77 69 6c 6c 20 74 68  ame page will th
208a0 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
208b0 72 65 64 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  red..** This is 
208c0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
208d0 69 64 20 61 20 70 72 6f 62 6c 65 6d 20 77 68 65  id a problem whe
208e0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
208f0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ata is added to.
20900 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
20910 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
20920 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
20930 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
20940 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 6c 69  om the.** freeli
20950 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
20960 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 61  r part of the sa
20970 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
20980 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
20990 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 70 75 72 70  me.** other purp
209a0 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 20 69 73  ose.  When it is
209b0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
209c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
209d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
209e0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
209f0 65 75 73 65 64 2c 20 74 68 65 20 73 71 6c 69 74  eused, the sqlit
20a00 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
20a10 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
20a20 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 42 75 74 20   called..** But 
20a30 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
20a40 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63   contains critic
20a50 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
20a60 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
20a70 65 20 69 74 0a 2a 2a 20 67 65 74 73 20 72 6f 6c  e it.** gets rol
20a80 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
20a90 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
20aa0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
20ab0 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74  k() call..*/.int
20ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
20ad0 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  tWrite(DbPage *p
20ae0 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  DbPage){.  PgHdr
20af0 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
20b00 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
20b10 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
20b20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
20b30 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
20b40 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
20b50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20b60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
20b70 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73   pPager->pAlways
20b80 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20  Rollback==0 ){. 
20b90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20ba0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->pInJournal );
20bb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
20bc0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73  waysRollback = s
20bd0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
20be0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  te(pPager->dbOri
20bf0 67 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  gSize);.    if( 
20c00 21 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73  !pPager->pAlways
20c10 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
20c20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20c30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
20c40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
20c50 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
20c60 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
20c70 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  , pPg->pgno);.. 
20c80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20c90 4f 4b 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67  OK && (pPg->flag
20ca0 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26  s&PGHDR_DIRTY) &
20cb0 26 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  & pPager->nSavep
20cc0 6f 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61  oint==0 ){.    a
20cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20ce0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
20cf0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
20d00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50  ager->dbSize==pP
20d10 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
20d20 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3c 70 50  r->dbOrigSize<pP
20d30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
20d40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
20d50 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
20d60 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
20d70 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
20d80 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
20d90 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
20da0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
20db0 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
20dc0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
20dd0 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
20de0 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
20df0 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
20e00 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
20e10 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
20e20 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
20e30 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
20e40 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
20e50 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
20e60 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
20e70 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
20e80 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
20e90 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
20ea0 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
20eb0 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
20ec0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
20ed0 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
20ee0 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
20ef0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
20f00 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
20f10 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
20f20 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
20f30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
20f40 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
20f50 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
20f60 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
20f70 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
20f80 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
20f90 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
20fa0 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
20fb0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
20fc0 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67  pgno)).      pPg
20fd0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
20fe0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
20ff0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
21000 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
21010 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
21020 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
21030 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
21040 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21050 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
21060 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
21070 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
21080 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
21090 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
210a0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
210b0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
210c0 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
210d0 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
210e0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
210f0 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
21100 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
21110 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
21120 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
21130 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21140 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
21150 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
21160 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21170 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
21180 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
21190 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
211a0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
211b0 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
211c0 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
211d0 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
211e0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
211f0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
21200 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
21210 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
21220 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
21230 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
21240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21250 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
21260 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
21270 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
21280 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 54 45  Pg->pPager;.  TE
21290 53 54 4f 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20  STONLY( int rc; 
212a0 29 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c  )  /* Return val
212b0 75 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42  ue from sqlite3B
212c0 69 74 76 65 63 53 65 74 28 29 20 2a 2f 0a 0a 20  itvecSet() */.. 
212d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
212e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
212f0 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
21300 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
21310 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
21320 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20   or DontWrite() 
21330 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
21340 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67  on.  ** this pag
21350 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73  e (DontWrite() s
21360 65 74 73 20 74 68 65 20 50 61 67 65 72 2e 70 41  ets the Pager.pA
21370 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 62 69  lwaysRollback bi
21380 74 29 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20  t), then this.  
21390 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  ** function is a
213a0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
213b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
213c0 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20 7c 7c  alOpen==0 .   ||
213d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
213e0 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61  st(pPager->pAlwa
213f0 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d  ysRollback, pPg-
21400 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70 50 67  >pgno).   || pPg
21410 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
21420 62 4f 72 69 67 53 69 7a 65 0a 20 20 29 7b 0a 20  bOrigSize.  ){. 
21430 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
21440 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
21450 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 69 66  CURE_DELETE.  if
21460 28 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  ( sqlite3BitvecT
21470 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
21480 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
21490 6f 29 21 3d 30 0a 20 20 20 7c 7c 20 70 50 67 2d  o)!=0.   || pPg-
214a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
214b0 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
214c0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
214d0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45 43 55  if..  /* If SECU
214e0 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64 69 73  RE_DELETE is dis
214f0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 72  abled, then ther
21500 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  e is no way that
21510 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75 74 69   this.  ** routi
21520 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  ne can be called
21530 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72 20 77   on a page for w
21540 68 69 63 68 20 73 71 6c 69 74 65 33 50 61 67 65  hich sqlite3Page
21550 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20 20 2a  rDontWrite().  *
21560 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  * has not been p
21570 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c 65 64  reviously called
21580 20 64 75 72 69 6e 67 20 74 68 65 20 73 61 6d 65   during the same
21590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
215a0 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74 57 72  ** And if DontWr
215b0 69 74 65 28 29 20 68 61 73 20 70 72 65 76 69 6f  ite() has previo
215c0 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  usly been called
215d0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
215e0 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20    ** conditions 
215f0 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20 20 2a  must be met..  *
21600 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20  *.  ** (Later:) 
21610 20 4e 6f 74 20 74 72 75 65 2e 20 20 49 66 20 74   Not true.  If t
21620 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
21630 6f 72 72 75 70 74 65 64 20 62 79 20 68 61 76 69  orrupted by havi
21640 6e 67 20 64 75 70 6c 69 63 61 74 65 0a 20 20 2a  ng duplicate.  *
21650 2a 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  * pages on the f
21660 72 65 65 6c 69 73 74 20 28 65 78 3a 20 63 6f 72  reelist (ex: cor
21670 72 75 70 74 39 2e 74 65 73 74 29 20 74 68 65 6e  rupt9.test) then
21680 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
21690 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
216a0 73 61 72 69 6c 79 20 74 72 75 65 3a 0a 20 20 2a  sarily true:.  *
216b0 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21  /.  /* assert( !
216c0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
216d0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
216e0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72   <= pPager->dbOr
216f0 69 67 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a 20 20  igSize ); */..  
21700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21710 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
21720 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d  .  pPg->flags &=
21730 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41   ~PGHDR_NEED_REA
21740 44 3b 0a 0a 20 20 2f 2a 20 46 61 69 6c 75 72 65  D;..  /* Failure
21750 20 74 6f 20 73 65 74 20 74 68 65 20 62 69 74 73   to set the bits
21760 20 69 6e 20 74 68 65 20 49 6e 4a 6f 75 72 6e 61   in the InJourna
21770 6c 20 62 69 74 2d 76 65 63 74 6f 72 73 20 69 73  l bit-vectors is
21780 20 62 65 6e 69 67 6e 2e 0a 20 20 2a 2a 20 49 74   benign..  ** It
21790 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20 74 68   merely means th
217a0 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f 20 73  at we might do s
217b0 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b 20 74  ome extra work t
217c0 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 70 61 67 65  o journal a page
217d0 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20  .  ** that does 
217e0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6a  not need to be j
217f0 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65 72  ournaled.  Never
21800 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72 65  theless, be sure
21810 20 74 6f 20 74 65 73 74 20 74 68 65 0a 20 20 2a   to test the.  *
21820 2a 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  * case where a m
21830 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
21840 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
21850 74 6f 20 73 65 74 20 61 20 62 69 74 20 69 6e 20  to set a bit in 
21860 61 20 0a 20 20 2a 2a 20 62 69 74 20 76 65 63 74  a .  ** bit vect
21870 6f 72 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  or..  */.  sqlit
21880 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
21890 6c 6f 63 28 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  loc();.  TESTONL
218a0 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69 74 65  Y( rc = ) sqlite
218b0 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
218c0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
218d0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73  Pg->pgno);.  tes
218e0 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
218f0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 54 45 53  E_NOMEM );.  TES
21900 54 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20 61 64  TONLY( rc = ) ad
21910 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
21920 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
21930 3e 70 67 6e 6f 29 3b 0a 20 20 74 65 73 74 63 61  >pgno);.  testca
21940 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
21950 4f 4d 45 4d 20 29 3b 0a 20 20 73 71 6c 69 74 65  OMEM );.  sqlite
21960 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
21970 28 29 3b 0a 0a 0a 20 20 50 41 47 45 52 54 52 41  ();...  PAGERTRA
21980 43 45 28 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE(("DONT_ROLLBA
21990 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
219a0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
219b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
219c0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
219d0 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
219e0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
219f0 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  no)).}.../*.** T
21a00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
21a10 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
21a20 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
21a30 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
21a40 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
21a50 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
21a60 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
21a70 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21a80 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
21a90 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
21aa0 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74 29  r, int isDirect)
21ab0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
21ac0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
21ad0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
21ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
21af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
21b00 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
21b10 54 45 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  TE.  assert( isD
21b20 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20  irect==0 );  /* 
21b30 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c 79  isDirect is only
21b40 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69 63   true for atomic
21b50 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69   writes */.#endi
21b60 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  f.  if( !pPager-
21b70 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
21b80 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
21b90 7a 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  ze>0 ){.    /* O
21ba0 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
21bb0 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
21bc0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
21bd0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
21be0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
21bf0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
21c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21c10 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
21c20 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
21c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21c40 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
21c50 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
21c60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
21c70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
21c80 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
21c90 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21ca0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
21cb0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
21cc0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
21cd0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
21ce0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
21cf0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
21d00 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
21d10 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
21d20 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
21d30 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
21d40 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
21d50 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
21d60 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61  har*)pPgHdr->pDa
21d70 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  ta)+24, change_c
21d80 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65 66  ounter);..#ifdef
21d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
21da0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
21db0 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26 20  if( isDirect && 
21dc0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
21dd0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f  hods ){.      co
21de0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d  nst void *zBuf =
21df0 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a   pPgHdr->pData;.
21e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
21e10 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
21e20 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
21e30 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
21e40 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
21e50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21e60 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65  ze, 0);.    }.#e
21e70 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c  ndif..    /* Rel
21e80 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
21e90 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
21ea0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21eb0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
21ec0 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
21ed0 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
21ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21ef0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
21f00 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
21f10 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
21f20 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
21f30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
21f40 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   rc;.  if( MEMDB
21f50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
21f60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
21f70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21f80 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
21f90 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
21fa0 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72  _flags);.  }.  r
21fb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21fc0 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
21fd0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
21fe0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
21ff0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
22000 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
22010 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
22020 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
22030 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
22040 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
22050 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
22060 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
22070 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
22080 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
22090 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
220a0 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
220b0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
220c0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
220d0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
220e0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
220f0 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
22100 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
22110 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
22120 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
22130 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22140 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
22150 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
22160 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
22170 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
22180 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
22190 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
221a0 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
221b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
221c0 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
221d0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
221e0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
221f0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
22200 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
22210 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
22220 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
22230 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
22240 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
22250 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72  If the final par
22260 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20  ameter - noSync 
22270 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  - is true, then 
22280 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22290 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e  e itself.** is n
222a0 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63  ot synced. The c
222b0 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20  aller must call 
222c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
222d0 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  () directly to.*
222e0 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  * sync the datab
222f0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ase file before 
22300 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68  calling CommitPh
22310 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65  aseTwo() to dele
22320 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  te the.** journa
22330 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63  l file in this c
22340 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
22350 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
22360 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20  aseOne(.  Pager 
22370 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73  *pPager, .  cons
22380 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
22390 20 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29   .  int noSync.)
223a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
223b0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
223c0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
223d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
223e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
223f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68  }..  /* If no ch
22400 61 6e 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  anges have been 
22410 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61  made, we can lea
22420 76 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ve the transacti
22430 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20  on early..  */. 
22440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
22450 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20  odified==0 &&.  
22460 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a        (pPager->j
22470 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
22480 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
22490 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20  LETE ||.        
224a0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
224b0 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20  iveMode!=0) ){. 
224c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
224d0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
224e0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
224f0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
22500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22510 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
22520 54 52 41 43 45 28 28 22 44 41 54 41 42 41 53 45  TRACE(("DATABASE
22530 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
22540 4d 61 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d  Master=%s nSize=
22550 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
22560 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
22570 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
22580 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 2f  ->dbSize));..  /
22590 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
225a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
225b0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
225c0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
225d0 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
225e0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
225f0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
22600 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
22610 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22620 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
22630 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
22640 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
22650 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
22660 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66 20  r *pPg;..#ifdef 
22670 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
22680 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 2f  OMIC_WRITE.    /
22690 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  * The atomic-wri
226a0 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
226b0 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20 61  can be used if a
226c0 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ll of the.    **
226d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
226e0 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  rue:.    **.    
226f0 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c 65  **    + The file
22700 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
22710 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
22720 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20  e property for. 
22730 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b     **      block
22740 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73  s of size page-s
22750 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ize, and.    ** 
22760 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69 74     + This commit
22770 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
22780 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
22790 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
227a0 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74 6c    **    + Exactl
227b0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
227c0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
227d0 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
227e0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
227f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
22800 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
22810 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e 20  n be used, then 
22820 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22830 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20 20   will never.    
22840 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66 6f  ** be created fo
22850 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  r this transacti
22860 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
22870 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  nt useAtomicWrit
22880 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  e;.    pPg = sql
22890 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
228a0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
228b0 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41 74 6f  che);.    useAto
228c0 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20  micWrite = (.   
228d0 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26       !zMaster &&
228e0 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
228f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
22900 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
22910 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e  >journalOff==jrn
22920 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50 61 67  lBufferSize(pPag
22930 65 72 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  er) && .        
22940 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
22950 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
22960 7a 65 20 26 26 20 0a 20 20 20 20 20 20 20 20 28  ze && .        (
22970 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  pPg==0 || pPg->p
22980 44 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b  Dirty==0).    );
22990 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
229a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
229b0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
229c0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
229d0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
229e0 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
229f0 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
22a00 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
22a10 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
22a20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
22a30 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
22a40 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
22a50 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
22a60 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
22a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
22a80 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
22a90 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
22aa0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
22ab0 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
22ac0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
22ad0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
22ae0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
22af0 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
22b00 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
22b10 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
22b20 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
22b30 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
22b40 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
22b50 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
22b60 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
22b70 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
22b80 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
22b90 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
22ba0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
22bb0 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
22bc0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
22bd0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
22be0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
22bf0 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
22c00 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
22c10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
22c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22c30 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
22c40 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
22c50 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
22c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
22c70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
22c80 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
22c90 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
22ca0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
22cb0 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
22cc0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22cd0 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
22ce0 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
22cf0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
22d00 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
22d10 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
22d20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
22d30 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
22d40 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
22d50 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
22d60 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
22d70 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
22d80 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
22d90 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
22da0 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
22db0 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
22dc0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
22dd0 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
22de0 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
22df0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
22e00 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
22e10 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
22e20 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
22e30 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
22e40 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
22e50 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
22e60 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
22e70 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
22e80 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ager, 0);.      
22e90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22ea0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
22eb0 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  it;.      if( pP
22ec0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
22ed0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
22ee0 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e  MODE_OFF ){.#ifn
22ef0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22f00 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
22f10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
22f20 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
22f30 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
22f40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
22f50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
22f60 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
22f70 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
22f80 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
22f90 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
22fa0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
22fb0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
22fc0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
22fd0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
22fe0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
22ff0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23000 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
23010 20 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70 20       Pgno iSkip 
23020 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
23030 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
23040 20 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d     Pgno dbSize =
23050 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
23060 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
23070 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
23080 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a  er->dbOrigSize;.
23090 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 69            for( i
230a0 3d 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50  =dbSize+1; i<=pP
230b0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
230c0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
230d0 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
230e0 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67  3BitvecTest(pPag
230f0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
23100 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  i) && i!=iSkip )
23110 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23120 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23130 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
23140 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
23150 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23160 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
23170 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
23180 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23190 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
231a0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
231b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
231c0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
231d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
231e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
231f0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
23200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23210 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 20      } .         
23220 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
23230 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20  = dbSize;.      
23240 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
23250 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
23260 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
23270 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
23280 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
23290 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
232a0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
232b0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
232c0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
232d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
232e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
232f0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
23300 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
23310 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
23320 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
23330 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
23340 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69   sqlite3PcacheDi
23350 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
23360 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63  pPCache);.    rc
23370 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
23380 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
23390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
233a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
233b0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
233c0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b  IOERR_BLOCKED );
233d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72  .      /* The er
233e0 72 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c  ror might have l
233f0 65 66 74 20 74 68 65 20 64 69 72 74 79 20 6c 69  eft the dirty li
23400 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70  st all fouled up
23410 20 68 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20   here,.      ** 
23420 62 75 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  but that does no
23430 74 20 6d 61 74 74 65 72 20 62 65 63 61 75 73 65  t matter because
23440 20 69 66 20 74 68 65 20 69 66 20 74 68 65 20 64   if the if the d
23450 69 72 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20  irty list did.  
23460 20 20 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75      ** get corru
23470 70 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74  pted, then the t
23480 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
23490 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20  roll back and.  
234a0 20 20 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74      ** discard t
234b0 68 65 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20  he dirty list.  
234c0 54 68 65 72 65 20 69 73 20 61 6e 20 61 73 73 65  There is an asse
234d0 72 74 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70  rt in.      ** p
234e0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
234f0 74 79 5f 70 61 67 65 73 28 29 20 74 68 61 74 20  ty_pages() that 
23500 76 65 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f  verifies that no
23510 20 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a   attempt.      *
23520 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65  * is made to use
23530 20 61 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74   an invalid dirt
23540 79 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f  y list..      */
23550 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63  .      goto sync
23560 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
23570 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
23580 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70  eanAll(pPager->p
23590 50 43 61 63 68 65 29 3b 0a 0a 20 20 20 20 69 66  PCache);..    if
235a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
235b0 3c 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53  <pPager->dbFileS
235c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
235d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
235e0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
235f0 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  IVE );.      rc 
23600 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
23610 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
23620 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  >dbSize);.      
23630 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23640 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
23650 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
23660 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
23670 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
23680 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
23690 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
236a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
236b0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
236c0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
236d0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
236e0 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
236f0 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
23700 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
23710 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
23720 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
23730 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
23740 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
23750 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
23760 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
23770 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
23780 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
23790 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
237a0 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
237b0 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
237c0 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
237d0 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
237e0 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
237f0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
23800 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
23810 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
23820 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
23830 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
23840 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
23850 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
23860 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  SY;.  }.  return
23870 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
23880 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
23890 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
238a0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
238b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
238c0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
238d0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
238e0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
238f0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
23900 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
23910 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
23920 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
23930 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
23940 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
23950 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
23960 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
23970 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
23980 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
23990 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
239a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
239b0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
239c0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
239d0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
239e0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
239f0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
23a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23a10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23a20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
23a30 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  ied==0 &&.      
23a40 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e    (pPager->journ
23a50 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
23a60 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
23a70 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50   ||.          pP
23a80 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
23a90 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61  ode!=0) ){.    a
23aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
23ab0 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
23ac0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23ad0 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  pen==0 );.    re
23ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23af0 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45    }.  PAGERTRACE
23b00 28 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  (("COMMIT %d\n",
23b10 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23b20 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
23b30 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
23b40 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d  ER_SYNCED || MEM
23b50 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  DB || !pPager->d
23b60 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
23b70 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
23b80 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
23b90 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
23ba0 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ter);.  rc = pag
23bb0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
23bc0 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72   rc);.  return r
23bd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
23be0 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
23bf0 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
23c00 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
23c10 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
23c20 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
23c30 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
23c40 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
23c50 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
23c60 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
23c70 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
23c80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
23c90 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
23ca0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
23cb0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
23cc0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
23cd0 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
23ce0 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e  g protocol or un
23cf0 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a  less some other.
23d00 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72  ** process is wr
23d10 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f  iting trash into
23d20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
23d30 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e (SQLITE_CORRUP
23d40 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20  T) or.** unless 
23d50 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29  a prior malloc()
23d60 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f   failed (SQLITE_
23d70 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72  NOMEM).  Appropr
23d80 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  iate error.** co
23d90 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64  des are returned
23da0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f   for all these o
23db0 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72  ccasions.  Other
23dc0 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  wise,.** SQLITE_
23dd0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
23de0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23df0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  gerRollback(Page
23e00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
23e10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23e20 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ;.  PAGERTRACE((
23e30 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
23e40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
23e50 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
23e60 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
23e70 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
23e80 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
23e90 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
23ea0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
23eb0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
23ec0 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
23ed0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
23ee0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
23ef0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
23f00 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
23f10 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
23f20 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
23f30 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
23f40 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
23f50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
23f60 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
23f70 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
23f80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23f90 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
23fa0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
23fb0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23fc0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
23fd0 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
23fe0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
23ff0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
24000 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
24010 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24020 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24030 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
24040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
24050 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
24060 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
24070 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
24080 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
24090 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
240a0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
240b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
240c0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
240d0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
240e0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
240f0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
24100 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
24110 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
24120 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
24130 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
24140 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
24150 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
24160 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
24170 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
24180 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
24190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
241a0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
241b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
241c0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
241d0 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
241e0 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
241f0 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
24200 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
24210 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
24220 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
24230 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24240 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
24250 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
24260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
24270 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
24280 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
24290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
242a0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
242b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
242c0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
242d0 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
242e0 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
242f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24300 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
24310 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
24320 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
24330 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
24340 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
24350 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
24360 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
24370 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
24380 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
24390 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
243a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
243b0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
243c0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
243d0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
243e0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
243f0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
24400 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
24410 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
24420 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
24430 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
24440 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
24450 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
24460 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
24470 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
24480 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
24490 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
244a0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
244b0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
244c0 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
244d0 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
244e0 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
244f0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
24500 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
24510 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
24520 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
24530 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
24540 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
24550 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
24560 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
24570 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
24580 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
24590 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
245a0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
245b0 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65   a;.}.int sqlite
245c0 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61  3PagerIsMemdb(Pa
245d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
245e0 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a  return MEMDB;.}.
245f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 6e  #endif../*.** En
24600 73 75 72 65 20 74 68 61 74 20 74 68 65 72 65 20  sure that there 
24610 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e 53 61  are at least nSa
24620 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f 69 6e  vepoint savepoin
24630 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ts open..*/.int 
24640 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
24650 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
24660 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61  *pPager, int nSa
24670 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
24680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24690 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f 69 6e  .  if( nSavepoin
246a0 74 3e 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  t>pPager->nSavep
246b0 6f 69 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e  oint && pPager->
246c0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
246d0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 50 61    int ii;.    Pa
246e0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e  gerSavepoint *aN
246f0 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 45 69 74 68  ew;..    /* Eith
24700 65 72 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  er there is no a
24710 63 74 69 76 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  ctive journal or
24720 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
24730 20 69 73 20 6f 70 65 6e 20 6f 72 20 0a 20 20 20   is open or .   
24740 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
24750 69 73 20 61 6c 77 61 79 73 20 73 74 6f 72 65 64  is always stored
24760 20 69 6e 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   in memory */.  
24770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
24780 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
24790 7c 7c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d  || pPager->sjfd-
247a0 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 0a 20 20 20  >pMethods ||.   
247b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
247c0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
247d0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
247e0 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20 20 2f  MEMORY );..    /
247f0 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
24800 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
24810 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
24820 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
24830 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
24840 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
24850 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
24860 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
24870 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
24880 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
24890 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
248a0 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
248b0 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
248c0 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
248d0 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
248e0 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
248f0 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
24900 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
24910 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
24920 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
24930 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
24940 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
24950 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
24960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
24970 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
24980 6d 73 65 74 28 26 61 4e 65 77 5b 70 50 61 67 65  mset(&aNew[pPage
24990 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 5d 2c 20  r->nSavepoint], 
249a0 30 2c 0a 20 20 20 20 20 20 20 20 28 6e 53 61 76  0,.        (nSav
249b0 65 70 6f 69 6e 74 20 2d 20 70 50 61 67 65 72 2d  epoint - pPager-
249c0 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 2a 20 73  >nSavepoint) * s
249d0 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
249e0 6f 69 6e 74 29 0a 20 20 20 20 29 3b 0a 20 20 20  oint).    );.   
249f0 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
24a00 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  int = aNew;.    
24a10 69 69 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61  ii = pPager->nSa
24a20 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 70 50 61  vepoint;.    pPa
24a30 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  ger->nSavepoint 
24a40 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20  = nSavepoint;.. 
24a50 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
24a60 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
24a70 74 20 73 74 72 75 63 74 75 72 65 73 20 6a 75 73  t structures jus
24a80 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a  t allocated. */.
24a90 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70      for(/* no-op
24aa0 20 2a 2f 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69   */; ii<nSavepoi
24ab0 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
24ac0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24ad0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
24ae0 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e        aNew[ii].n
24af0 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64  Orig = pPager->d
24b00 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  bSize;.      if(
24b10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
24b20 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
24b30 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a  journalOff>0 ){.
24b40 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
24b50 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  .iOffset = pPage
24b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
24b70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24b80 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66      aNew[ii].iOf
24b90 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48  fset = JOURNAL_H
24ba0 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
24bb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 4e 65       }.      aNe
24bc0 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20 3d 20  w[ii].iSubRec = 
24bd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
24be0 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
24bf0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  .pInSavepoint = 
24c00 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
24c10 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
24c20 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
24c30 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65  aNew[ii].pInSave
24c40 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  point ){.       
24c50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
24c60 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
24c70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e    }..    /* Open
24c80 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
24c90 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
24ca0 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20 2a  lready opened. *
24cb0 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  /.    rc = openS
24cc0 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
24cd0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
24ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
24cf0 72 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c  rameter op is al
24d00 77 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45  ways either SAVE
24d10 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f  POINT_ROLLBACK o
24d20 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
24d30 41 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  ASE..** If it is
24d40 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
24d50 53 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65  SE, then release
24d60 20 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65   and destroy the
24d70 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
24d80 2a 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f  ** index iSavepo
24d90 69 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41  int. If it is SA
24da0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
24db0 2c 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20  , then rollback 
24dc0 61 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74  all changes.** t
24dd0 68 61 74 20 68 61 76 65 20 6f 63 63 75 72 65 64  hat have occured
24de0 20 73 69 6e 63 65 20 73 61 76 65 70 6f 69 6e 74   since savepoint
24df0 20 69 53 61 76 65 70 6f 69 6e 74 20 77 61 73 20   iSavepoint was 
24e00 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  created..**.** I
24e10 6e 20 65 69 74 68 65 72 20 63 61 73 65 2c 20 61  n either case, a
24e20 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69  ll savepoints wi
24e30 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  th an index grea
24e40 74 65 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f  ter than iSavepo
24e50 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74  int .** are dest
24e60 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  royed..**.** If 
24e70 74 68 65 72 65 20 61 72 65 20 6c 65 73 73 20 74  there are less t
24e80 68 61 6e 20 28 69 53 61 76 65 70 6f 69 6e 74 2b  han (iSavepoint+
24e90 31 29 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  1) active savepo
24ea0 69 6e 74 73 20 77 68 65 6e 20 74 68 69 73 20 0a  ints when this .
24eb0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  ** function is c
24ec0 61 6c 6c 65 64 20 69 74 20 69 73 20 61 20 6e 6f  alled it is a no
24ed0 2d 6f 70 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  -op..*/ .int sql
24ee0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
24ef0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
24f00 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
24f10 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
24f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24f30 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  ..  assert( op==
24f40 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
24f50 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
24f60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
24f70 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
24f80 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
24f90 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
24fa0 69 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 20  i;.    int nNew 
24fb0 3d 20 69 53 61 76 65 70 6f 69 6e 74 20 2b 20 28  = iSavepoint + (
24fc0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
24fd0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 66 6f 72  LLBACK);.    for
24fe0 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
24ff0 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
25000 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
25010 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
25020 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
25030 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
25040 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
25050 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
25060 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
25070 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
25080 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26  OINT_ROLLBACK &&
25090 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d   pPager->jfd->pM
250a0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
250b0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
250c0 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e  pSavepoint = (nN
250d0 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72  ew==0)?0:&pPager
250e0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65  ->aSavepoint[nNe
250f0 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d  w-1];.      rc =
25100 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
25110 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20  vepoint(pPager, 
25120 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  pSavepoint);.   
25130 20 20 20 61 73 73 65 72 74 28 72 63 21 3d 53 51     assert(rc!=SQ
25140 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20  LITE_DONE);.    
25150 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
25160 68 69 73 20 69 73 20 61 20 72 65 6c 65 61 73 65  his is a release
25170 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
25180 74 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75  t savepoint, tru
25190 6e 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68  ncate .    ** th
251a0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  e sub-journal. *
251b0 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d  /.    if( nNew==
251c0 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 && op==SAVEPOI
251d0 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 70 50  NT_RELEASE && pP
251e0 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74  ager->sjfd->pMet
251f0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
25200 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
25210 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20  _OK );.      rc 
25220 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
25230 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  ate(pPager->sjfd
25240 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
25250 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
25260 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
25270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
25280 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
25290 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
252a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
252b0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
252c0 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
252d0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
252e0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
252f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
25300 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
25310 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75   the VFS structu
25320 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  re for the pager
25330 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
25340 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50  e3_vfs *sqlite3P
25350 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70  agerVfs(Pager *p
25360 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
25370 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d   pPager->pVfs;.}
25380 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25390 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
253a0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
253b0 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a  file associated.
253c0 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
253d0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72  r.  This might r
253e0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68  eturn NULL if th
253f0 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f  e file has.** no
25400 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
25410 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69  d..*/.sqlite3_fi
25420 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  le *sqlite3Pager
25430 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  File(Pager *pPag
25440 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
25450 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a  ager->fd;.}../*.
25460 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
25470 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
25480 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
25490 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
254a0 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
254b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
254c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
254d0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
254e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
254f0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
25500 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
25510 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
25520 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
25530 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
25540 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
25550 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
25560 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
25570 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
25580 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
25590 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
255a0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
255b0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
255c0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
255d0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
255e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
255f0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
25600 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
25610 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
25620 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
25630 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
25640 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
25650 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
25660 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
25670 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
25680 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
25690 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
256a0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
256b0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
256c0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
256d0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
256e0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
256f0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
25700 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  decArg;.}.#endif
25710 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
25720 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25730 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
25740 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61  page pPg to loca
25750 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
25760 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
25770 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
25780 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
25790 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
257a0 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67  located at.** pg
257b0 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c  no (which we cal
257c0 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68  l pPgOld) though
257d0 20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c   that page is al
257e0 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69  lowed to be.** i
257f0 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65  n cache.  If the
25800 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79   page previously
25810 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
25820 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
25830 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
25840 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
25850 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
25860 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
25870 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
25880 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
25890 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
258a0 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
258b0 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
258c0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
258d0 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
258e0 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
258f0 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
25900 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
25910 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
25920 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
25930 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
25940 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
25950 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
25960 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
25970 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
25980 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
25990 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
259a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
259b0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
259c0 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
259d0 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
259e0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
259f0 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
25a00 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
25a10 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
25a20 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
25a30 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a   is active)..**.
25a40 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68  ** If the fourth
25a50 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d   argument, isCom
25a60 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  mit, is non-zero
25a70 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
25a80 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76   is being.** mov
25a90 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  ed as part of a 
25aa0 64 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e  database reorgan
25ab0 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66  ization just bef
25ac0 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
25ad0 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67  ion .** is being
25ae0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74   committed. In t
25af0 68 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20  his case, it is 
25b00 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
25b10 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
25b20 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73  e .** pPg refers
25b30 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   to will not be 
25b40 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e  written to again
25b50 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
25b60 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
25b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
25b80 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  epage(Pager *pPa
25b90 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67  ger, DbPage *pPg
25ba0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74  , Pgno pgno, int
25bb0 20 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67   isCommit){.  Pg
25bc0 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a  Hdr *pPgOld;  /*
25bd0 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
25be0 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
25bf0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
25c00 67 6e 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  gno = 0;.  int r
25c10 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  c;..  assert( pP
25c20 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
25c30 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
25c40 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
25c50 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
25c60 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
25c70 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
25c80 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
25c90 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
25ca0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
25cb0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
25cc0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
25cd0 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
25ce0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
25cf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
25d00 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
25d10 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
25d20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
25d30 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
25d40 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
25d50 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
25d60 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
25d70 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
25d80 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
25d90 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
25da0 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
25db0 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
25dc0 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
25dd0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
25de0 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
25df0 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
25e00 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
25e10 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
25e20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
25e30 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
25e40 6d 65 6e 74 20 77 65 72 65 20 70 72 6f 63 65 73  ment were proces
25e50 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
25e60 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
25e70 5f 44 49 52 54 59 20 0a 20 20 20 26 26 20 73 75  _DIRTY .   && su
25e80 62 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 70  bjRequiresPage(p
25e90 50 67 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45  Pg).   && SQLITE
25ea0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f  _OK!=(rc = subjo
25eb0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a  urnalPage(pPg)).
25ec0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
25ed0 72 63 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  rc;.  }..  PAGER
25ee0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20  TRACE(("MOVE %d 
25ef0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
25f00 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
25f10 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
25f20 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
25f30 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
25f40 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
25f50 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
25f60 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d  );.  IOTRACE(("M
25f70 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c  OVE %p %d %d\n",
25f80 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
25f90 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61  no, pgno))..  pa
25fa0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
25fb0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
25fc0 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
25fd0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
25fe0 62 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d  before page pPg-
25ff0 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62  >pgno can.  ** b
26000 65 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74  e written to, st
26010 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e  ore pPg->pgno in
26020 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20   local variable 
26030 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
26040 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69  **.  ** If the i
26050 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  sCommit flag is 
26060 73 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  set, there is no
26070 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
26080 72 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20  r that.  ** the 
26090 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
260a0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
260b0 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
260c0 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a  e pPg->pgno .  *
260d0 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
260e0 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
260f0 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
26100 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
26110 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  e to it..  */.  
26120 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26  if( (pPg->flags&
26130 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
26140 20 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b   && !isCommit ){
26150 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
26160 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
26170 20 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49     assert( pageI
26180 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c  nJournal(pPg) ||
26190 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
261a0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 3b  r->dbOrigSize );
261b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
261c0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
261d0 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72  RTY );.    asser
261e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
261f0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
26200 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
26210 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
26220 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
26230 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
26240 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73   ** from its has
26250 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
26260 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
26270 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
26280 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
26290 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
262a0 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
262b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
262c0 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
262d0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
262e0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
262f0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
26300 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70  R_NEED_SYNC;.  p
26310 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
26320 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
26330 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  o);.  assert( !p
26340 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d  PgOld || pPgOld-
26350 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66  >nRef==1 );.  if
26360 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
26370 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70  pPg->flags |= (p
26380 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48  PgOld->flags&PGH
26390 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20  DR_NEED_SYNC);. 
263a0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61   }..  sqlite3Pca
263b0 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
263c0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
263d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
263e0 63 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64  cacheDrop(pPgOld
263f0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
26400 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
26410 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
26420 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
26430 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
26440 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
26450 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
26460 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
26470 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
26480 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
26490 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
264a0 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
264b0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
264c0 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
264d0 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
264e0 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
264f0 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
26500 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
26510 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
26520 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
26530 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
26540 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
26550 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
26560 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
26570 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
26580 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
26590 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
265a0 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
265b0 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
265c0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
265d0 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
265e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
265f0 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
26600 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
26610 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
26620 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
26630 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
26640 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
26650 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
26660 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
26670 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
26680 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
26690 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
266a0 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
266b0 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
266c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
266d0 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
266e0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
266f0 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
26700 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
26710 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
26720 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
26730 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
26740 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
26750 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
26760 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
26770 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
26780 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
26790 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
267a0 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
267b0 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
267c0 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
267d0 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
267e0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
267f0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
26800 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
26810 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
26820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
26830 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
26840 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26850 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
26860 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
26870 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
26880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
268a0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 6e 65 65 64  nJournal && need
268b0 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72  SyncPgno<=pPager
268c0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a  ->dbOrigSize ){.
268d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
268e0 69 74 76 65 63 43 6c 65 61 72 28 70 50 61 67 65  itvecClear(pPage
268f0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e  r->pInJournal, n
26900 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20  eedSyncPgno);.  
26910 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
26920 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26930 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
26940 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65 72  c = 1;.    asser
26950 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  t( pPager->noSyn
26960 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  c==0 && !MEMDB )
26970 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66 6c  ;.    pPgHdr->fl
26980 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
26990 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c 69  D_SYNC;.    sqli
269a0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72  te3PcacheMakeDir
269b0 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
269c0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
269d0 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
269e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
269f0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
26a00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
26a10 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
26a20 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
26a30 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
26a40 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
26a50 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
26a60 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  g){.  assert( pP
26a70 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67  g->nRef>0 || pPg
26a80 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
26a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
26aa0 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >pData;.}../*.**
26ab0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
26ac0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
26ad0 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
26ae0 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
26af0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
26b00 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
26b10 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
26b20 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
26b30 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
26b40 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
26b50 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
26b60 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
26b70 50 61 67 65 72 3f 70 50 67 2d 3e 70 45 78 74 72  Pager?pPg->pExtr
26b80 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  a:0);.}../*.** G
26b90 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
26ba0 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
26bb0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
26bc0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
26bd0 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
26be0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
26bf0 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
26c00 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
26c10 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
26c20 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
26c30 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
26c40 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
26c50 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
26c60 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
26c70 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
26c80 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
26c90 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
26ca0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
26cb0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
26cc0 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
26cd0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
26ce0 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
26cf0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
26d00 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
26d10 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
26d20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
26d30 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
26d40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
26d50 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
26d60 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
26d70 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
26d80 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
26d90 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
26da0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
26db0 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
26dc0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
26dd0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
26de0 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
26df0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
26e00 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
26e10 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
26e20 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
26e30 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
26e40 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
26e50 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
26e60 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
26e70 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
26e80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
26e90 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
26ea0 38 29 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72  8)eMode;.  }.  r
26eb0 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65  eturn (int)pPage
26ec0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
26ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
26ee0 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  et the journal-m
26ef0 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
26f00 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
26f10 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  ode must be one 
26f20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47  of:.**.**    PAG
26f30 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
26f40 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45 52  UERY.**    PAGER
26f50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
26f60 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  ETE.**    PAGER_
26f70 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
26f80 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  CATE.**    PAGER
26f90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
26fa0 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45 52  SIST.**    PAGER
26fb0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
26fc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
26fd0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f  rameter is not _
26fe0 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65 20  QUERY, then the 
26ff0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20  journal-mode is 
27000 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76 61  set to the.** va
27010 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  lue specified..*
27020 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
27030 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20 63  d indicate the c
27040 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
27050 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f 75   updated).** jou
27060 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
27070 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
27080 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
27090 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
270a0 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d 44  de){.  if( !MEMD
270b0 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  B ){.    assert(
270c0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
270d0 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a  URNALMODE_QUERY.
270e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
270f0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
27100 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
27110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
27120 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
27130 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43  OURNALMODE_TRUNC
27140 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ATE.            
27150 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
27160 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
27170 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20  RSIST.          
27180 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
27190 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
271a0 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20 20  OFF .           
271b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
271c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
271d0 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73 73  EMORY );.    ass
271e0 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
271f0 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  ALMODE_QUERY<0 )
27200 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3e  ;.    if( eMode>
27210 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
27220 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
27230 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 20  = (u8)eMode;.   
27240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
27250 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
27260 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
27270 55 45 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20  UERY );.    }.  
27280 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
27290 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
272a0 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
272b0 74 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c  t/set the size-l
272c0 69 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65  imit used for pe
272d0 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c  rsistent journal
272e0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73   files..*/.i64 s
272f0 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
27300 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
27310 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
27320 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
27330 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
27340 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
27350 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
27360 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
27370 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
27380 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e  izeLimit;.}..#en
27390 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
273a0 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a           IT_DISKIO */.