/ Hex Artifact Content
Login

Artifact 2149b8271e18aa687456ac4b71ca3b3ad3c26adb:


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 36 31  : pager.c,v 1.61
0350: 33 20 32 30 30 39 2f 30 37 2f 32 32 20 31 36 3a  3 2009/07/22 16:
0360: 34 31 3a 31 35 20 64 61 6e 69 65 6c 6b 31 39 37  41:15 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1180: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1190: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
11a0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
11b0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
11c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
11d0: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
11e0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
11f0: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
1200: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
1210: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
1220: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
1230: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
1240: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1250: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
1260: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
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 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
1290: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
12a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
12b0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
12c0: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
12d0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
12e0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
12f0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1300: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1310: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1320: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
1330: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
1340: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
1350: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
1360: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
1370: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
1380: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1390: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
13a0: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
13b0: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
13c0: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
13d0: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
13e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
13f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1400: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1410: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1420: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
1430: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
1440: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1450: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
1460: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
1470: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
1480: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1490: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
14a0: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
14b0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
14c0: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
14d0: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
14e0: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
14f0: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1500: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1510: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1520: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
1530: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
1540: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1550: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
1560: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
1570: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
1580: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1590: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
15a0: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
15b0: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
15c0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
15d0: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
15e0: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
15f0: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1600: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1610: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1620: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1630: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
1640: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
1650: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
1660: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
1670: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1680: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
16a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
16b0: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
16c0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
16d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
16e0: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
16f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1700: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1720: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
1730: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
1740: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
1750: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
1760: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
1770: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
17a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
17b0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
17c0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
17d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17e0: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
17f0: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1810: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1820: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1840: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72  ucture..**.** er
1850: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61  rCode.**.**   Pa
1860: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
1870: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1880: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
1890: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20  ORRUPT, or.**   
18a0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
18b0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
18c0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
18d0: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
18e0: 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20  rsists.**   and 
18f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
1900: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
1910: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
1920: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
1930: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72     SQLITE_FULL r
1940: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
1950: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
1960: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
1970: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
1980: 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75    next successfu
1990: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
19a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
19b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
19c0: 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  ,.**   SQLITE_FU
19d0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
19e0: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
19f0: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1a00: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1a10: 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65  ).**   APIs, the
1a20: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
1a30: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
1a40: 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61  ..**.** dbSizeVa
1a50: 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f  lid, dbSize, dbO
1a60: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
1a70: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61  ize.**.**   Mana
1a80: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1a90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa0: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1ab0: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1ac0: 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61  ted..**   The va
1ad0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
1ae0: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1af0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b00: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b10: 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75  se.**   image cu
1b20: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1b30: 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73  . As the databas
1b40: 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72  e image grows or
1b50: 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a   shrinks this.**
1b60: 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75     variable is u
1b70: 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69  pdated. The vari
1b80: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c  able Pager.dbFil
1b90: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
1ba0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
1bb0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bd0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1be0: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1bf0: 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f  bSize.**   if so
1c00: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1c10: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1c20: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1c30: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1c40: 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66  itten.**   out f
1c50: 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f  rom the cache to
1c60: 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1c70: 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20   on disk. Or if 
1c80: 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65  the image has be
1c90: 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65  en.**   truncate
1ca0: 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  d by an incremen
1cb0: 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  tal-vacuum opera
1cc0: 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e  tion. The Pager.
1cd0: 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61  dbOrigSize varia
1ce0: 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  ble.**   contain
1cf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d10: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d20: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d30: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61    transaction wa
1d40: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1d50: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1d60: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1d70: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f  iables is.**   o
1d80: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74  nly guaranteed t
1d90: 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20  o be correct if 
1da0: 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65  the boolean Page
1db0: 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73  r.dbSizeValid is
1dc0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54   true..**.**   T
1dd0: 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20  ODO: Under what 
1de0: 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62  conditions is db
1df0: 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43  SizeValid set? C
1e00: 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68  leared?.**.** ch
1e10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a  angeCountDone.**
1e20: 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65  .**   This boole
1e30: 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  an variable is u
1e40: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1e50: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
1e60: 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28  -counter .**   (
1e70: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
1e80: 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20  r field at byte 
1e90: 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
1ea0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1eb0: 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64  is .**   not upd
1ec0: 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20  ated more often 
1ed0: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
1ee0: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73  .**.**   It is s
1ef0: 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20  et to true when 
1f00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f10: 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  er field is upda
1f20: 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20  ted, which .**  
1f30: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
1f40: 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65   if an exclusive
1f50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f70: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  le..**   It is c
1f80: 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66  leared (set to f
1f90: 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61  alse) whenever a
1fa0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1fb0: 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71   is .**   relinq
1fc0: 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61  uished on the da
1fd0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63  tabase file. Eac
1fe0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
1ff0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2000: 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e  d,.**   The chan
2010: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
2020: 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49   is inspected. I
2030: 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68  f it is true, th
2040: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75  e work of.**   u
2050: 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e  pdating the chan
2060: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d  ge-counter is om
2070: 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75  itted for the cu
2080: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2090: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  n..**.**   This 
20a0: 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20  mechanism means 
20b0: 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  that when runnin
20c0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
20d0: 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ode, a connectio
20e0: 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c  n .**   need onl
20f0: 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  y update the cha
2100: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65  nge-counter once
2110: 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  , for the first 
2120: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2130: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2140: 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a  * dbModified.**.
2150: 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66  **   The dbModif
2160: 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ied flag is set 
2170: 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62  whenever a datab
2180: 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74  ase page is dirt
2190: 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ied..**   It is 
21a0: 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65  cleared at the e
21b0: 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73  nd of each trans
21c0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
21d0: 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  It is used when 
21e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74  committing or ot
21f0: 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61  herwise ending a
2200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2210: 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69  .**   the dbModi
2220: 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65  fied flag is cle
2230: 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72  ar then less wor
2240: 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  k has to be done
2250: 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53  ..**.** journalS
2260: 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54  tarted.**.**   T
2270: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
2280: 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65  whenever the the
2290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
22a0: 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
22b0: 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74    The point of t
22c0: 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74  his flag is that
22d0: 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20   it must be set 
22e0: 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20  after the .**   
22f0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2300: 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ader in a journa
2310: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2320: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
2330: 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20  **   After this 
2340: 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65  has happened, ne
2350: 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64  w pages appended
2360: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2370: 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65   .**   do not ne
2380: 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ed the PGHDR_NEE
2390: 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c  D_SYNC flag set,
23a0: 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   as they do not 
23b0: 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69  need.**   to wai
23c0: 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  t for a journal 
23d0: 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79  sync before they
23e0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
23f0: 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  out to.**   the 
2400: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
2410: 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ee function page
2420: 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20  r_write())..**  
2430: 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a   .** setMaster.*
2440: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
2450: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2460: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2480: 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69  ile name.**   (i
2490: 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77  f any) is only w
24a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63  journal file onc
24c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  e..**.**   When 
24d0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
24e0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61  nsaction, the ma
24f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2500: 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a  e name (if any).
2510: 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74  **   may be writ
2520: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20  rnal file while 
2540: 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
2550: 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52  ll in.**   PAGER
2560: 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20  _RESERVED state 
2570: 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65  (see CommitPhase
2580: 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63  One() for the ac
2590: 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74  tion). It.**   t
25a0: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
25b0: 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78  upgrade to an ex
25c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66  clusive lock. If
25d0: 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a   this attempt.**
25e0: 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53     fails, then S
25f0: 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62  QLITE_BUSY may b
2600: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
2610: 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75  e user and the u
2620: 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74  ser.**   may att
2630: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
2640: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
2650: 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c  gain later (call
2660: 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50  ing.**   CommitP
2670: 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29  haseOne() again)
2680: 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75  . This flag is u
2690: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
26a0: 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73  at the .**   mas
26b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
26c0: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
26d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26e0: 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a  file the first.*
26f0: 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50  *   time CommitP
2700: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
2710: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  led..**.** doNot
2720: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Sync.**.**   Thi
2730: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  s variable is se
2740: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  t and cleared by
2750: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2760: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  te()..**.** need
2770: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  Sync.**.**   TOD
2780: 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20 65  O: It might be e
2790: 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68 69  asier to set thi
27a0: 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72  s variable in wr
27b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a  iteJournalHdr().
27c0: 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61  **   and writeMa
27d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e  sterJournal() on
27e0: 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d  ly. Change its m
27f0: 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e  eaning to "unsyn
2800: 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61  ced data.**   ha
2810: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2820: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a  o the journal"..
2830: 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f  **.** subjInMemo
2840: 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ry.**.**   This 
2850: 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72  is a boolean var
2860: 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20  iable. If true, 
2870: 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
2880: 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  d sub-journal.**
2890: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20     is opened as 
28a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61  rnal file. If fa
28c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d  lse, then in-mem
28d0: 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75  ory.**   sub-jou
28e0: 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75  rnals are only u
28f0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
2900: 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a  y pager files..*
2910: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2920: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2930: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
2940: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
2950: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
2960: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
2970: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
2980: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
2990: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
29a0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
29b0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
29d0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
29e0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
29f0: 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  es */.  u8 useJo
2a00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2a10: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2a20: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2a30: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2a40: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a60: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2a70: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2a80: 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b   */.  u8 noSync;
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
2ab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
2ac0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
2ad0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
2ae0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
2af0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
2b00: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2b10: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
2b20: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
2b30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2b40: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
2b50: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
2b60: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2b80: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2b90: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2ba0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2bd0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2be0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c00: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2c10: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2c20: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
2c30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
2c40: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
2c50: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61 72   members that ar
2c60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
2c70: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ** modified duri
2c80: 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
2c90: 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20  ions. The other 
2ca0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
2cb0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  s structure.  **
2cc0: 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73   are either cons
2cd0: 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20  tant throughout 
2ce0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
2cf0: 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c  the pager, or el
2d00: 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  se.  ** used to 
2d10: 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74  store configurat
2d20: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74  ion parameters t
2d30: 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20 77  hat affect the w
2d40: 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20 20  ay the pager .  
2d50: 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a  ** operates..  *
2d60: 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74  *.  ** The 'stat
2d70: 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  e' variable is d
2d80: 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65  escribed in more
2d90: 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69   detail along wi
2da0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63  th the.  ** desc
2db0: 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  riptions of the 
2dc0: 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61  values it may ta
2dd0: 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ke - PAGER_UNLOC
2de0: 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74  K etc. Many of t
2df0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61  he.  ** other va
2e00: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
2e10: 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69  block are descri
2e20: 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  bed in the comme
2e30: 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a  nt directly .  *
2e40: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61  * above this cla
2e50: 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  ss definition.. 
2e60: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2e90: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2ea0: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2eb0: 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20   u8 dbModified; 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72  True if there ar
2ee0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
2ef0: 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20   the Db */.  u8 
2f00: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f20: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2f30: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2f40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2f50: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f70: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2f80: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2f90: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
2fa0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
2fb0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
2fc0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
2fe0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
3010: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
3020: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
3030: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3050: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
3060: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3070: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3080: 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69  .  u8 dbSizeVali
3090: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
30a0: 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a  * Set when dbSiz
30b0: 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a  e is correct */.
30c0: 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72    u8 subjInMemor
30d0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
30e0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d   True to use in-
30f0: 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
3100: 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  als */.  Pgno db
3110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3130: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3140: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
3150: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
3160: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3170: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3190: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
31a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
31b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
31d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
31e0: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3200: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
3210: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
3220: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3240: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
3250: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
3260: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
3270: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
3280: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3290: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
32a0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
32b0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
32c0: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
32f0: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
3300: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
3310: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
3320: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
3330: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3340: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3350: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3380: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
3390: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
33a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
33b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
33d0: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
33e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
33f0: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
3400: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
3410: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
3420: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3430: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3440: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3450: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
3460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3470: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3480: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
3490: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
34a0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
34b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
34c0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34d0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
34e0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
34f0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
3500: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3520: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3530: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
3540: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  ] */.  char dbFi
3550: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
3560: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
3570: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
3580: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
3590: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
35b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
35c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
35d0: 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e  back */..  u16 n
35e0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
35f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3600: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
3610: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
3620: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
3630: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
3640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3650: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
3660: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
3670: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
3680: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
3690: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
36a0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
36b0: 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70  pen() */.  int p
36c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
36d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
36f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
3700: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
3710: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
3720: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
3730: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3740: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3760: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3770: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3780: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
37b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
37c0: 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
37d0: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63  (void*); /* Func
37e0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65  tion to call whe
37f0: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64  n busy */.  void
3800: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
3810: 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  g;      /* Conte
3820: 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  xt argument for 
3830: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
3840: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3850: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3860: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
3870: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
3880: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
3890: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
38a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
38b0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
38c0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
38d0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
38e0: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
38f0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3900: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3910: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
3930: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
3940: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
3950: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
3960: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
3970: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
3980: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3990: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
39a0: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
39b0: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
39c0: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
39d0: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
39e0: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
3a00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
3a10: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
3a20: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
3a30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3a40: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3a50: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
3a60: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
3a70: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
3a80: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
3a90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
3aa0: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
3ab0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3ac0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
3ad0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
3ae0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
3b00: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
3b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3b20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
3b30: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
3b40: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
3b50: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
3b60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
3b70: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
3b80: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
3b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
3ba0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
3bb0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
3bc0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
3bd0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
3be0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
3bf0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
3c00: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
3c10: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
3c20: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
3c30: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
3c40: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
3c50: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3c60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3c70: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
3c80: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3c90: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
3ca0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
3cb0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3cc0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
3cd0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
3ce0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
3cf0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
3d00: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3d10: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
3d20: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3d30: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
3d40: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
3d50: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3d60: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
3d70: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
3d80: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
3d90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3da0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3db0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3dc0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3dd0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3de0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3df0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3e00: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3e10: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3e20: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3e30: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3e40: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3e50: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3e60: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3e70: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3e80: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3e90: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3ea0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
3eb0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3ec0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3ed0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3ee0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3ef0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3f00: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3f10: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3f20: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3f30: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3f40: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3f50: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3f60: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3f70: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3f80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3f90: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3fa0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3fb0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3fc0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3fd0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3fe0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3ff0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
4000: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
4010: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
4020: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
4030: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
4040: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
4050: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
4060: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
4070: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
4080: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
4090: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
40a0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
40b0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
40c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
40d0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
40e0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
40f0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
4100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
4110: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
4120: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
4130: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
4140: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
4150: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
4160: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
4170: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
4180: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
4190: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
41a0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
41b0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
41c0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
41d0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
41e0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
41f0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
4200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
4210: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
4220: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
4230: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
4240: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
4250: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
4260: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
4270: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
4280: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
4290: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
42a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
42b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
42c0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
42d0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
42e0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
42f0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
4300: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
4310: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
4320: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
4330: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
4340: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
4350: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4360: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
4370: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
4380: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
4390: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
43a0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
43b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
43c0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
43d0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
43e0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
43f0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
4400: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
4410: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
4420: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
4430: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4440: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4450: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4460: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4470: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4480: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4490: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
44a0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
44b0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
44c0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
44d0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
44e0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
44f0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4500: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4510: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4520: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4530: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4540: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4550: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4560: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4580: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4590: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
45a0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
45b0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
45c0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
45d0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
45e0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
45f0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4600: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4610: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
4620: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
4630: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
4640: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
4650: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
4660: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
4670: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
4680: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
4690: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
46a0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
46b0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
46c0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
46d0: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
46e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
46f0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
4700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
4710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
4720: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
4730: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
4740: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
4750: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
4760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4770: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
4780: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
4790: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
47a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
47b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
47c0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
47d0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
47e0: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
47f0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
4800: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
4810: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
4820: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
4830: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
4840: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
4850: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
4860: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
4870: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
4880: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
4890: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
48a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
48b0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
48c0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
48d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
48e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
48f0: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
4900: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
4910: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
4920: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
4930: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
4940: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
4950: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4960: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
4970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4990: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
49a0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
49b0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
49c0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
49d0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
49e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
49f0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
4a00: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4a10: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
4a20: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
4a30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4a60: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
4a70: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
4a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
4a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4aa0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
4ab0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
4ac0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
4ad0: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
4ae0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
4af0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
4b00: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4b10: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4b20: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4b30: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4b40: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4b50: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4b60: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4b70: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4b80: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4b90: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4ba0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4bb0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4bc0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4bd0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4be0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4c00: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
4c10: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
4c20: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
4c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4c40: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
4c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4c60: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4c70: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
4c80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4c90: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
4cb0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
4cc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4cd0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ce0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
4cf0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
4d00: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4d10: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
4d20: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
4d30: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
4d40: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
4d50: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4d60: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4d70: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d80: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4d90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4da0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4db0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4dc0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4dd0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4de0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4df0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4e00: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4e10: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e20: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e30: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e40: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e50: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
4e60: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
4e70: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
4e80: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
4e90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
4ea0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
4eb0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
4ec0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
4ed0: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
4ee0: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
4ef0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
4f00: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
4f10: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
4f20: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
4f30: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
4f40: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
4f50: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
4f60: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
4f70: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
4f80: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
4f90: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
4fa0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
4fb0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
4fc0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
4fd0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
4fe0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
5000: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
5010: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
5020: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
5030: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
5040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
5060: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
5070: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
5080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5090: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
50a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
50b0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
50c0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
50d0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
50e0: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
50f0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
5100: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
5110: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
5120: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
5130: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5140: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
5150: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
5160: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
5170: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
5180: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
5190: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
51a0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
51b0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
51c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
51d0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
51e0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
51f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
5200: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
5210: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
5220: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
5230: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
5240: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
5250: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
5260: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
5270: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
5280: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5290: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
52a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
52b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
52c0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
52d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
52e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
52f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5300: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
5310: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
5320: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
5330: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
5340: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
5350: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
5360: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
5370: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
5380: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5390: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
53a0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
53b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
53c0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
53f0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
5400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
5410: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
5420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
5430: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
5440: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
5470: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
5480: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
5490: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
54a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
54b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
54c0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
54d0: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
54e0: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
54f0: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
5500: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
5510: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
5520: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
5530: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
5540: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
5550: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
5560: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
5570: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
5580: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
5590: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
55a0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
55b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
55d0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
55e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
55f0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5600: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
5610: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
5620: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
5630: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
5640: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
5650: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
5660: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
5670: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
5680: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5690: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
56a0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
56b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
56c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
56d0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
56e0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
56f0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
5700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
5710: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
5720: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
5730: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
5740: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5750: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5760: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
5770: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
5780: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
5790: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
57a0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
57b0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
57c0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
57d0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
57e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
57f0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
5800: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
5810: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
5820: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
5830: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
5840: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5850: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
5860: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
5870: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5890: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
58a0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
58b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
58c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
58d0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
58e0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
58f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
5900: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5910: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
5920: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5930: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5940: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5950: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5960: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5970: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5980: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5990: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
59a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
59b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
59c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
59d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
59e0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
59f0: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
5a00: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
5a10: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
5a20: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5a40: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
5a50: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
5a60: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
5a80: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
5a90: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5aa0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
5ab0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
5ac0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
5ad0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5af0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
5b00: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
5b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
5b20: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
5b30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b40: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
5b50: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
5b60: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
5b70: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
5b80: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
5b90: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
5ba0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
5bb0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5bc0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5bd0: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
5be0: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
5bf0: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
5c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5c20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5c30: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
5c40: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
5c50: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
5c60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
5c70: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
5c80: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
5c90: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
5ca0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
5cb0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
5cc0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
5cd0: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
5ce0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5cf0: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
5d00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
5d10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
5d20: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
5d30: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
5d40: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
5d50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
5d60: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
5d70: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
5d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d90: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
5da0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
5db0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
5dc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5dd0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5de0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
5df0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
5e00: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
5e10: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
5e20: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
5e30: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
5e40: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
5e50: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
5e60: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
5e70: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
5e80: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5e90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
5ea0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
5eb0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
5ec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5ed0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5ee0: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
5ef0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5f00: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5f10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
5f40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5f50: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
5f60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
5f70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5f80: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5f90: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5fa0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5fb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5fc0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5fd0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5ff0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
6000: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
6010: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6020: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
6030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6040: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
6070: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
6080: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
6090: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
60c0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
60d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
60e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
60f0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
6100: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
6110: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6120: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
6130: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6140: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6150: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
6160: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
6170: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6180: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6190: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
61a0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
61b0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
61c0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
61d0: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
61e0: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
61f0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
6200: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6210: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6220: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
6230: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
6240: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
6250: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6260: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
6270: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
6280: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6290: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
62a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
62b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
62c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
62d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
62e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
62f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
6300: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
6310: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
6320: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6330: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
6340: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
6350: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
6360: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
6370: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
6380: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
6390: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
63a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
63b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
63c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
63d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
63e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
63f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
6400: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
6410: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
6420: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
6430: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
6440: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
6450: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
6460: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6470: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
6480: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
6490: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
64a0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
64c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
64d0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
64e0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
64f0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
6500: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
6510: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
6520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6530: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
6540: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
6550: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6560: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
6570: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
6580: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
6590: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
65a0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
65b0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
65c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
65f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6600: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
6610: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
6620: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6630: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6650: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6680: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
6690: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
66a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
66b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
66c0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
66d0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
66e0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
66f0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
6700: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
6710: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
6720: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6730: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
6740: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
6750: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
6760: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6770: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
6780: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
6790: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
67a0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
67b0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
67c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
67d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
67e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
67f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
6800: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6810: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
6820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
6830: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
6840: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
6850: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6860: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
6870: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
6880: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
6890: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
68a0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
68b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
68c0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
68d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
68e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
68f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
6900: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
6910: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
6920: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
6930: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
6940: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
6950: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
6960: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
6970: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
6980: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
6990: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
69a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
69b0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
69c0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
69d0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
69e0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
69f0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
6a00: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
6a10: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
6a20: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
6a30: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
6a40: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
6a50: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
6a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
6a70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
6a80: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
6a90: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
6aa0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6ab0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6ac0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
6ad0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
6ae0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
6af0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
6b00: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
6b10: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
6b20: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
6b30: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
6b40: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
6b50: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
6b60: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
6b70: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
6b80: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6ba0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
6bb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
6bc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
6bd0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
6be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6c20: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
6c30: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
6c40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6c50: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6c60: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
6c70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6c80: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
6c90: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
6ca0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
6cb0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
6cc0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
6cd0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
6ce0: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
6cf0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6d00: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6d10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
6d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6d30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6d40: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6d50: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
6d60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6d70: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6d80: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
6d90: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
6da0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
6dc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
6dd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6de0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
6df0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
6e00: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
6e10: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
6e30: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
6e40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6e50: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
6e60: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
6e70: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
6e80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
6e90: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
6ea0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
6eb0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
6ec0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
6ed0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
6ee0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
6ef0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
6f00: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
6f10: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
6f20: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
6f30: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
6f40: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
6f50: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
6f60: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
6f70: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
6f80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
6f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6fa0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
6fb0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
6fc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6fd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
6fe0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
6ff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7000: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
7010: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7020: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
7030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
7040: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
7050: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7060: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7070: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7080: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
70b0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
70c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
70d0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
70e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
70f0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
7100: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
7110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
7120: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
7130: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
7140: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
7150: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
7160: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
7170: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
7180: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
7190: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
71a0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
71b0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
71c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
71d0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
71e0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
71f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
7200: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
7210: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
7220: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
7230: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
7240: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
7250: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7260: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
7270: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
7280: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
7290: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
72a0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
72b0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72d0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
72e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
72f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7300: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7310: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7320: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
7330: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
7340: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
7350: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
7360: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
7370: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7380: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
7390: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
73a0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
73b0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
73c0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
73d0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
7400: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
7410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7440: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
7450: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7460: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
7470: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
7480: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7490: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
74a0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
74b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
74c0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
74d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
74f0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
7500: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
7510: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
7520: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
7530: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
7540: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
7550: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
7560: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
7570: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
7580: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
7590: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
75a0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
75b0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
75c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
75d0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
75e0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
75f0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
7600: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
7610: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
7620: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7630: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
7640: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7650: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
7670: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
7680: 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 0a 20  Pager);..  /* . 
7690: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
76a0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
76b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
76c0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
76d0: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
76e0: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
76f0: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
7700: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
7710: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
7720: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
7730: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
7740: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
7750: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7760: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7770: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7780: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7790: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
77a0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
77b0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
77c0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
77d0: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
77e0: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
77f0: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
7800: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
7810: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
7820: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
7830: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
7840: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
7850: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7860: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7870: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7880: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7890: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
78a0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
78b0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
78c0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
78d0: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  a failure occurr
78e0: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
78f0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
7900: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
7910: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
7920: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
7930: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
7940: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
7950: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
7960: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
7970: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
7980: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
7990: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
79a0: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
79b0: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
79c0: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
79d0: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
79e0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
79f0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
7a00: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
7a10: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
7a20: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
7a30: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
7a40: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
7a50: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
7a70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
7a80: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
7a90: 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
7aa0: 63 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  c );.  if( (pPag
7ab0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28  er->noSync) || (
7ac0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
7ad0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
7ae0: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20  ALMODE_MEMORY). 
7af0: 20 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44    || (sqlite3OsD
7b00: 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
7b10: 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
7b20: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
7b30: 46 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b  FE_APPEND) .  ){
7b40: 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  .    memcpy(zHea
7b50: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
7b60: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
7b70: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
7b80: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7b90: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7ba0: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
7bb0: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
7bc0: 0a 20 20 20 20 7a 48 65 61 64 65 72 5b 30 5d 20  .    zHeader[0] 
7bd0: 3d 20 27 5c 30 27 3b 0a 20 20 20 20 70 75 74 33  = '\0';.    put3
7be0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7bf0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7c00: 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a  gic)], 0);.  }..
7c10: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
7c20: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
7c30: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
7c40: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
7c50: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63  sizeof(pPager->c
7c60: 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67  ksumInit), &pPag
7c70: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7c80: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7c90: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7ca0: 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70  rnalMagic)+4], p
7cb0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
7cc0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  );.  /* The init
7cd0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
7ce0: 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  e */.  put32bits
7cf0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
7d00: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7d10: 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  8], pPager->dbOr
7d20: 69 67 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  igSize);.  /* Th
7d30: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
7d40: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
7d50: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
7d60: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7d70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7d80: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
7d90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a  ->sectorSize);..
7da0: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69    /* The page si
7db0: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
7dc0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
7dd0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7de0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
7df0: 67 65 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49  geSize);..  /* I
7e00: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
7e10: 74 61 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66  tail of the buff
7e20: 65 72 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  er is not necess
7e30: 61 72 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ary.  Everything
7e40: 0a 20 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64  .  ** works find
7e50: 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   if the followin
7e60: 67 20 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d  g memset() is om
7e70: 69 74 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74  itted.  But init
7e80: 69 61 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68  ializing.  ** th
7e90: 65 20 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74  e memory prevent
7ea0: 73 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  s valgrind from 
7eb0: 63 6f 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20  complaining, so 
7ec0: 77 65 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74  we are willing t
7ed0: 6f 0a 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20  o.  ** take the 
7ee0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7ef0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
7f00: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7f10: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f20: 5d 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e  ], 0,.         n
7f30: 48 65 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61  Header-(sizeof(a
7f40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30  JournalMagic)+20
7f50: 29 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65  ));..  /* In the
7f60: 6f 72 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20  ory, it is only 
7f70: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 77 72 69  necessary to wri
7f80: 74 65 20 74 68 65 20 32 38 20 62 79 74 65 73 20  te the 28 bytes 
7f90: 74 68 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a  that the .  ** j
7fa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f  ournal header co
7fb0: 6e 73 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f  nsumes to the jo
7fc0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e  urnal file here.
7fd0: 20 54 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   Then increment 
7fe0: 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e  the .  ** Pager.
7ff0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61  journalOff varia
8000: 62 6c 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48  ble by JOURNAL_H
8010: 44 52 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68  DR_SZ so that th
8020: 65 20 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63  e next .  ** rec
8030: 6f 72 64 20 69 73 20 77 72 69 74 74 65 6e 20 74  ord is written t
8040: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
8050: 73 65 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20  sector (leaving 
8060: 61 20 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c  a gap in the fil
8070: 65 0a 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c  e.  ** that will
8080: 20 62 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66   be implicitly f
8090: 69 6c 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20  illed in by the 
80a0: 4f 53 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48  OS)..  **.  ** H
80b0: 6f 77 65 76 65 72 20 69 74 20 68 61 73 20 62 65  owever it has be
80c0: 65 6e 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  en discovered th
80d0: 61 74 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65  at on some syste
80e0: 6d 73 20 74 68 69 73 20 70 61 74 74 65 72 6e 20  ms this pattern 
80f0: 63 61 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67  can .  ** be sig
8100: 6e 69 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65  nificantly slowe
8110: 72 20 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75  r than contiguou
8120: 73 6c 79 20 77 72 69 74 69 6e 67 20 64 61 74 61  sly writing data
8130: 20 74 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20   to the file,.  
8140: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  ** even if that 
8150: 6d 65 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79  means explicitly
8160: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
8170: 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20   the block of . 
8180: 20 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   ** (JOURNAL_HDR
8190: 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20  _SZ - 28) bytes 
81a0: 74 68 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  that will not be
81b0: 20 75 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69   used. So that i
81c0: 73 20 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64  s what.  ** is d
81d0: 6f 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  one. .  **.  ** 
81e0: 54 68 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75  The loop is requ
81f0: 69 72 65 64 20 68 65 72 65 20 69 6e 20 63 61 73  ired here in cas
8200: 65 20 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a  e the sector-siz
8210: 65 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  e is larger than
8220: 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62   the .  ** datab
8230: 61 73 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53  ase page size. S
8240: 69 6e 63 65 20 74 68 65 20 7a 48 65 61 64 65 72  ince the zHeader
8250: 20 62 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20   buffer is only 
8260: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20  Pager.pageSize. 
8270: 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a   ** bytes in siz
8280: 65 2c 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  e, more than one
8290: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
82a0: 4f 73 57 72 69 74 65 28 29 20 6d 61 79 20 62 65  OsWrite() may be
82b0: 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74   required.  ** t
82c0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65  o populate the e
82d0: 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65  ntire journal he
82e0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
82f0: 2f 20 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d  / .  for(nWrite=
8300: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
8310: 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c  &&nWrite<JOURNAL
8320: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
8330: 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72   nWrite+=nHeader
8340: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
8350: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
8360: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
8370: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
8380: 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72   nHeader)).    r
8390: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
83a0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
83b0: 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72  zHeader, nHeader
83c0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
83d0: 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65  lOff);.    pPage
83e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
83f0: 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20   nHeader;.  }.. 
8400: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8410: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8420: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8430: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
8440: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
8450: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
8460: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
8470: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
8480: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
8490: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
84a0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
84b0: 2e 20 54 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  . The current lo
84c0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
84d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 67 69  urnal file is gi
84e0: 76 65 6e 20 62 79 0a 2a 2a 20 70 50 61 67 65 72  ven by.** pPager
84f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65  ->journalOff. Se
8500: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
8510: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
8520: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a  ournalHdr() for.
8530: 2a 2a 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  ** a description
8540: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
8550: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
8560: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
8570: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
8580: 73 73 66 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20  ssfully, *pNRec 
8590: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
85a0: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
85b0: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
85c0: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
85d0: 64 20 2a 70 44 62 53 69 7a 65 20 69 73 20 73 65  d *pDbSize is se
85e0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
85f0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
8600: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
8610: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
8620: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
8630: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8640: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
8650: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
8660: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
8670: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
8680: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
8690: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
86a0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
86b0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
86c0: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
86d0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
86e0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
86f0: 64 20 61 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64  d and *pNRec and
8700: 20 2a 50 44 62 53 69 7a 65 20 61 72 65 20 75 6e   *PDbSize are un
8710: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55  defined.  If JOU
8720: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
8730: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
8740: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8750: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
8760: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
8770: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8780: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
8790: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
87a0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
87b0: 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
87c0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 48 6f 74  t */.  int isHot
87d0: 2c 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  ,.  i64 journalS
87e0: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
87f0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8800: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8810: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8820: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8850: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
8860: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
8870: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
8880: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
8890: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
88a0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
88b0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
88c0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
88d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
88e0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
88f0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8900: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8910: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8920: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8930: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
8960: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
8970: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
8980: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
8990: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
89a0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
89b0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
89c0: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
89d0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
89e0: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
89f0: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8a00: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8a10: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8a20: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8a30: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8a40: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8a50: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
8a60: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
8a70: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
8a80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
8a90: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
8aa0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
8ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8ac0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8ad0: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8ae0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8af0: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8b00: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8b10: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b20: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8b30: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8b40: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8b50: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
8b60: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
8b70: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
8b80: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
8b90: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
8ba0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
8bb0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8bc0: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8bd0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8be0: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8bf0: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8c00: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8c10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 48 6f  .  */.  if( isHo
8c20: 74 20 7c 7c 20 69 48 64 72 4f 66 66 21 3d 70 50  t || iHdrOff!=pP
8c30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
8c40: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
8c50: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8c60: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8c70: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8c80: 69 48 64 72 4f 66 66 29 3b 0a 20 20 20 20 69 66  iHdrOff);.    if
8c90: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
8ca0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
8cb0: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d     if( memcmp(aM
8cc0: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8cd0: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
8ce0: 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ic))!=0 ){.     
8cf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8d00: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8d10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8d20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8d30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8d40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8d50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8d60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8d70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8d90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8da0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8db0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8dc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8dd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8de0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8df0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8e00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8e10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8e20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8e30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8e60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8e70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8e80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ea0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8eb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8ec0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8ef0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8f00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8f20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8f30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8f40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8f50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8f60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8f70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8f80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8f90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8fa0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8fb0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8fc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8fd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8fe0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8ff0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
9000: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
9010: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
9020: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
9030: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9040: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9050: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
9060: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
9070: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
9080: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
9090: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
90a0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
90b0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
90c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
90d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
90e0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
90f0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
9100: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
9110: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
9120: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
9130: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
9140: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
9150: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
9160: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
9170: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
9180: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
9190: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
91a0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
91b0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
91c0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
91d0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
91e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
91f0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9210: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9220: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9230: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9240: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9250: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9260: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9270: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9280: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9290: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
92a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
92b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
92c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
92d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
92e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
92f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9300: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9310: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9320: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9330: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9340: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9350: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9360: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9370: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9380: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9390: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
93a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
93b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
93c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
93d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
93e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
93f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9400: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9410: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9420: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9430: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9440: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9450: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9460: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9470: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9480: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9490: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
94a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
94b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
94c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
94d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
94e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
94f0: 50 61 67 65 53 69 7a 65 31 36 2c 20 2d 31 29 3b  PageSize16, -1);
9500: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
9510: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
9520: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
9530: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 50 61  SQLITE_OK || iPa
9540: 67 65 53 69 7a 65 31 36 3d 3d 28 75 31 36 29 69  geSize16==(u16)i
9550: 50 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20  PageSize );..   
9560: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
9570: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
9580: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
9590: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
95a0: 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
95b0: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
95c0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
95d0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
95e0: 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
95f0: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
9600: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
9610: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
9620: 69 6e 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 65  ine.    ** is be
9630: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
9640: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
9650: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
9660: 61 6c 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20  al value.    ** 
9670: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
9680: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
9690: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
96a0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 20 20  at routine..    
96b0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  */.    pPager->s
96c0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 69 53 65 63  ectorSize = iSec
96d0: 74 6f 72 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  torSize;.  }..  
96e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
96f0: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9700: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
9710: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
9720: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
9730: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
9740: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
9750: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9760: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
9770: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
9780: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
9790: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
97a0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
97b0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
97c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
97d0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
97e0: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
97f0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
9800: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
9810: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
9820: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
9830: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
9840: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
9850: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
9860: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
9870: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20  is:.**.**   + 4 
9880: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
9890: 50 47 4e 4f 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62  PGNO..**   + N b
98a0: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
98b0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 6e  rnal filename in
98c0: 20 75 74 66 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34   utf-8..**   + 4
98d0: 20 62 79 74 65 73 3a 20 4e 20 28 6c 65 6e 67 74   bytes: N (lengt
98e0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
98f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 20 62 79 74 65  nal name in byte
9900: 73 2c 20 6e 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e  s, no nul-termin
9910: 61 74 6f 72 29 2e 0a 2a 2a 20 20 20 2b 20 34 20  ator)..**   + 4 
9920: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
9930: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
9940: 73 75 6d 2e 0a 2a 2a 20 20 20 2b 20 38 20 62 79  sum..**   + 8 by
9950: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
9960: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
9970: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
9980: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
9990: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
99a0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
99b0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
99c0: 6d 65 2c 20 77 68 65 72 65 20 65 61 63 68 20 62  me, where each b
99d0: 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65 74  yte is interpret
99e0: 65 64 20 61 73 20 61 20 73 69 67 6e 65 64 20 38  ed as a signed 8
99f0: 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  -bit integer..**
9a00: 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69  .** If zMaster i
9a10: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
9a20: 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73   (occurs for a s
9a30: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
9a40: 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a  ransaction), .**
9a50: 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   this call is a 
9a60: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
9a70: 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72   int writeMaster
9a80: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
9a90: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
9aa0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
9ab0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
9ae0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 3b  /.  int nMaster;
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
9b10: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
9b20: 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66   */.  i64 iHdrOf
9b30: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9b40: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9b50: 20 6f 66 20 68 65 61 64 65 72 20 69 6e 20 6a 6f   of header in jo
9b60: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
9b70: 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 20 20 20  i64 jrnlSize;   
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
9ba0: 6e 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  nal file on disk
9bb0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 20   */.  u32 cksum 
9bc0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9bd0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9be0: 75 6d 20 6f 66 20 73 74 72 69 6e 67 20 7a 4d 61  um of string zMa
9bf0: 73 74 65 72 20 2a 2f 0a 0a 20 20 69 66 28 20 21  ster */..  if( !
9c00: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
9c10: 72 2d 3e 73 65 74 4d 61 73 74 65 72 0a 20 20 20  r->setMaster.   
9c20: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
9c30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
9c40: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
9c50: 20 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e   .   || pPager->
9c60: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
9c70: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
9c80: 46 46 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  FF .  ){.    ret
9c90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9ca0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74   }.  pPager->set
9cb0: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 20 20 61 73  Master = 1;.  as
9cc0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
9cd0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
9ce0: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68 65  /* Calculate the
9cf0: 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65 73   length in bytes
9d00: 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73 75   and the checksu
9d10: 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  m of zMaster */.
9d20: 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30 3b    for(nMaster=0;
9d30: 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65 72   zMaster[nMaster
9d40: 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a 20  ]; nMaster++){. 
9d50: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
9d60: 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20 20  ter[nMaster];.  
9d70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
9d80: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
9d90: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9da0: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
9db0: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
9dc0: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
9dd0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
9de0: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
9df0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
9e00: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
9e10: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
9e20: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
9e30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
9e40: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
9e50: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
9e60: 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61  rnalOff = journa
9e70: 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65  lHdrOffset(pPage
9e80: 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f 66  r);.  }.  iHdrOf
9e90: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
9ea0: 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57 72  nalOff;..  /* Wr
9eb0: 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
9ec0: 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20 74  ournal data to t
9ed0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9ee0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a 20  urnal file. If. 
9ef0: 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
9f00: 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20  urs, return the 
9f10: 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68  error code to th
9f20: 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20  e caller..  */. 
9f30: 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20 3d   if( (0 != (rc =
9f40: 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
9f50: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
9f60: 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  f, PAGER_MJ_PGNO
9f70: 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20 7c  (pPager)))).   |
9f80: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
9f90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
9fa0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
9fb0: 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64 72  r, nMaster, iHdr
9fc0: 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20 28  Off+4))).   || (
9fd0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9fe0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9ff0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e 4d  fd, iHdrOff+4+nM
a000: 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29 29  aster, nMaster))
a010: 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72  ).   || (0 != (r
a020: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
a030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64  pPager->jfd, iHd
a040: 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 34  rOff+4+nMaster+4
a050: 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c 7c  , cksum))).   ||
a060: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c   (0 != (rc = sql
a070: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a080: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
a090: 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72 4f  lMagic, 8, iHdrO
a0a0: 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29 29  ff+4+nMaster+8))
a0b0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
a0c0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
a0d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a0e0: 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b 0a  = (nMaster+20);.
a0f0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
a100: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
a110: 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  Sync;..  /* If t
a120: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70  he pager is in p
a130: 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c  eristent-journal
a140: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20   mode, then the 
a150: 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a  physical .  ** j
a160: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20  ournal-file may 
a170: 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20  extend past the 
a180: 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65  end of the maste
a190: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20  r-journal name. 
a1a0: 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20   ** and 8 bytes 
a1b0: 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75  of magic data ju
a1c0: 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  st written to th
a1d0: 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
a1e0: 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20  .  ** dangerous 
a1f0: 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65  because the code
a200: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68   to rollback a h
a210: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ot-journal file.
a220: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65    ** will not be
a230: 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68   able to find th
a240: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
a250: 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
a260: 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72  ne .  ** whether
a270: 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72   or not the jour
a280: 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a  nal is hot. .  *
a290: 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74  *.  ** Easiest t
a2a0: 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68  hing to do in th
a2b0: 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  is scenario is t
a2c0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a  o truncate the j
a2d0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c  ournal .  ** fil
a2e0: 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65  e to the require
a2f0: 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20  d size..  */ .  
a300: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28  if( SQLITE_OK==(
a310: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
a320: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
a330: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 0a  fd, &jrnlSize)).
a340: 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 70     && jrnlSize>p
a350: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a360: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
a370: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
a380: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
a390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a3a0: 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  f);.  }.  return
a3b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69   rc;.}../*.** Fi
a3c0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
a3d0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
a3e0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
a3f0: 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  r. Return.** a p
a400: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
a410: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68  ge or NULL if th
a420: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
a430: 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65   is not .** alre
a440: 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a  ady in memory..*
a450: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
a460: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
a470: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a480: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
a490: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
a4a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a4b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
a4c0: 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
a4d0: 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63 61  ossible for a ca
a4e0: 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74 63  ll to PcacheFetc
a4f0: 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65 46  h() with createF
a500: 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20 66  lag==0 to.  ** f
a510: 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61 74  ail, since no at
a520: 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
a530: 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  e dynamic memory
a540: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a 20   will be made.. 
a550: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69   */.  (void)sqli
a560: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
a570: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
a580: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
a590: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
a5a0: 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70 61  ** Unless the pa
a5b0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a5c0: 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 61  state, discard a
a5d0: 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ll in-memory pag
a5e0: 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 61  es. If.** the pa
a5f0: 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72 2d  ger is in error-
a600: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
a610: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
a620: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68  ..**.** TODO: Wh
a630: 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65 73  y can we not res
a640: 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68 69  et the pager whi
a650: 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  le in error stat
a660: 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e?.*/.static voi
a670: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
a680: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a690: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70  if( SQLITE_OK==p
a6a0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
a6b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  {.    sqlite3Bac
a6c0: 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
a6d0: 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 20  r->pBackup);.   
a6e0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
a6f0: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
a700: 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  che);.    pPager
a710: 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
a720: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
a730: 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75  Free all structu
a740: 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72  res in the Pager
a750: 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72  .aSavepoint[] ar
a760: 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68  ray and set both
a770: 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70  .** Pager.aSavep
a780: 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e  oint and Pager.n
a790: 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72  Savepoint to zer
a7a0: 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62  o. Close the sub
a7b0: 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69  -journal.** if i
a7c0: 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  t is open and th
a7d0: 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
a7e0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
a7f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a800: 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70   releaseAllSavep
a810: 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61  oints(Pager *pPa
a820: 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20  ger){.  int ii; 
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a840: 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f   Iterator for lo
a850: 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61  oping through Pa
a860: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a  ger.aSavepoint *
a870: 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  /.  for(ii=0; ii
a880: 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
a890: 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
a8a0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
a8b0: 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61  troy(pPager->aSa
a8c0: 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53  vepoint[ii].pInS
a8d0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20  avepoint);.  }. 
a8e0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
a8f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 73  clusiveMode || s
a900: 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
a910: 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  al(pPager->sjfd)
a920: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a930: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
a940: 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
a950: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
a960: 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >aSavepoint);.  
a970: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
a980: 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nt = 0;.  pPager
a990: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
a9a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  ;.  pPager->nSub
a9b0: 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Rec = 0;.}../*.*
a9c0: 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e 75  * Set the bit nu
a9d0: 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68 65  mber pgno in the
a9e0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
a9f0: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  pInSavepoint .**
aa00: 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c 20   bitvecs of all 
aa10: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
aa20: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
aa30: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  K if successful.
aa40: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** or SQLITE_NOM
aa50: 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  EM if a malloc f
aa60: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 2a  ailure occurs..*
aa70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  /.static int add
aa80: 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65  ToSavepointBitve
aa90: 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  cs(Pager *pPager
aaa0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
aab0: 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20 20  int ii;         
aac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
aad0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
aae0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
aaf0: 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  K;       /* Resu
ab00: 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66 6f  lt code */..  fo
ab10: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
ab20: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
ab30: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
ab40: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
ab50: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
ab60: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
ab70: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
ab80: 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71 6c  .      rc |= sql
ab90: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 2d  ite3BitvecSet(p-
aba0: 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70  >pInSavepoint, p
abb0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gno);.      test
abc0: 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  case( rc==SQLITE
abd0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20  _NOMEM );.      
abe0: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
abf0: 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
ac00: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
ac10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ac20: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  rc;.}../*.** Unl
ac30: 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
ac40: 20 66 69 6c 65 2e 20 54 68 69 73 20 66 75 6e 63   file. This func
ac50: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
ac60: 69 66 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  if the pager.** 
ac70: 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  is in exclusive 
ac80: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  mode..**.** If t
ac90: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
aca0: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
acb0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
acc0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
acd0: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
ace0: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
acf0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
ad00: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
ad10: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
ad20: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
ad30: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
ad40: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
ad50: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
ad60: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
ad70: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
ad80: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
ad90: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
ada0: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
adb0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
adc0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
add0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
ade0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
adf0: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
ae00: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
ae10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  e ){.    int rc;
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ae40: 63 6f 64 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  code */..    /* 
ae50: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
ae60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
ae70: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
ae80: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
ae90: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
aea0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
aeb0: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
aec0: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
aed0: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
aee0: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
aef0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
af00: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
af10: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
af20: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  fd);.    sqlite3
af30: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
af40: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
af50: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
af60: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
af70: 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76     releaseAllSav
af80: 65 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b  epoints(pPager);
af90: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
afa0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
afb0: 2c 20 73 6f 6d 65 62 6f 64 79 20 65 6c 73 65 20  , somebody else 
afc0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 69 74 2e  might change it.
afd0: 20 54 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75   The.    ** valu
afe0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 50 61 67  es stored in Pag
aff0: 65 72 2e 64 62 53 69 7a 65 20 65 74 63 2e 20 6d  er.dbSize etc. m
b000: 69 67 68 74 20 62 65 63 6f 6d 65 20 69 6e 76 61  ight become inva
b010: 6c 69 64 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  lid if.    ** th
b020: 69 73 20 68 61 70 70 65 6e 73 2e 20 54 4f 44 4f  is happens. TODO
b030: 3a 20 52 65 61 6c 6c 79 2c 20 74 68 69 73 20 64  : Really, this d
b040: 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20 62  oesn't need to b
b050: 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a 2a  e cleared.    **
b060: 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e 67   until the chang
b070: 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b 20  e-counter check 
b080: 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53 68  fails in PagerSh
b090: 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20 20  aredLock()..    
b0a0: 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
b0b0: 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a  bSizeValid = 0;.
b0c0: 0a 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f  .    rc = osUnlo
b0d0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
b0e0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
b0f0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 70 50 61   rc ){.      pPa
b100: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
b110: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  c;.    }.    IOT
b120: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
b130: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
b140: 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e 65     /* If Pager.e
b150: 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20 74  rrCode is set, t
b160: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b170: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 63  he pager cache c
b180: 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a 20  annot be.    ** 
b190: 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68 61  trusted. Now tha
b1a0: 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  t the pager file
b1b0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68   is unlocked, th
b1c0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
b1d0: 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63  e.    ** cache c
b1e0: 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20  an be discarded 
b1f0: 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
b200: 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65  de safely cleare
b210: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
b220: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
b230: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  e ){.      if( r
b240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b250: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b260: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
b270: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b280: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
b290: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
b2a0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
b2b0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
b2c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
b2d0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
b2e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
b2f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
b300: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
b310: 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f 52  en an IOERR, COR
b320: 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72 72  RUPT or FULL err
b330: 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20 6f  or.** may have o
b340: 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69 72  ccurred. The fir
b350: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
b360: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b370: 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63 74  pager .** struct
b380: 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20  ure, the second 
b390: 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61  the error-code a
b3a0: 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75 72  bout to be retur
b3b0: 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20 0a  ned by a pager .
b3c0: 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  ** API function.
b3d0: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
b3e0: 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ned is a copy of
b3f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
b400: 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69 73  ment .** to this
b410: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
b420: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
b430: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
b440: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
b450: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
b460: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
b470: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
b480: 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20  rsistent. Until 
b490: 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65 72  the persisten er
b4a0: 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c 0a  ror is cleared,.
b4b0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41 50  ** subsequent AP
b4c0: 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20  I calls on this 
b4d0: 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64  Pager will immed
b4e0: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
b4f0: 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72  e same .** error
b500: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70   code..**.** A p
b510: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b520: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
b530: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
b540: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
b550: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75  ** cannot be tru
b560: 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74 65  sted. This state
b570: 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20   can be cleared 
b580: 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69  by completely di
b590: 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65  scarding .** the
b5a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
b5b0: 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49 66   pager-cache. If
b5c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
b5d0: 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a 2a  as active when.*
b5e0: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
b5f0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
b600: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
b610: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
b620: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
b630: 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72 65  layed to restore
b640: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
b650: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b660: 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74 20  le (as if.** it 
b670: 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  were a hot-journ
b680: 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  al)..*/.static i
b690: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
b6a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
b6b0: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
b6c0: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
b6d0: 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70  assert(.       p
b6e0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
b6f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b700: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
b710: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
b720: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
b730: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
b740: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
b750: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
b760: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
b770: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
b780: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
b790: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
b7a0: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
b7b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
b7c0: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61   rc;.    if( pPa
b7d0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
b7e0: 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26  R_UNLOCK .     &
b7f0: 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
b800: 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
b810: 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
b820: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
b830: 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72  the pager is alr
b840: 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63  eady unlocked, c
b850: 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  all pager_unlock
b860: 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20  () now to.      
b870: 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72  ** clear the err
b880: 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73  or state and ens
b890: 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
b8a0: 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20  er-cache is .   
b8b0: 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79     ** completely
b8c0: 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f   empty..      */
b8d0: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  .      pager_unl
b8e0: 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
b8f0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b900: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65  rc;.}../*.** Exe
b910: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
b920: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
b930: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
b940: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
b950: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
b960: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
b970: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
b980: 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73  ered the error s
b990: 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 61 74 74  tate, do not att
b9a0: 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20 72 6f 6c  empt .** the rol
b9b0: 6c 62 61 63 6b 20 61 74 20 74 68 69 73 20 74 69  lback at this ti
b9c0: 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20 70 61 67  me. Instead, pag
b9d0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 63  er_unlock() is c
b9e0: 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a 20 63 61  alled. The.** ca
b9f0: 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f  ll to pager_unlo
ba00: 63 6b 28 29 20 77 69 6c 6c 20 64 69 73 63 61 72  ck() will discar
ba10: 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  d all in-memory 
ba20: 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b 0a 2a 2a  pages, unlock.**
ba30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ba40: 6c 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  le and clear the
ba50: 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 49 66   error state. If
ba60: 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   this means that
ba70: 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
ba80: 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ot-journal left 
ba90: 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  in the file-syst
baa0: 65 6d 2c 20 74 68 65 20 6e 65 78 74 20 63 6f 6e  em, the next con
bab0: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 6f 62  nection.** to ob
bac0: 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c 6f  tain a shared lo
bad0: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ck on the pager 
bae0: 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 74 68  (which may be th
baf0: 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a 2a 2a 20  is one) will.** 
bb00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
bb10: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
bb20: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
bb30: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
bb40: 6f 72 20 73 74 61 74 65 2c 20 62 75 74 20 61 6e  or state, but an
bb50: 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c 6c 6f 63   IO or.** malloc
bb60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
bb70: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
bb80: 20 74 68 65 6e 20 74 68 69 73 20 77 69 6c 6c 20   then this will 
bb90: 69 74 73 65 6c 66 20 63 61 75 73 65 20 0a 2a 2a  itself cause .**
bba0: 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 65 6e   the pager to en
bbb0: 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
bbc0: 61 74 65 2e 20 57 68 69 63 68 20 77 69 6c 6c 20  ate. Which will 
bbd0: 62 65 20 63 6c 65 61 72 65 64 20 62 79 20 74 68  be cleared by th
bbe0: 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61 67  e.** call to pag
bbf0: 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20 61 73 20  er_unlock(), as 
bc00: 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2e  described above.
bc10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
bc20: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
bc30: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
bc40: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
bc50: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bc60: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
bc70: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
bc80: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
bc90: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
bca0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bcb0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
bcc0: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
bcd0: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bce0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a  gnMalloc();.  }.
bcf0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bd00: 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
bd10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
bd20: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
bd30: 2e 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  . A transaction 
bd40: 69 73 20 75 73 75 61 6c 6c 79 20 65 6e 64 65 64  is usually ended
bd50: 20 62 79 20 0a 2a 2a 20 65 69 74 68 65 72 20 61   by .** either a
bd60: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bd70: 4c 42 41 43 4b 20 6f 70 65 72 61 74 69 6f 6e 2e  LBACK operation.
bd80: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
bd90: 79 20 62 65 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  y be called .** 
bda0: 61 66 74 65 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  after rollback o
bdb0: 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2c  f a hot-journal,
bdc0: 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
bdd0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
bde0: 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  ning.** the jour
bdf0: 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77 72 69 74  nal file or writ
be00: 69 6e 67 20 74 68 65 20 76 65 72 79 20 66 69 72  ing the very fir
be10: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
be20: 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74 61 62 61  r of a.** databa
be30: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  se transaction..
be40: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ** .** If the pa
be50: 67 65 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f  ger is in PAGER_
be60: 53 48 41 52 45 44 20 6f 72 20 50 41 47 45 52 5f  SHARED or PAGER_
be70: 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 77 68 65  UNLOCK state whe
be80: 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
be90: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
bea0: 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72 65 74 75  is a no-op (retu
beb0: 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a  rns SQLITE_OK)..
bec0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
bed0: 20 61 6e 79 20 61 63 74 69 76 65 20 73 61 76 65   any active save
bee0: 70 6f 69 6e 74 73 20 61 72 65 20 72 65 6c 65 61  points are relea
bef0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
bf00: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bf10: 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  s open, then it 
bf20: 69 73 20 22 66 69 6e 61 6c 69 7a 65 64 22 2e 20  is "finalized". 
bf30: 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61 6c 20 0a  Once a journal .
bf40: 2a 2a 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  ** file has been
bf50: 20 66 69 6e 61 6c 69 7a 65 64 20 69 74 20 69 73   finalized it is
bf60: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
bf70: 20 75 73 65 20 69 74 20 74 6f 20 72 6f 6c 6c 20   use it to roll 
bf80: 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72 61 6e 73  back a .** trans
bf90: 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77 69 6c 6c  action. Nor will
bfa0: 20 69 74 20 62 65 20 63 6f 6e 73 69 64 65 72 65   it be considere
bfb0: 64 20 74 6f 20 62 65 20 61 20 68 6f 74 2d 6a 6f  d to be a hot-jo
bfc0: 75 72 6e 61 6c 20 62 79 20 74 68 69 73 0a 2a 2a  urnal by this.**
bfd0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 64 61   or any other da
bfe0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
bff0: 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f 77 20 61  n. Exactly how a
c000: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61   journal is fina
c010: 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65 6e 64 73  lized.** depends
c020: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
c030: 6f 74 20 74 68 65 20 70 61 67 65 72 20 69 73 20  ot the pager is 
c040: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c050: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 0a 2a 2a  sive mode and.**
c060: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6a 6f 75   the current jou
c070: 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61 67 65 72  rnal-mode (Pager
c080: 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 76 61 6c  .journalMode val
c090: 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ue), as follows:
c0a0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
c0b0: 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a 2a 2a 20  Mode==MEMORY.** 
c0c0: 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65      Journal file
c0d0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 73   descriptor is s
c0e0: 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e 20 54 68  imply closed. Th
c0f0: 69 73 20 64 65 73 74 72 6f 79 73 20 61 6e 20 0a  is destroys an .
c100: 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  **     in-memory
c110: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
c120: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 54    journalMode==T
c130: 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 20 4a  RUNCATE.**     J
c140: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
c150: 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
c160: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
c170: 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d  **.**   journalM
c180: 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a 2a 2a 20  ode==PERSIST.** 
c190: 20 20 20 20 54 68 65 20 66 69 72 73 74 20 32 38      The first 28
c1a0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6a 6f   bytes of the jo
c1b0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65 20 7a  urnal file are z
c1c0: 65 72 6f 65 64 2e 20 54 68 69 73 20 69 6e 76 61  eroed. This inva
c1d0: 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20 20 20 74  lidates.**     t
c1e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c1f0: 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20 66   header in the f
c200: 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63 65 20 74  ile, and hence t
c210: 68 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61  he entire journa
c220: 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 2e 20 41  l.**     file. A
c230: 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75 72 6e 61  n invalid journa
c240: 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74 20 62 65  l file cannot be
c250: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c260: 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .**   journalMod
c270: 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20  e==DELETE.**    
c280: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c290: 65 20 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  e is closed and 
c2a0: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 73 71  deleted using sq
c2b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 29 2e  lite3OsDelete().
c2c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66 20 74 68  .**.**     If th
c2d0: 65 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69  e pager is runni
c2e0: 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
c2f0: 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65 74 68 6f  mode, this metho
c300: 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69 6e 67 0a  d of finalizing.
c310: 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e  **     the journ
c320: 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
c330: 20 75 73 65 64 2e 20 49 6e 73 74 65 61 64 2c 20   used. Instead, 
c340: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 4d 6f  if the journalMo
c350: 64 65 20 69 73 0a 2a 2a 20 20 20 20 20 44 45 4c  de is.**     DEL
c360: 45 54 45 20 61 6e 64 20 74 68 65 20 70 61 67 65  ETE and the page
c370: 72 20 69 73 20 69 6e 20 65 78 63 6c 75 73 69 76  r is in exclusiv
c380: 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d 65 74 68  e mode, the meth
c390: 6f 64 20 64 65 73 63 72 69 62 65 64 20 75 6e 64  od described und
c3a0: 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  er.**     journa
c3b0: 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 20 69  lMode==PERSIST i
c3c0: 73 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  s used instead..
c3d0: 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
c3e0: 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69 6e 61 6c  journal is final
c3f0: 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e 69 6e 67  ized, if running
c400: 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75 73 69 76   in non-exclusiv
c410: 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 70  e mode, the.** p
c420: 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 50 41  ager moves to PA
c430: 47 45 52 5f 53 48 41 52 45 44 20 73 74 61 74 65  GER_SHARED state
c440: 20 28 61 6e 64 20 64 6f 77 6e 67 72 61 64 65 73   (and downgrades
c450: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
c460: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c470: 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 29 2e 0a  e accordingly)..
c480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
c490: 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e  er is running in
c4a0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20   exclusive mode 
c4b0: 61 6e 64 20 69 73 20 69 6e 20 50 41 47 45 52 5f  and is in PAGER_
c4c0: 53 59 4e 43 45 44 20 73 74 61 74 65 2c 0a 2a 2a  SYNCED state,.**
c4d0: 20 69 74 20 6d 6f 76 65 73 20 74 6f 20 50 41 47   it moves to PAG
c4e0: 45 52 5f 45 58 43 4c 55 53 49 56 45 2e 20 4e 6f  ER_EXCLUSIVE. No
c4f0: 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f 77 6e 67   locks are downg
c500: 72 61 64 65 64 20 77 68 65 6e 20 72 75 6e 6e 69  raded when runni
c510: 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c 75 73 69  ng in.** exclusi
c520: 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53  ve mode..**.** S
c530: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c540: 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
c550: 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65   occurs. If an e
c560: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
c570: 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20 74 68 65  ng.** any of the
c580: 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   IO operations t
c590: 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
c5a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 75  ournal file or u
c5b0: 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  nlock the.** dat
c5c0: 61 62 61 73 65 20 74 68 65 6e 20 74 68 65 20 49  abase then the I
c5d0: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
c5e0: 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
c5f0: 75 73 65 72 2e 20 49 66 20 74 68 65 20 0a 2a 2a  user. If the .**
c600: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 66 69   operation to fi
c610: 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e  nalize the journ
c620: 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2c 20 74  al file fails, t
c630: 68 65 6e 20 74 68 65 20 63 6f 64 65 20 73 74 69  hen the code sti
c640: 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74 6f 20 75  ll.** tries to u
c650: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
c660: 73 65 20 66 69 6c 65 20 69 66 20 6e 6f 74 20 69  se file if not i
c670: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c680: 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75 6e 6c 6f  . If the.** unlo
c690: 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  ck operation fai
c6a0: 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74 68 65 6e  ls as well, then
c6b0: 20 74 68 65 20 66 69 72 73 74 20 65 72 72 6f 72   the first error
c6c0: 20 63 6f 64 65 20 72 65 6c 61 74 65 64 0a 2a 2a   code related.**
c6d0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 72   to the first er
c6e0: 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ror encountered 
c6f0: 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6e  (the journal fin
c700: 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65 29 20 69  alization one) i
c710: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
c720: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c730: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c740: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c750: 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29  , int hasMaster)
c760: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c770: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20  ITE_OK;      /* 
c780: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c790: 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61  journal finaliza
c7a0: 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
c7b0: 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  /.  int rc2 = SQ
c7c0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20  LITE_OK;     /* 
c7d0: 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
c7e0: 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63 6b 20 6f  db file unlock o
c7f0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69  peration */..  i
c800: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
c810: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
c820: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c830: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
c840: 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69  eleaseAllSavepoi
c850: 6e 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  nts(pPager);..  
c860: 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
c870: 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
c880: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
c890: 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73  l==0 );.  if( is
c8a0: 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
c8b0: 29 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54 4f 44  ) ){..    /* TOD
c8c0: 4f 3a 20 54 68 65 72 65 27 73 20 61 20 70 72 6f  O: There's a pro
c8d0: 62 6c 65 6d 20 68 65 72 65 20 69 66 20 61 20 6a  blem here if a j
c8e0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 77 61 73 20  ournal-file was 
c8f0: 6f 70 65 6e 65 64 20 69 6e 20 4d 45 4d 4f 52 59  opened in MEMORY
c900: 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 61 6e 64  .    ** mode and
c910: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
c920: 6c 2d 6d 6f 64 65 20 69 73 20 63 68 61 6e 67 65  l-mode is change
c930: 64 20 74 6f 20 54 52 55 4e 43 41 54 45 20 6f 72  d to TRUNCATE or
c940: 20 50 45 52 53 49 53 54 0a 20 20 20 20 2a 2a 20   PERSIST.    ** 
c950: 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73  during the trans
c960: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 63 6f 64  action. This cod
c970: 65 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  e should be chan
c980: 67 65 64 20 74 6f 20 61 73 73 75 6d 65 0a 20 20  ged to assume.  
c990: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6a 6f    ** that the jo
c9a0: 75 72 6e 61 6c 20 6d 6f 64 65 20 68 61 73 20 6e  urnal mode has n
c9b0: 6f 74 20 63 68 61 6e 67 65 64 20 73 69 6e 63 65  ot changed since
c9c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c9d0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 73 74 61 72   was.    ** star
c9e0: 74 65 64 2e 20 41 6e 64 20 74 68 65 20 73 71 6c  ted. And the sql
c9f0: 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
ca00: 4d 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Mode() function 
ca10: 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a  should be.    **
ca20: 20 63 68 61 6e 67 65 64 20 74 6f 20 6d 61 6b 65   changed to make
ca30: 20 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20   sure that this 
ca40: 69 73 20 74 68 65 20 63 61 73 65 20 74 6f 6f 2e  is the case too.
ca50: 0a 20 20 20 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  .    */..    /* 
ca60: 46 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  Finalize the jou
ca70: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
ca80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
ca90: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
caa0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
cab0: 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
cac0: 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c   isMemoryJournal
cad0: 20 3d 20 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a   = sqlite3IsMemJ
cae0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
caf0: 66 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  fd);.      sqlit
cb00: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
cb10: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69 66  ->jfd);.      if
cb20: 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75 72 6e  ( !isMemoryJourn
cb30: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  al ){.        rc
cb40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
cb50: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
cb60: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
cb70: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
cb80: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61     }else if( pPa
cb90: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
cba0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
cbb0: 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  ODE_TRUNCATE ){.
cbc0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
cbd0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
cbe0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
cbf0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
cc00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
cc10: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
cc20: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
cc30: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  fd, 0);.      }.
cc40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cc50: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cc60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cc70: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cc80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
cc90: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
cca0: 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61  ode .     || pPa
ccb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
ccc0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
ccd0: 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20  ODE_PERSIST.    
cce0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65  ){.      rc = ze
ccf0: 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  roJournalHdr(pPa
cd00: 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b  ger, hasMaster);
cd10: 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
cd20: 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
cd30: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cd40: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
cd50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
cd60: 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
cd70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cd80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
cd90: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
cda0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
cdb0: 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29 3b 0a  DELETE || rc );.
cdc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
cdd0: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
cde0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
cdf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70  =SQLITE_OK && !p
ce00: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
ce10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ce20: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ce30: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
ce40: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
ce50: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ce60: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ce70: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
ce80: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
ce90: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
cea0: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
ceb0: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
cec0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
ced0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
cee0: 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
cef0: 68 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  he);.    sqlite3
cf00: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
cf10: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
cf20: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
cf30: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
cf40: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
cf50: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 0;.  }..  if( 
cf60: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cf70: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
cf80: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
cf90: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
cfa0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
cfb0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cfc0: 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 50 61  _SHARED;.    pPa
cfd0: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
cfe0: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Done = 0;.  }els
cff0: 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74  e if( pPager->st
d000: 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate==PAGER_SYNCE
d010: 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  D ){.    pPager-
d020: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
d030: 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20  XCLUSIVE;.  }.  
d040: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
d050: 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
d060: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
d070: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
d080: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54  ied = 0;..  /* T
d090: 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f 70 74  ODO: Is this opt
d0a0: 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74 68 65  imal? Why is the
d0b0: 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c 69 64   db size invalid
d0c0: 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a 2a 20  ated here .  ** 
d0d0: 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  when the databas
d0e0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 75 6e  e file is not un
d0f0: 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70 50 61  locked? */.  pPa
d100: 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20  ger->dbOrigSize 
d110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  = 0;.  sqlite3Pc
d120: 61 63 68 65 54 72 75 6e 63 61 74 65 28 70 50 61  acheTruncate(pPa
d130: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50  ger->pPCache, pP
d140: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
d150: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
d160: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
d170: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
d180: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
d190: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
d1a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
d1b0: 65 74 65 72 20 61 44 61 74 61 20 6d 75 73 74 20  eter aData must 
d1c0: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
d1d0: 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70 61 67  r of pPager->pag
d1e0: 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a 20 6f  eSize bytes.** o
d1f0: 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74 65 20  f data. Compute 
d200: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
d210: 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 74 20  cksum based ont 
d220: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
d230: 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f 66 20  the .** page of 
d240: 64 61 74 61 20 61 6e 64 20 74 68 65 20 63 75 72  data and the cur
d250: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 70 50  rent value of pP
d260: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 2e  ager->cksumInit.
d270: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
d280: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
d290: 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c 6c 79  um. It is really
d2a0: 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66   just the sum of
d2b0: 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20   the .** random 
d2c0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 28 70  initial value (p
d2d0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
d2e0: 29 20 61 6e 64 20 65 76 65 72 79 20 32 30 30 74  ) and every 200t
d2f0: 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 65  h byte.** of the
d300: 20 70 61 67 65 20 64 61 74 61 2c 20 73 74 61 72   page data, star
d310: 74 69 6e 67 20 77 69 74 68 20 62 79 74 65 20 6f  ting with byte o
d320: 66 66 73 65 74 20 28 70 50 61 67 65 72 2d 3e 70  ffset (pPager->p
d330: 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a 2a 2a  ageSize%200)..**
d340: 20 45 61 63 68 20 62 79 74 65 20 69 73 20 69 6e   Each byte is in
d350: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 6e 20  terpreted as an 
d360: 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 69  8-bit unsigned i
d370: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 68  nteger..**.** Ch
d380: 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72 6d 75  anging the formu
d390: 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75  la used to compu
d3a0: 74 65 20 74 68 69 73 20 63 68 65 63 6b 73 75 6d  te this checksum
d3b0: 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 0a 2a   results in an.*
d3c0: 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6a  * incompatible j
d3d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
d3e0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a 6f 75  at..**.** If jou
d3f0: 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  rnal corruption 
d400: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
d410: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
d420: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 0a  he most likely .
d430: 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74  ** scenario is t
d440: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
d450: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
d460: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
d470: 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74 20 69  hanged. .** It i
d480: 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  s much less like
d490: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
d4a0: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
d4b0: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
d4c0: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
d4d0: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
d4e0: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
d4f0: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
d500: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
d510: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
d520: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
d530: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
d540: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
d550: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
d560: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
d570: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
d580: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
d590: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
d5a0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20  ->cksumInit;    
d5b0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
d5c0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
d5d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 70 50   */.  int i = pP
d5e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
d5f0: 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  00;          /* 
d600: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
d610: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
d620: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
d630: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
d640: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
d650: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
d660: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
d670: 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68 65 72  page from either
d680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d690: 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  e (if isMainJrnl
d6a0: 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f 6d 20  ==1) or.** from 
d6b0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
d6c0: 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d  (if isMainJrnl==
d6d0: 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63 6b 20  0) and playback 
d6e0: 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20 54 68  that page..** Th
d6f0: 65 20 70 61 67 65 20 62 65 67 69 6e 73 20 61 74  e page begins at
d700: 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73 65 74   offset *pOffset
d710: 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   into the file. 
d720: 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a 2a 20  The *pOffset.** 
d730: 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65 61 73  value is increas
d740: 65 64 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  ed to the start 
d750: 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
d760: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
d770: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69  .**.** The isMai
d780: 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72  nJrnl flag is tr
d790: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ue if this is th
d7a0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
d7b0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66  journal and.** f
d7c0: 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61  alse for the sta
d7d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
d7e0: 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   The main rollba
d7f0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a  ck journal uses.
d800: 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74  ** checksums - t
d810: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d820: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  rnal does not..*
d830: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
d840: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   number of the p
d850: 61 67 65 20 72 65 63 6f 72 64 20 72 65 61 64 20  age record read 
d860: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d870: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
d880: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
d890: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
d8a0: 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a 65   of Pager.dbSize
d8b0: 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 20  , then playback 
d8c0: 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20 61 6e  is.** skipped an
d8d0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
d8e0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
d8f0: 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74 20 4e  f pDone is not N
d900: 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ULL, then it is 
d910: 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61 67 65  a record of page
d920: 73 20 74 68 61 74 20 68 61 76 65 20 61 6c 72 65  s that have alre
d930: 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c 61 79  ady.** been play
d940: 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74 68 65  ed back.  If the
d950: 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66 73 65   page at *pOffse
d960: 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
d970: 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 0a 2a  en played back.*
d980: 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72 65 73  * (if the corres
d990: 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20 62 69  ponding pDone bi
d9a0: 74 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 73  t is set) then s
d9b0: 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61 63 6b  kip the playback
d9c0: 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  ..** Make sure t
d9d0: 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63 6f 72  he pDone bit cor
d9e0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
d9f0: 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67 65 20  e *pOffset page 
da00: 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f 72 20  is set.** prior 
da10: 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  to returning..**
da20: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
da30: 72 65 63 6f 72 64 20 69 73 20 73 75 63 63 65 73  record is succes
da40: 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d  sfully read from
da50: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
da60: 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 70  al file.** and p
da70: 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68 65 6e  layed back, then
da80: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
da90: 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f  turned. If an IO
daa0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 2a 2a   error occurs.**
dab0: 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 74   while reading t
dac0: 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74  he record from t
dad0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
dae0: 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65 20 77   file or while w
daf0: 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74 68 65  riting.** to the
db00: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
db10: 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
db20: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
db30: 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a 20 69  ed. If data.** i
db40: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72  s successfully r
db50: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ead from the (su
db60: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
db70: 62 75 74 20 61 70 70 65 61 72 73 20 74 6f 20 62  but appears to b
db80: 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 2c 20  e.** corrupted, 
db90: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
dba0: 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20 69 73  eturned. Data is
dbb0: 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f 72 72   considered corr
dbc0: 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77 6f 20  upted in.** two 
dbd0: 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a 0a 2a  circumstances:.*
dbe0: 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65  * .**   * If the
dbf0: 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e 75 6d   record page-num
dc00: 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c 20 28  ber is illegal (
dc10: 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  0 or PAGER_MJ_PG
dc20: 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 49  NO), or.**   * I
dc30: 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
dc40: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
dc50: 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  k from the main 
dc60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
dc70: 20 20 20 20 61 6e 64 20 74 68 65 20 63 68 65 63      and the chec
dc80: 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65 73 20  ksum field does 
dc90: 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 72 65  not match the re
dca0: 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cord content..**
dcb0: 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66 20 74  .** Neither of t
dcc0: 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61 72 69  hese two scenari
dcd0: 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c 65 20  os are possible 
dce0: 64 75 72 69 6e 67 20 61 20 73 61 76 65 70 6f 69  during a savepoi
dcf0: 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  nt rollback..**.
dd00: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
dd10: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
dd20: 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72 79 20  ck, then memory 
dd30: 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65 20 64  may have to be d
dd40: 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c  ynamically.** al
dd50: 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
dd60: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69  function. If thi
dd70: 73 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  s is the case an
dd80: 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  d an allocation 
dd90: 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49 54 45  fails,.** SQLITE
dda0: 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
ddb0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
ddc0: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
ddd0: 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67  _one_page(.  Pag
dde0: 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
de00: 65 20 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c  e pager being pl
de10: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  ayed back */.  i
de20: 6e 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20  nt isMainJrnl,  
de30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de40: 31 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  1 -> main journa
de50: 6c 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72  l. 0 -> sub-jour
de60: 6e 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  nal. */.  int is
de70: 55 6e 73 79 6e 63 2c 20 20 20 20 20 20 20 20 20  Unsync,         
de80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
de90: 69 66 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  if reading from 
dea0: 75 6e 73 79 6e 63 65 64 20 6d 61 69 6e 20 6a 6f  unsynced main jo
deb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 2a  urnal */.  i64 *
dec0: 70 4f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20  pOffset,        
ded0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
dee0: 65 74 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20  et of record to 
def0: 70 6c 61 79 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  playback */.  in
df00: 74 20 69 73 53 61 76 65 70 6e 74 2c 20 20 20 20  t isSavepnt,    
df10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
df20: 72 75 65 20 66 6f 72 20 61 20 73 61 76 65 70 6f  rue for a savepo
df30: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  int rollback */.
df40: 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e 65 20    Bitvec *pDone 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df60: 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
df70: 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61 79 65  es already playe
df80: 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  d back */.){.  i
df90: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
dfa0: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
dfb0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
dfc0: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
dfd0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
dfe0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
dff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e000: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
e010: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
e020: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
e030: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
e040: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
e050: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
e060: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
e070: 75 38 20 2a 61 44 61 74 61 3b 20 20 20 20 20 20  u8 *aData;      
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e090: 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   Temporary stora
e0a0: 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ge for the page 
e0b0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
e0c0: 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20  e *jfd;         
e0d0: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
e0e0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
e0f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
e100: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  /..  assert( (is
e110: 4d 61 69 6e 4a 72 6e 6c 26 7e 31 29 3d 3d 30 20  MainJrnl&~1)==0 
e120: 29 3b 20 20 20 20 20 20 2f 2a 20 69 73 4d 61 69  );      /* isMai
e130: 6e 4a 72 6e 6c 20 69 73 20 30 20 6f 72 20 31 20  nJrnl is 0 or 1 
e140: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  */.  assert( (is
e150: 53 61 76 65 70 6e 74 26 7e 31 29 3d 3d 30 20 29  Savepnt&~1)==0 )
e160: 3b 20 20 20 20 20 20 20 2f 2a 20 69 73 53 61 76  ;       /* isSav
e170: 65 70 6e 74 20 69 73 20 30 20 6f 72 20 31 20 2a  epnt is 0 or 1 *
e180: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4d 61  /.  assert( isMa
e190: 69 6e 4a 72 6e 6c 20 7c 7c 20 70 44 6f 6e 65 20  inJrnl || pDone 
e1a0: 29 3b 20 20 20 20 20 2f 2a 20 70 44 6f 6e 65 20  );     /* pDone 
e1b0: 61 6c 77 61 79 73 20 75 73 65 64 20 6f 6e 20 73  always used on s
e1c0: 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a 20  ub-journals */. 
e1d0: 20 61 73 73 65 72 74 28 20 69 73 53 61 76 65 70   assert( isSavep
e1e0: 6e 74 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29  nt || pDone==0 )
e1f0: 3b 20 20 20 2f 2a 20 70 44 6f 6e 65 20 6e 65 76  ;   /* pDone nev
e200: 65 72 20 75 73 65 64 20 6f 6e 20 6e 6f 6e 2d 73  er used on non-s
e210: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 61  avepoint */..  a
e220: 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67  Data = (u8*)pPag
e230: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
e240: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
e250: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  ;         /* Tem
e260: 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20 68  p storage must h
e270: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e280: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20   allocated */.. 
e290: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 70 61 67   /* Read the pag
e2a0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
e2b0: 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  e data from the 
e2c0: 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a  journal or sub-j
e2d0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
e2e0: 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  . Return an erro
e2f0: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
e300: 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f 20 65 72  ller if an IO er
e310: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20 20 2a 2f  ror occurs..  */
e320: 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61 69 6e 4a  .  jfd = isMainJ
e330: 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  rnl ? pPager->jf
e340: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 6a 66 64  d : pPager->sjfd
e350: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
e360: 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66 66 73 65  its(jfd, *pOffse
e370: 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28  t, &pgno);.  if(
e380: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
e3a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
e3b0: 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61  (jfd, aData, pPa
e3c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28  ger->pageSize, (
e3d0: 2a 70 4f 66 66 73 65 74 29 2b 34 29 3b 0a 20 20  *pOffset)+4);.  
e3e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e3f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
e400: 20 2a 70 4f 66 66 73 65 74 20 2b 3d 20 70 50 61   *pOffset += pPa
e410: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
e420: 34 20 2b 20 69 73 4d 61 69 6e 4a 72 6e 6c 2a 34  4 + isMainJrnl*4
e430: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
e440: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
e450: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
e460: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
e470: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
e480: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
e490: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
e4a0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
e4b0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
e4c0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
e4d0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
e4e0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
e4f0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e500: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
e510: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
e520: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
e530: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
e540: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
e550: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
e560: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
e570: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
e580: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
e590: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
e5a0: 69 73 53 61 76 65 70 6e 74 20 29 3b 0a 20 20 20  isSavepnt );.   
e5b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
e5c0: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
e5d0: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
e5e0: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
e5f0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
e600: 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
e610: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e620: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
e630: 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
e640: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
e650: 6a 66 64 2c 20 28 2a 70 4f 66 66 73 65 74 29 2d  jfd, (*pOffset)-
e660: 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20  4, &cksum);.    
e670: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
e680: 72 63 3b 0a 20 20 20 20 69 66 28 20 21 69 73 53  rc;.    if( !isS
e690: 61 76 65 70 6e 74 20 26 26 20 70 61 67 65 72 5f  avepnt && pager_
e6a0: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
e6b0: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
e6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6d0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
e6e0: 20 7d 0a 0a 20 20 69 66 28 20 70 44 6f 6e 65 20   }..  if( pDone 
e6f0: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
e700: 42 69 74 76 65 63 53 65 74 28 70 44 6f 6e 65 2c  BitvecSet(pDone,
e710: 20 70 67 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f   pgno))!=SQLITE_
e720: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
e730: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
e740: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e750: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
e760: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
e770: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
e780: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
e790: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
e7a0: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
e7b0: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
e7c0: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
e7d0: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
e7e0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
e7f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
e800: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
e810: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
e820: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
e830: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
e840: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
e850: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
e860: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65  ..  **.  ** An e
e870: 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20  xception to the 
e880: 61 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74  above rule: If t
e890: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69  he database is i
e8a0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20  n no-sync mode. 
e8b0: 20 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69   ** and a page i
e8c0: 73 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61  s moved during a
e8d0: 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
e8e0: 63 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61  cuum then the pa
e8f0: 67 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20  ge may.  ** not 
e900: 62 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  be in the pager 
e910: 63 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66  cache. Later: if
e920: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
e930: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20  O error occurs. 
e940: 20 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76   ** during a Mov
e950: 65 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68  epage() call, th
e960: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20  en the page may 
e970: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61  not be in the ca
e980: 63 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e  che.  ** either.
e990: 20 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f   So the conditio
e9a0: 6e 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74  n described in t
e9b0: 68 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61  he above paragra
e9c0: 70 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61  ph is not.  ** a
e9d0: 73 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a  ssert()able..  *
e9e0: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
e9f0: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
ea00: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
ea10: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
ea20: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
ea30: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
ea40: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
ea50: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
ea60: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
ea70: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
ea80: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ea90: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
eaa0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
eab0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
eac0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
ead0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
eae0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
eaf0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
eb00: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
eb10: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
eb20: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
eb30: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
eb40: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
eb50: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
eb60: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
eb70: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
eb80: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
eb90: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
eba0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
ebb0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
ebc0: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
ebd0: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
ebe0: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
ebf0: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
ec00: 65 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20  ents are synced 
ec10: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f  into the main ro
ec20: 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
ec30: 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  nal.  Otherwise,
ec40: 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69   a power loss mi
ec50: 67 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69  ght leave modifi
ec60: 65 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20  ed data in the. 
ec70: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
ec80: 65 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74  e without an ent
ec90: 72 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ry in the rollba
eca0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20  ck journal that 
ecb0: 63 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  can.  ** restore
ecc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ecd0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f   its original fo
ece0: 72 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69  rm.  Two conditi
ecf0: 6f 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ons must be.  **
ed00: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
ed10: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
ed20: 61 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74  ase files. (1) t
ed30: 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
ed40: 20 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e   be.  ** locked.
ed50: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
ed60: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
ed70: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20  page content is 
ed80: 66 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a  fully synced.  *
ed90: 2a 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * in the main jo
eda0: 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63  urnal either bec
edb0: 61 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73  ause the page is
edc0: 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
edd0: 20 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70   else.  ** the p
ede0: 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
edf0: 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20   needSync==0..  
ee00: 2a 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d  **.  ** 2008-04-
ee10: 31 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70  14:  When attemp
ee20: 74 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61  ting to vacuum a
ee30: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
ee40: 65 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20  e file, it.  ** 
ee50: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66  is possible to f
ee60: 61 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ail a statement 
ee70: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68  on a database th
ee80: 61 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20  at does not yet 
ee90: 65 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e  exist..  ** Do n
eea0: 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  ot attempt to wr
eeb0: 69 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20  ite if database 
eec0: 66 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62  file has never b
eed0: 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f  een opened..  */
eee0: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
eef0: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
ef00: 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
ef10: 50 67 20 7c 7c 20 21 4d 45 4d 44 42 20 29 3b 0a  Pg || !MEMDB );.
ef20: 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 50    PAGERTRACE(("P
ef30: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
ef40: 25 64 20 68 61 73 68 28 25 30 38 78 29 20 25 73  %d hash(%08x) %s
ef50: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
ef60: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
ef70: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
ef80: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
ef90: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
efa0: 61 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a),.            
efb0: 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22     (isMainJrnl?"
efc0: 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73  main-journal":"s
efd0: 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29  ub-journal").  )
efe0: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
eff0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
f000: 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20  XCLUSIVE).   && 
f010: 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70  (pPg==0 || 0==(p
f020: 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
f030: 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26  NEED_SYNC)).   &
f040: 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
f050: 3e 66 64 29 0a 20 20 20 26 26 20 21 69 73 55 6e  >fd).   && !isUn
f060: 73 79 6e 63 0a 20 20 29 7b 0a 20 20 20 20 69 36  sync.  ){.    i6
f070: 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
f080: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
f090: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
f0a0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
f0b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
f0c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
f0d0: 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 20  Size, ofst);.   
f0e0: 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
f0f0: 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
f100: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
f110: 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b  FileSize = pgno;
f120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
f130: 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20 29  Pager->pBackup )
f140: 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  {.      CODEC1(p
f150: 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
f160: 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54 45  no, 3, rc=SQLITE
f170: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 20 20 73  _NOMEM);.      s
f180: 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
f190: 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
f1a0: 75 70 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  up, pgno, aData)
f1b0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
f1c0: 50 61 67 65 72 2c 20 61 44 61 74 61 2c 20 70 67  Pager, aData, pg
f1d0: 6e 6f 2c 20 30 2c 20 72 63 3d 53 51 4c 49 54 45  no, 0, rc=SQLITE
f1e0: 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 7d 0a 20  _NOMEM);.    }. 
f1f0: 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
f200: 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
f210: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
f220: 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
f230: 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
f240: 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
f250: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
f260: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
f270: 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
f280: 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
f290: 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
f2a0: 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
f2b0: 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
f2c0: 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
f2d0: 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
f2e0: 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
f2f0: 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
f300: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
f310: 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
f320: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
f330: 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
f340: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f350: 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
f360: 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
f370: 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
f380: 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
f390: 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
f3a0: 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
f3b0: 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
f3c0: 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
f3d0: 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
f3e0: 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
f3f0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
f400: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
f410: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
f420: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
f430: 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
f440: 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
f450: 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
f460: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
f470: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
f480: 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
f490: 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
f4a0: 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
f4b0: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
f4c0: 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
f4d0: 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
f4e0: 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
f4f0: 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
f500: 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
f510: 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
f520: 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
f530: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
f540: 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
f550: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
f560: 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
f570: 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
f580: 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
f590: 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  epnt );.    if( 
f5a0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
f5b0: 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
f5c0: 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
f5d0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
f5e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
f5f0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
f600: 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
f610: 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
f620: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
f630: 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
f640: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
f650: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
f660: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
f670: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
f680: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
f690: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
f6a0: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
f6b0: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
f6c0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
f6d0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f6e0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
f6f0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
f700: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
f710: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
f720: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
f730: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
f740: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
f750: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
f760: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
f770: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
f780: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
f790: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
f7a0: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
f7b0: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
f7c0: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
f7d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
f7e0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
f7f0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
f800: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f810: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
f820: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
f830: 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
f840: 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
f850: 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
f860: 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
f870: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
f880: 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
f890: 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
f8a0: 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
f8b0: 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
f8c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
f8d0: 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
f8e0: 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
f8f0: 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
f900: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f910: 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
f920: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
f930: 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
f940: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
f950: 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
f960: 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
f970: 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
f980: 75 74 20 74 6f 20 74 68 65 2e 0a 20 20 20 20 20  ut to the..     
f990: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
f9a0: 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65 70 74  re is one except
f9b0: 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75 6c 65  ion to this rule
f9c0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
f9d0: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a 20 20   being rolled.  
f9e0: 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73 20 70      ** back as p
f9f0: 61 72 74 20 6f 66 20 61 20 73 61 76 65 70 6f 69  art of a savepoi
fa00: 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  nt (or statement
fa10: 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ) rollback from 
fa20: 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73  an .      ** uns
fa30: 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  ynced portion of
fa40: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
fa50: 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  l file, then it 
fa60: 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20 20 20  is not safe.    
fa70: 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74 68 65    ** to mark the
fa80: 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 20   page as clean. 
fa90: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
faa0: 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61 67 65  marking the page
fab0: 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   as.      ** cle
fac0: 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20 74 68  an will clear th
fad0: 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  e PGHDR_NEED_SYN
fae0: 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20 74 68  C flag. Since th
faf0: 65 20 70 61 67 65 20 69 73 0a 20 20 20 20 20 20  e page is.      
fb00: 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
fb10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
fb20: 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61 67 65  recorded in Page
fb30: 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20 61 6e  r.pInJournal) an
fb40: 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50  d.      ** the P
fb50: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
fb60: 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64 2c 20  lag is cleared, 
fb70: 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 77  if the page is w
fb80: 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20 20 20  ritten to.      
fb90: 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ** again within 
fba0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
fbb0: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d 61 72  , it will be mar
fbc0: 6b 65 64 20 61 73 20 64 69 72 74 79 20 62 75 74  ked as dirty but
fbd0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 50 47  .      ** the PG
fbe0: 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
fbf0: 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 73  ag will not be s
fc00: 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74 68 65  et. It could the
fc10: 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a 20 20  n potentially.  
fc20: 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65      ** be writte
fc30: 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65 20 64  n out into the d
fc40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
fc50: 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20  ore its journal 
fc60: 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 65  file.      ** se
fc70: 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65 64 2e  gment is synced.
fc80: 20 49 66 20 61 20 63 72 61 73 68 20 6f 63 63 75   If a crash occu
fc90: 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66 6f 6c  rs during or fol
fca0: 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20 20 20  lowing this,.   
fcb0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 63     ** database c
fcc0: 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 65 6e  orruption may en
fcd0: 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sue..      */.  
fce0: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
fcf0: 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b  eMakeClean(pPg);
fd00: 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
fd10: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
fd20: 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
fd30: 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
fd40: 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
fd50: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
fd60: 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e  was page 1, then
fd70: 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c   restore the val
fd80: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
fd90: 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44  leVers..    ** D
fda0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61 6e  o this before an
fdb0: 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20  y decoding. */. 
fdc0: 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29     if( pgno==1 )
fdd0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
fde0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
fdf0: 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74 61  rs, &((u8*)pData
fe00: 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61  )[24],sizeof(pPa
fe10: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
fe20: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
fe30: 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67 65   Decode the page
fe40: 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d 20   just read from 
fe50: 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45  disk */.    CODE
fe60: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
fe70: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 2c 20  , pPg->pgno, 3, 
fe80: 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  rc=SQLITE_NOMEM)
fe90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
fea0: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
feb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
fec0: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
fed0: 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
fee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f 56 45  ined(SQLITE_COVE
fef0: 52 41 47 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  RAGE_TEST)./*.**
ff00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   This routine lo
ff10: 6f 6b 73 20 61 68 65 61 64 20 69 6e 74 6f 20 74  oks ahead into t
ff20: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ff30: 66 69 6c 65 20 61 6e 64 20 64 65 74 65 72 6d 69  file and determi
ff40: 6e 65 73 0a 2a 2a 20 77 68 65 74 68 65 72 20 6f  nes.** whether o
ff50: 72 20 6e 6f 74 20 74 68 65 20 6e 65 78 74 20 72  r not the next r
ff60: 65 63 6f 72 64 20 28 74 68 65 20 72 65 63 6f 72  ecord (the recor
ff70: 64 20 74 68 61 74 20 62 65 67 69 6e 73 20 61 74  d that begins at
ff80: 20 66 69 6c 65 0a 2a 2a 20 6f 66 66 73 65 74 20   file.** offset 
ff90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ffa0: 66 66 29 20 69 73 20 61 20 77 65 6c 6c 2d 66 6f  ff) is a well-fo
ffb0: 72 6d 65 64 20 70 61 67 65 20 72 65 63 6f 72 64  rmed page record
ffc0: 20 63 6f 6e 73 69 73 74 69 6e 67 0a 2a 2a 20 6f   consisting.** o
ffd0: 66 20 61 20 76 61 6c 69 64 20 70 61 67 65 20 6e  f a valid page n
ffe0: 75 6d 62 65 72 2c 20 70 50 61 67 65 2d 3e 70 61  umber, pPage->pa
fff0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
10000 63 6f 6e 74 65 6e 74 2c 20 66 6f 6c 6c 6f 77 65  content, followe
10010 64 0a 2a 2a 20 62 79 20 61 20 76 61 6c 69 64 20  d.** by a valid 
10020 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  checksum..**.** 
10030 54 68 65 20 70 61 67 65 72 20 6e 65 76 65 72 20  The pager never 
10040 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 74 68  needs to know th
10050 69 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  is in order to d
10060 6f 20 69 74 73 20 6a 6f 62 2e 20 20 20 54 68 69  o its job.   Thi
10070 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
10080 6f 6e 6c 79 20 75 73 65 64 20 66 72 6f 6d 20 77  only used from w
10090 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 61  ithin assert() a
100a0 6e 64 20 74 65 73 74 63 61 73 65 28 29 20 6d 61  nd testcase() ma
100b0 63 72 6f 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cros..*/.static 
100c0 69 6e 74 20 70 61 67 65 72 4e 65 78 74 4a 6f 75  int pagerNextJou
100d0 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
100e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
100f0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
10100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
10110 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
10120 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 63   page */.  u32 c
10130 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
10140 2f 2a 20 54 68 65 20 70 61 67 65 20 63 68 65 63  /* The page chec
10150 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ksum */.  int rc
10160 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10170 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
10180 6f 6d 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f  om read operatio
10190 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ns */.  sqlite3_
101a0 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 2f 2a 20  file *fd;    /* 
101b0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
101c0 74 6f 72 20 66 72 6f 6d 20 77 68 69 63 68 20 77  tor from which w
101d0 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 2a 2f  e are reading */
101e0 0a 20 20 75 38 20 2a 61 44 61 74 61 3b 20 20 20  .  u8 *aData;   
101f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
10200 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
10210 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
10220 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 61   page number hea
10230 64 65 72 20 2a 2f 0a 20 20 66 64 20 3d 20 70 50  der */.  fd = pP
10240 61 67 65 72 2d 3e 6a 66 64 3b 0a 20 20 72 63 20  ager->jfd;.  rc 
10250 3d 20 72 65 61 64 33 32 62 69 74 73 28 66 64 2c  = read32bits(fd,
10260 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10270 4f 66 66 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  Off, &pgno);.  i
10280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10290 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
102d0 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
102e0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
102f0 4f 28 70 50 61 67 65 72 29 20 29 7b 20 72 65 74  O(pPager) ){ ret
10300 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10310 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 69   /*NO_TEST*/.  i
10320 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29 70 50  f( pgno>(Pgno)pP
10330 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 20  ager->dbSize ){ 
10340 72 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20  return 0; }     
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20 20   /*NO_TEST*/..  
10370 2f 2a 20 52 65 61 64 20 74 68 65 20 63 68 65 63  /* Read the chec
10380 6b 73 75 6d 20 2a 2f 0a 20 20 72 63 20 3d 20 72  ksum */.  rc = r
10390 65 61 64 33 32 62 69 74 73 28 66 64 2c 20 70 50  ead32bits(fd, pP
103a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
103b0 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
103c0 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
103d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
103e0 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  K ){ return 0; }
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10410 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a 20    /*NO_TEST*/.. 
10420 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
10430 61 20 61 6e 64 20 76 65 72 69 66 79 20 74 68 65  a and verify the
10440 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 61   checksum */.  a
10450 44 61 74 61 20 3d 20 28 75 38 2a 29 70 50 61 67  Data = (u8*)pPag
10460 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
10470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
10480 65 61 64 28 66 64 2c 20 61 44 61 74 61 2c 20 70  ead(fd, aData, p
10490 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
104a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
104b0 4f 66 66 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  Off+4);.  if( rc
104c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72  !=SQLITE_OK ){ r
104d0 65 74 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20  eturn 0; }      
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10500 5f 54 45 53 54 2a 2f 0a 20 20 69 66 28 20 70 61  _TEST*/.  if( pa
10510 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
10520 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
10530 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20 20  ){ return 0; }  
10540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f              /*NO
10550 5f 54 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65  _TEST*/..  /* Re
10560 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20 6f  ach this point o
10570 6e 6c 79 20 69 66 20 74 68 65 20 70 61 67 65 20  nly if the page 
10580 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 72 65  is valid */.  re
10590 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
105a0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 4e 44 45   /* !defined(NDE
105b0 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
105c0 53 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f  SQLITE_COVERAGE_
105d0 54 45 53 54 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TEST) */../*.** 
105e0 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
105f0 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
10600 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10610 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
10620 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
10630 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
10640 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
10650 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
10660 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
10670 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
10680 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
10690 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
106a0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
106b0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
106c0 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
106d0 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
106e0 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
106f0 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
10700 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
10710 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
10720 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
10730 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
10740 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
10750 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 20 6d 61  .**.** When a ma
10760 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10770 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 69 74  e is created, it
10780 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
10790 74 68 20 74 68 65 20 6e 61 6d 65 73 20 0a 2a 2a  th the names .**
107a0 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74 73 20 63   of all of its c
107b0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2c 20 6f  hild journals, o
107c0 6e 65 20 61 66 74 65 72 20 61 6e 6f 74 68 65 72  ne after another
107d0 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 75  , formatted as u
107e0 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f 64 65 64  tf-8 .** encoded
107f0 20 74 65 78 74 2e 20 54 68 65 20 65 6e 64 20 6f   text. The end o
10800 66 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  f each child jou
10810 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6d 61 72  rnal file is mar
10820 6b 65 64 20 77 69 74 68 20 61 20 0a 2a 2a 20 6e  ked with a .** n
10830 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 62 79  ul-terminator by
10840 74 65 20 28 30 78 30 30 29 2e 20 69 2e 65 2e 20  te (0x00). i.e. 
10850 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
10860 6e 74 73 20 6f 66 20 61 20 6d 61 73 74 65 72 20  nts of a master 
10870 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
10880 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
10890 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74 77 6f 20  n involving two 
108a0 64 61 74 61 62 61 73 65 73 20 6d 69 67 68 74 20  databases might 
108b0 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 2f 68 6f  be:.**.**   "/ho
108c0 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d 6a 6f 75  me/bill/a.db-jou
108d0 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65 2f 62 69  rnal\x00/home/bi
108e0 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c  ll/b.db-journal\
108f0 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20 6d 61 73  x00".**.** A mas
10900 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10910 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 64 65 6c   may only be del
10920 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c 20 6f 66  eted once all of
10930 20 69 74 73 20 63 68 69 6c 64 20 0a 2a 2a 20 6a   its child .** j
10940 6f 75 72 6e 61 6c 73 20 68 61 76 65 20 62 65 65  ournals have bee
10950 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
10960 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
10970 6f 6e 20 72 65 61 64 73 20 74 68 65 20 63 6f 6e  on reads the con
10980 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61 73  tents of the mas
10990 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
109a0 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d 6f 72 79   into .** memory
109b0 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68 72 6f 75   and loops throu
109c0 67 68 20 65 61 63 68 20 6f 66 20 74 68 65 20 63  gh each of the c
109d0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  hild journal nam
109e0 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  es. For.** each 
109f0 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 2c 20 69  child journal, i
10a00 74 20 63 68 65 63 6b 73 20 69 66 3a 0a 2a 2a 0a  t checks if:.**.
10a10 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63 68  **   * if the ch
10a20 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ild journal exis
10a30 74 73 2c 20 61 6e 64 20 69 66 20 73 6f 0a 2a 2a  ts, and if so.**
10a40 20 20 20 2a 20 69 66 20 74 68 65 20 63 68 69 6c     * if the chil
10a50 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69  d journal contai
10a60 6e 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ns a reference t
10a70 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
10a80 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 7a 4d   .**     file zM
10a90 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 61  aster.**.** If a
10aa0 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63   child journal c
10ab0 61 6e 20 62 65 20 66 6f 75 6e 64 20 74 68 61 74  an be found that
10ac0 20 6d 61 74 63 68 65 73 20 62 6f 74 68 20 6f 66   matches both of
10ad0 20 74 68 65 20 63 72 69 74 65 72 69 61 0a 2a 2a   the criteria.**
10ae0 20 61 62 6f 76 65 2c 20 74 68 69 73 20 66 75 6e   above, this fun
10af0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
10b00 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
10b10 68 69 6e 67 2e 20 4f 74 68 65 72 77 69 73 65 2c  hing. Otherwise,
10b20 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 63   if.** no such c
10b30 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  hild journal can
10b40 20 62 65 20 66 6f 75 6e 64 2c 20 66 69 6c 65 20   be found, file 
10b50 7a 4d 61 73 74 65 72 20 69 73 20 64 65 6c 65 74  zMaster is delet
10b60 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 66  ed from.** the f
10b70 69 6c 65 2d 73 79 73 74 65 6d 20 75 73 69 6e 67  ile-system using
10b80 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
10b90 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
10ba0 49 4f 20 65 72 72 6f 72 20 77 69 74 68 69 6e 20  IO error within 
10bb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
10bc0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10bd0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
10be0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63  * function alloc
10bf0 61 74 65 73 20 6d 65 6d 6f 72 79 20 62 79 20 63  ates memory by c
10c00 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 4d 61  alling sqlite3Ma
10c10 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e 20 61 6c  lloc(). If an al
10c20 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66 61 69 6c  location.** fail
10c30 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
10c40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
10c50 65 72 77 69 73 65 2c 20 69 66 20 6e 6f 20 49 4f  erwise, if no IO
10c60 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72   or malloc error
10c70 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20 53 51 4c  s .** occur, SQL
10c80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
10c90 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  ed..**.** TODO: 
10ca0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
10cb0 6c 6f 63 61 74 65 73 20 61 20 73 69 6e 67 6c 65  locates a single
10cc0 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
10cd0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74 68 65 20   to load.** the 
10ce0 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20  entire contents 
10cf0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
10d00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
10d10 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 20 63   could be.** a c
10d20 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f 62 79 74  ouple of kilobyt
10d30 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f 74 65 6e  es or so - poten
10d40 74 69 61 6c 6c 79 20 6c 61 72 67 65 72 20 74 68  tially larger th
10d50 61 6e 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  an the page .** 
10d60 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
10d70 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
10d80 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
10d90 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
10da0 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69 74  Master){.  sqlit
10db0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
10dc0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
10dd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10de0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10df0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  rn code */.  sql
10e00 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
10e10 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  er;    /* Malloc
10e20 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  'd master-journa
10e30 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10e40 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  r */.  sqlite3_f
10e50 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 20 20  ile *pJournal;  
10e60 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20 63 68 69   /* Malloc'd chi
10e70 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ld-journal file 
10e80 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
10e90 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
10ea0 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
10eb0 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
10ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
10ed0 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
10ee0 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
10ef0 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
10f00 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
10f10 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
10f20 63 65 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  ce for both the 
10f30 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 70 4d 61  pJournal and pMa
10f40 73 74 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ster file descri
10f50 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49 66 20 73  ptors..  ** If s
10f60 75 63 63 65 73 73 66 75 6c 2c 20 6f 70 65 6e 20  uccessful, open 
10f70 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10f80 61 6c 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  al file for read
10f90 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73  ing..  */.  pMas
10fa0 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  ter = (sqlite3_f
10fb0 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ile *)sqlite3Mal
10fc0 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d 3e 73 7a  locZero(pVfs->sz
10fd0 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
10fe0 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
10ff0 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
11000 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
11010 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
11020 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
11030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11040 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
11050 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c      const int fl
11060 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
11070 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
11080 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11090 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20  OURNAL);.    rc 
110a0 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
110b0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70  pVfs, zMaster, p
110c0 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30  Master, flags, 0
110d0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
110e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
110f0 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11100 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
11110 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74  OsFileSize(pMast
11120 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
11130 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
11140 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
11150 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
11160 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
11170 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
11180 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
11190 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
111a0 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ptr = 0;.    int
111b0 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 56   nMasterPtr = pV
111c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
111d0 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
111e0 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
111f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
11200 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
11210 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
11220 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61  lite3_malloc() a
11230 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  nd pointed to by
11240 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e   zMasterJournal.
11250 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61   .    */.    zMa
11260 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63  sterJournal = (c
11270 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  har *)sqlite3Mal
11280 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74 65 72  loc((int)nMaster
11290 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
112a0 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
112b0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
112c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
112d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
112e0 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
112f0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
11300 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
11310 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
11320 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
11330 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
11340 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
11350 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e  sterJournal, (in
11360 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  t)nMasterJournal
11370 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
11380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
11390 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
113a0 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
113b0 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
113c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
113d0 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
113e0 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
113f0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
11400 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20 20 20  nt exists;.     
11410 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41   rc = sqlite3OsA
11420 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75  ccess(pVfs, zJou
11430 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
11440 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69  ESS_EXISTS, &exi
11450 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sts);.      if( 
11460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11470 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65  .        goto de
11480 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
114a0 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 20  xists ){.       
114b0 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
114c0 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
114d0 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
114e0 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
114f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
11500 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
11510 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
11520 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11530 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
11540 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
11550 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
11560 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11570 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
11580 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 20          int c;. 
11590 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73         int flags
115a0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
115b0 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f  READONLY|SQLITE_
115c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
115d0 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  L);.        rc =
115e0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
115f0 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70  Vfs, zJournal, p
11600 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20  Journal, flags, 
11610 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
11620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11630 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
11640 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
11650 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
11660 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
11670 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61  rJournal(pJourna
11680 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e  l, zMasterPtr, n
11690 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
116a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
116b0 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(pJournal);.  
116c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
116d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
116e0 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
116f0 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
11700 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
11710 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21 3d 30  zMasterPtr[0]!=0
11720 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
11730 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
11740 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
11750 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
11760 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
11770 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
11780 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11790 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
117a0 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
117b0 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
117c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
117d0 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
117e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
117f0 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
11800 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
11810 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
11820 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11830 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f   0);..delmaster_
11840 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
11850 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
11860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
11870 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
11880 20 7d 20 20 0a 20 20 69 66 28 20 70 4d 61 73 74   }  .  if( pMast
11890 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
118a0 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
118b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
118c0 69 73 4f 70 65 6e 28 70 4a 6f 75 72 6e 61 6c 29  isOpen(pJournal)
118d0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
118e0 33 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b  3_free(pMaster);
118f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11900 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11910 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
11920 20 63 68 61 6e 67 65 20 74 68 65 20 61 63 74 75   change the actu
11930 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
11940 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
11950 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
11960 74 65 6d 2e 20 54 68 69 73 20 6f 6e 6c 79 20 68  tem. This only h
11970 61 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 6d 6d  appens when comm
11980 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63  itting a transac
11990 74 69 6f 6e 2c 0a 2a 2a 20 6f 72 20 72 6f 6c 6c  tion,.** or roll
119a0 69 6e 67 20 62 61 63 6b 20 61 20 74 72 61 6e 73  ing back a trans
119b0 61 63 74 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e  action (includin
119c0 67 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  g rolling back a
119d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
119e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e  *.** If the main
119f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
11a00 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 61  s not open, or a
11a10 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11a20 20 69 73 20 6e 6f 74 0a 2a 2a 20 68 65 6c 64 2c   is not.** held,
11a30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11a40 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  s a no-op. Other
11a50 77 69 73 65 2c 20 74 68 65 20 73 69 7a 65 20 6f  wise, the size o
11a60 66 20 74 68 65 20 66 69 6c 65 20 69 73 0a 2a 2a  f the file is.**
11a70 20 63 68 61 6e 67 65 64 20 74 6f 20 6e 50 61 67   changed to nPag
11a80 65 20 70 61 67 65 73 20 28 6e 50 61 67 65 2a 70  e pages (nPage*p
11a90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11aa0 62 79 74 65 73 29 2e 20 49 66 20 74 68 65 20 66  bytes). If the f
11ab0 69 6c 65 0a 2a 2a 20 6f 6e 20 64 69 73 6b 20 69  ile.** on disk i
11ac0 73 20 63 75 72 72 65 6e 74 6c 79 20 6c 61 72 67  s currently larg
11ad0 65 72 20 74 68 61 6e 20 6e 50 61 67 65 20 70 61  er than nPage pa
11ae0 67 65 73 2c 20 74 68 65 6e 20 75 73 65 20 74 68  ges, then use th
11af0 65 20 56 46 53 0a 2a 2a 20 78 54 72 75 6e 63 61  e VFS.** xTrunca
11b00 74 65 28 29 20 6d 65 74 68 6f 64 20 74 6f 20 74  te() method to t
11b10 72 75 6e 63 61 74 65 20 69 74 2e 0a 2a 2a 0a 2a  runcate it..**.*
11b20 2a 20 4f 72 2c 20 69 74 20 6d 69 67 68 74 20 6d  * Or, it might m
11b30 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
11b40 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
11b50 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
11b60 72 20 74 68 61 6e 20 0a 2a 2a 20 6e 50 61 67 65  r than .** nPage
11b70 20 70 61 67 65 73 2e 20 53 6f 6d 65 20 6f 70 65   pages. Some ope
11b80 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
11b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
11ba0 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
11bb0 66 20 0a 2a 2a 20 79 6f 75 20 74 72 79 20 74 6f  f .** you try to
11bc0 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65   truncate a file
11bd0 20 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68   to some size th
11be0 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  at is larger tha
11bf0 6e 20 69 74 20 0a 2a 2a 20 63 75 72 72 65 6e 74  n it .** current
11c00 6c 79 20 69 73 2c 20 73 6f 20 64 65 74 65 63 74  ly is, so detect
11c10 20 74 68 69 73 20 63 61 73 65 20 61 6e 64 20 77   this case and w
11c20 72 69 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65  rite a single ze
11c30 72 6f 20 62 79 74 65 20 74 6f 20 0a 2a 2a 20 74  ro byte to .** t
11c40 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65  he end of the ne
11c50 77 20 66 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a  w file instead..
11c60 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11c70 66 75 6c 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ful, return SQLI
11c80 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 20  TE_OK. If an IO 
11c90 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
11ca0 6c 65 20 6d 6f 64 69 66 79 69 6e 67 0a 2a 2a 20  le modifying.** 
11cb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11cc0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65 72  e, return the er
11cd0 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20  ror code to the 
11ce0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
11cf0 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
11d00 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
11d10 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
11d20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11d30 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61  TE_OK;.  if( pPa
11d40 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
11d50 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 69  R_EXCLUSIVE && i
11d60 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
11d70 29 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72  ) ){.    i64 cur
11d80 72 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a  rentSize, newSiz
11d90 65 3b 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  e;.    /* TODO: 
11da0 49 73 20 69 74 20 73 61 66 65 20 74 6f 20 75 73  Is it safe to us
11db0 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  e Pager.dbFileSi
11dc0 7a 65 20 68 65 72 65 3f 20 2a 2f 0a 20 20 20 20  ze here? */.    
11dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
11de0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
11df0 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29  d, &currentSize)
11e00 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20  ;.    newSize = 
11e10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11e20 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20  *(i64)nPage;.   
11e30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11e40 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a  OK && currentSiz
11e50 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20  e!=newSize ){.  
11e60 20 20 20 20 69 66 28 20 63 75 72 72 65 6e 74 53      if( currentS
11e70 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20  ize>newSize ){. 
11e80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11e90 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
11ea0 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a  ager->fd, newSiz
11eb0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
11ec0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11ed0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
11ee0 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20  ger->fd, "", 1, 
11ef0 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20  newSize-1);.    
11f00 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
11f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11f20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
11f30 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
11f40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
11f50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
11f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
11f70 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11f80 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
11f90 20 76 61 72 69 61 62 6c 65 20 66 6f 72 20 74 68   variable for th
11fa0 65 20 67 69 76 65 6e 0a 2a 2a 20 70 61 67 65 72  e given.** pager
11fb0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 76 61   based on the va
11fc0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
11fd0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 20  the xSectorSize 
11fe0 6d 65 74 68 6f 64 0a 2a 2a 20 6f 66 20 74 68 65  method.** of the
11ff0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
12000 69 6c 65 2e 20 54 68 65 20 73 65 63 74 6f 72 20  ile. The sector 
12010 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 75 73 65  size will be use
12020 64 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20 64 65  d used .** to de
12030 74 65 72 6d 69 6e 65 20 74 68 65 20 73 69 7a 65  termine the size
12040 20 61 6e 64 20 61 6c 69 67 6e 6d 65 6e 74 20 6f   and alignment o
12050 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
12060 20 61 6e 64 20 0a 2a 2a 20 6d 61 73 74 65 72 20   and .** master 
12070 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 73  journal pointers
12080 20 77 69 74 68 69 6e 20 63 72 65 61 74 65 64 20   within created 
12090 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
120a0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
120b0 72 79 20 66 69 6c 65 73 20 74 68 65 20 65 66 66  ry files the eff
120c0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
120d0 7a 65 20 69 73 20 61 6c 77 61 79 73 20 35 31 32  ze is always 512
120e0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 74   bytes..**.** Ot
120f0 68 65 72 77 69 73 65 2c 20 66 6f 72 20 6e 6f 6e  herwise, for non
12100 2d 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73  -temporary files
12110 2c 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  , the effective 
12120 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 0a 2a  sector size is.*
12130 2a 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  * the value retu
12140 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
12150 74 6f 72 53 69 7a 65 28 29 20 6d 65 74 68 6f 64  torSize() method
12160 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 35   rounded up to 5
12170 31 32 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 6c  12 if.** it is l
12180 65 73 73 20 74 68 61 6e 20 35 31 32 2c 20 6f 72  ess than 512, or
12190 20 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 74 6f   rounded down to
121a0 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
121b0 20 69 66 20 69 74 0a 2a 2a 20 69 73 20 67 72 65   if it.** is gre
121c0 61 74 65 72 20 74 68 61 6e 20 4d 41 58 5f 53 45  ater than MAX_SE
121d0 43 54 4f 52 5f 53 49 5a 45 2e 0a 2a 2f 0a 73 74  CTOR_SIZE..*/.st
121e0 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63  atic void setSec
121f0 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70  torSize(Pager *p
12200 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74  Pager){.  assert
12210 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
12220 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e  >fd) || pPager->
12230 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 69  tempFile );..  i
12240 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
12250 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
12260 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
12270 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
12280 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
12290 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
122a0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
122b0 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
122c0 74 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  t, in which case
122d0 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
122e0 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
122f0 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
12300 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
12310 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
12320 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
12330 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
12340 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
12350 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32  ->sectorSize<512
12360 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12370 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
12380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
12390 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 4d  er->sectorSize>M
123a0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 29  AX_SECTOR_SIZE )
123b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 41  {.    assert( MA
123c0 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3e 3d 35  X_SECTOR_SIZE>=5
123d0 31 32 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  12 );.    pPager
123e0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 4d  ->sectorSize = M
123f0 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  AX_SECTOR_SIZE;.
12400 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61    }.}../*.** Pla
12410 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61  yback the journa
12420 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f  l and thus resto
12430 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
12440 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73  file to.** the s
12450 74 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62  tate it was in b
12460 65 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64  efore we started
12470 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e   making changes.
12480 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75    .**.** The jou
12490 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74  rnal file format
124a0 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20   is as follows: 
124b0 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62  .**.**  (1)  8 b
124c0 79 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63  yte prefix.  A c
124d0 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d  opy of aJournalM
124e0 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20  agic[]..**  (2) 
124f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
12500 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
12510 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12520 66 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  f valid page rec
12530 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e  ords.**       in
12540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49   the journal.  I
12550 66 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  f this value is 
12560 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
12570 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
12580 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20        number of 
12590 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f  page records fro
125a0 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69  m the journal si
125b0 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62  ze..**  (3)  4 b
125c0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
125d0 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
125e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  the initial valu
125f0 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20  e for the .**   
12600 20 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b      sanity check
12610 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20  sum..**  (4)  4 
12620 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
12630 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
12640 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75   of pages to tru
12650 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  ncate the.**    
12660 20 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64     database to d
12670 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
12680 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74  ..**  (5)  4 byt
12690 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
126a0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
126b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20  e sector size.  
126c0 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  The header.**   
126d0 20 20 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79      is this many
126e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
126f0 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74 65 20  **  (6)  4 byte 
12700 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
12710 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12720 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28  page case..**  (
12730 37 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  7)  4 byte integ
12740 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
12750 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
12760 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
12770 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
12780 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
12790 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
127a0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
127b0 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
127c0 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
127d0 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65  .**  (8)  N byte
127e0 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
127f0 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
12800 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
12810 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
12820 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
12830 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
12840 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
12850 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
12860 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
12870 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
12880 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
12890 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
128a0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
128b0 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
128c0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
128d0 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
128e0 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20  ..**  (9)  Zero 
128f0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
12900 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
12910 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
12920 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
12930 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
12940 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
12950 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
12960 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
12970 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
12980 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
12990 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
129a0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
129b0 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
129c0 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 8 items above.
129d0 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
129e0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
129f0 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
12a00 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 9th item..**
12a10 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
12a20 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
12a30 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
12a40 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
12a50 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
12a60 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
12a70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
12a80 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
12a90 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
12aa0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
12ab0 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
12ac0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12ad0 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
12ae0 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
12af0 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
12b00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
12b10 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
12b20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
12b30 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
12b40 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
12b50 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
12b60 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
12b70 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
12b80 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
12b90 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
12ba0 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
12bb0 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
12bc0 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
12bd0 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
12be0 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
12bf0 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
12c00 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
12c10 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
12c20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
12c30 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
12c40 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
12c50 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
12c60 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
12c70 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
12c80 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
12c90 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
12ca0 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
12cb0 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
12cc0 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
12cd0 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
12ce0 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
12cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
12d00 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
12d10 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
12d20 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
12d30 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
12d40 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
12d50 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
12d60 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
12d70 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
12d80 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
12d90 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
12da0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
12db0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
12dc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12dd0 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
12de0 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
12df0 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
12e00 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
12e10 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
12e20 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
12e30 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
12e40 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
12e50 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
12e60 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
12e70 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
12e80 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
12e90 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
12ea0 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
12eb0 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
12ec0 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
12ed0 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
12ee0 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
12ef0 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
12f00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
12f10 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
12f20 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
12f30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
12f40 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 48  d..**.** The isH
12f50 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  ot parameter ind
12f60 69 63 61 74 65 73 20 74 68 61 74 20 77 65 20 61  icates that we a
12f70 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 6f 6c  re trying to rol
12f80 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 0a  lback a journal.
12f90 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ** that might be
12fa0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 2e 20   a hot journal. 
12fb0 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20 62 65   Or, it could be
12fc0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
12fd0 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65 72 76  l is .** preserv
12fe0 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 4a 4f  ed because of JO
12ff0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
13000 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  T or JOURNALMODE
13010 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20 49 66  _TRUNCATE..** If
13020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 61   the journal rea
13030 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65 73 65  lly is hot, rese
13040 74 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  t the pager cach
13050 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e 67 0a  e prior rolling.
13060 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f 6e 74  ** back any cont
13070 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a 6f 75  ent.  If the jou
13080 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79 20 70  rnal is merely p
13090 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20 72 65  ersistent, no re
130a0 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64 65 64  set is.** needed
130b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
130c0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50  pager_playback(P
130d0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
130e0 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69  t isHot){.  sqli
130f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
13100 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
13110 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20  i64 szJ;        
13120 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
13130 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
13140 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  file in bytes */
13150 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20  .  u32 nRec;    
13160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13170 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
13180 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
13190 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20  */.  u32 u;     
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131b0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
131c0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
131d0 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
131e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
131f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
13200 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
13210 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13220 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
13230 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
13240 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
13250 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
13260 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13270 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
13280 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
13290 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
132a0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
132b0 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
132c0 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
132d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64 50 61   */.  int needPa
132e0 67 65 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f  gerReset;      /
132f0 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20  * True to reset 
13300 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 66 69  page prior to fi
13310 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62 61 63  rst page rollbac
13320 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  k */..  /* Figur
13330 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
13340 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
13350 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
13360 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
13370 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
13380 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
13390 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67  ert( isOpen(pPag
133a0 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 72 63  er->jfd) );.  rc
133b0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
133c0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
133d0 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
133e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
133f0 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
13400 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
13410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
13420 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
13430 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
13440 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
13450 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
13460 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
13470 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
13480 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
13490 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
134a0 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
134b0 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
134c0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
134d0 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
134e0 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
134f0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
13500 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54 65 63  *.  ** TODO: Tec
13510 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66 6f 6c  hnically the fol
13520 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65 72 72  lowing is an err
13530 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 61 73  or because it as
13540 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  sumes that.  ** 
13550 62 75 66 66 65 72 20 50 61 67 65 72 2e 70 54 6d  buffer Pager.pTm
13560 70 53 70 61 63 65 20 69 73 20 28 6d 78 50 61 74  pSpace is (mxPat
13570 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73 20 6f  hname+1) bytes o
13580 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e 20 74  r larger. i.e. t
13590 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67 65 72  hat.  ** (pPager
135a0 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20 70 50  ->pageSize >= pP
135b0 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
135c0 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69 6e 67  thname+1). Using
135d0 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20 2a 2a   os_unix.c,.  **
135e0 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69 73 20    mxPathname is 
135f0 35 31 32 2c 20 77 68 69 63 68 20 69 73 20 74 68  512, which is th
13600 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6d 69  e same as the mi
13610 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c 65 20  nimum allowable 
13620 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72 20 70  value.  ** for p
13630 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  ageSize..  */.  
13640 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65 72  zMaster = pPager
13650 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72  ->pTmpSpace;.  r
13660 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
13670 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
13680 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67  d, zMaster, pPag
13690 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  er->pVfs->mxPath
136a0 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72  name+1);.  if( r
136b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
136c0 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20  zMaster[0] ){.  
136d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
136e0 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
136f0 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
13700 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
13710 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  );.  }.  zMaster
13720 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
13730 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65  SQLITE_OK || !re
13740 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  s ){.    goto en
13750 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
13760 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13770 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65 65 64  lOff = 0;.  need
13780 50 61 67 65 72 52 65 73 65 74 20 3d 20 69 73 48  PagerReset = isH
13790 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  ot;..  /* This l
137a0 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
137b0 69 74 68 65 72 20 77 68 65 6e 20 61 20 72 65 61  ither when a rea
137c0 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 6f 72  dJournalHdr() or
137d0 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61   .  ** pager_pla
137e0 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29  yback_one_page()
137f0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20 53 51   call returns SQ
13800 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
13810 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 6f  IO error .  ** o
13820 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20 20 77  ccurs. .  */.  w
13830 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
13840 6e 74 20 69 73 55 6e 73 79 6e 63 20 3d 20 30 3b  nt isUnsync = 0;
13850 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
13860 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
13870 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
13880 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
13890 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
138a0 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
138b0 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
138c0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
138d0 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
138e0 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
138f0 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
13900 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
13910 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
13920 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
13930 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
13940 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
13950 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
13960 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
13970 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
13980 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
13990 20 69 73 48 6f 74 2c 20 73 7a 4a 2c 20 26 6e 52   isHot, szJ, &nR
139a0 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
139b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
139c0 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
139d0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
139e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
139f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
13a00 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
13a10 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
13a20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
13a30 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
13a40 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
13a50 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
13a60 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
13a70 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
13a80 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
13a90 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13aa0 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
13ab0 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
13ac0 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
13ad0 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
13ae0 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
13af0 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
13b00 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
13b10 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
13b20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
13b30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13b40 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
13b50 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13b60 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13b70 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
13b80 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
13b90 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
13ba0 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
13bb0 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13bc0 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
13bd0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
13be0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
13bf0 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
13c00 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
13c10 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
13c20 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
13c30 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
13c40 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
13c50 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
13c60 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
13c70 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
13c80 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
13c90 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13ca0 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
13cb0 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
13cc0 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
13cd0 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
13ce0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
13cf0 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
13d00 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
13d10 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
13d20 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
13d30 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
13d40 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
13d50 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
13d60 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
13d70 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
13d80 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
13d90 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
13da0 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
13db0 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
13dc0 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
13dd0 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
13de0 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
13df0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
13e00 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
13e10 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
13e20 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
13e30 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
13e40 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
13e50 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
13e60 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13e70 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
13e80 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
13e90 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
13ea0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
13eb0 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
13ec0 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
13ed0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
13ee0 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
13ef0 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
13f00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
13f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73  ..    */.    tes
13f20 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26  tcase( nRec==0 &
13f30 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20  & !isHot.       
13f40 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
13f50 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
13f60 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
13f70 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13f80 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
13f90 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
13fa0 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
13fb0 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
13fc0 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
13fd0 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
13fe0 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
13ff0 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20  ager).    );.   
14000 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
14010 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
14020 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14030 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
14040 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
14050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
14060 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
14070 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
14080 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
14090 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
140a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
140b0 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
140c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
140d0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
140e0 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
140f0 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
14100 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
14110 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14120 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
14130 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
14140 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
14150 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14160 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
14170 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
14180 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
14190 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
141a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
141b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
141c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
141d0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
141e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
141f0 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
14200 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
14210 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
14220 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
14230 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
14240 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
14250 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
14260 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
14270 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
14280 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
14290 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
142a0 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
142b0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
142c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
142d0 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
142e0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
142f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
14300 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
14310 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
14320 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
14330 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
14340 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
14360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14370 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
14380 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14390 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
143a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
143b0 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
143c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
143d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
143e0 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
143f0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 71  e to rollback, q
14400 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  uit and return t
14410 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  he error.       
14420 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68 69     ** code.  Thi
14430 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65  s will cause the
14440 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20   pager to enter 
14450 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a  the error state.
14460 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
14470 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72 20  that no further 
14480 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f 6e  harm will be don
14490 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65 20  e.  Perhaps the 
144a0 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20 2a  next.          *
144b0 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d  * process to com
144c0 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65 20  e along will be 
144d0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
144e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
144f0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14500 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
14510 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
14520 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
14530 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43  .  }.  /*NOTREAC
14540 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  HED*/.  assert( 
14550 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  0 );..end_playba
14560 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69  ck:.  /* Followi
14570 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  ng a rollback, t
14580 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14590 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20   should be back 
145a0 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  in its original.
145b0 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72    ** state prior
145c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
145d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
145e0 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a  , so invoke the.
145f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54    ** SQLITE_FCNT
14600 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66  L_DB_UNCHANGED f
14610 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68  ile-control meth
14620 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  od to disable th
14630 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e  e.  ** assertion
14640 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
14650 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
14660 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f  s modified..  */
14670 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70  .  assert(.    p
14680 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
14690 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71  ods==0 ||.    sq
146a0 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
146b0 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51  ol(pPager->fd,SQ
146c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e  LITE_FCNTL_DB_UN
146d0 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49  CHANGED,0)>=SQLI
146e0 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a  TE_OK.  );..  /*
146f0 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63   If this playbac
14700 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61  k is happening a
14710 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20  utomatically as 
14720 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49  a result of an I
14730 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  O or .  ** mallo
14740 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  c error that occ
14750 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65 20  urred after the 
14760 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77  change-counter w
14770 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20 0a  as updated but .
14780 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20    ** before the 
14790 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
147a0 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20  committed, then 
147b0 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
147c0 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63  er .  ** modific
147d0 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68  ation may just h
147e0 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74 65  ave been reverte
147f0 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  d. If this happe
14800 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ns in exclusive 
14810 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e  .  ** mode, then
14820 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e   subsequent tran
14830 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d  sactions perform
14840 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63  ed by the connec
14850 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  tion will not.  
14860 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63 68  ** update the ch
14870 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20  ange-counter at 
14880 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65  all. This may le
14890 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f  ad to cache inco
148a0 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70  nsistency.  ** p
148b0 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65  roblems for othe
148c0 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20 73  r processes at s
148d0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
148e0 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73   future. So, jus
148f0 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74  t.  ** in case t
14900 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65 64  his has happened
14910 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e  , clear the chan
14920 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
14930 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61   now..  */.  pPa
14940 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
14950 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74  Done = pPager->t
14960 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20  empFile;..  if( 
14970 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14980 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70  .    zMaster = p
14990 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
149a0 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d  ;.    rc = readM
149b0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
149c0 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
149d0 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
149e0 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
149f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
14a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
14a10 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
14a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
14a30 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
14a40 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
14a50 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
14a60 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
14a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14a80 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
14a90 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
14aa0 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
14ab0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
14ac0 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
14ad0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
14ae0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
14af0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
14b00 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
14b10 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
14b20 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
14b30 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
14b40 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
14b50 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
14b60 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
14b70 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
14b80 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
14b90 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
14ba0 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
14bb0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
14bc0 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
14bd0 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
14be0 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
14bf0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
14c00 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
14c10 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
14c20 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
14c30 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
14c40 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
14c50 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
14c60 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14c70 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
14c80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
14c90 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70  back savepoint p
14ca0 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69  Savepoint. Or, i
14cb0 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  f pSavepoint==NU
14cc0 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  LL, then playbac
14cd0 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20  k.** the entire 
14ce0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14cf0 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70 53  ile. The case pS
14d00 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f  avepoint==NULL o
14d10 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61  ccurs when .** a
14d20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d   ROLLBACK TO com
14d30 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20  mand is invoked 
14d40 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74  on a SAVEPOINT t
14d50 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61 63  hat is a transac
14d60 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69  tion .** savepoi
14d70 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  nt..**.** When p
14d80 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74  Savepoint is not
14d90 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61   NULL (meaning a
14da0 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e   non-transaction
14db0 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a   savepoint is .*
14dc0 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  * being rolled b
14dd0 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72  ack), then the r
14de0 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  ollback consists
14df0 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65 20   of up to three 
14e00 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f  stages,.** perfo
14e10 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65  rmed in the orde
14e20 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a  r specified:.**.
14e30 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72 65  **   * Pages are
14e40 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f   played back fro
14e50 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
14e60 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20 62  al starting at b
14e70 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65  yte.**     offse
14e80 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
14e90 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e  .iOffset and con
14ea0 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20  tinuing to .**  
14eb0 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e     PagerSavepoin
14ec0 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72  t.iHdrOffset, or
14ed0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14ee0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a  he main journal.
14ef0 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20 50  **     file if P
14f00 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14f10 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f  drOffset is zero
14f20 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50  ..**.**   * If P
14f30 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48  agerSavepoint.iH
14f40 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20  drOffset is not 
14f50 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73  zero, then pages
14f60 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20   are played.**  
14f70 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67     back starting
14f80 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14f90 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61  l header immedia
14fa0 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a  tely following .
14fb0 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
14fc0 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
14fd0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14fe0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
14ff0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  file..**.**   * 
15000 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20 70  Pages are then p
15010 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
15020 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
15030 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a  file, starting.*
15040 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20 50  *     with the P
15050 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53  agerSavepoint.iS
15060 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e  ubRec and contin
15070 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20  uing to the end 
15080 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  of.**     the jo
15090 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
150a0 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65  * Throughout the
150b0 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73   rollback proces
150c0 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20 70  s, each time a p
150d0 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  age is rolled ba
150e0 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65  ck, the.** corre
150f0 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20  sponding bit is 
15100 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63 20  set in a bitvec 
15110 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69 61  structure (varia
15120 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65  ble pDone in the
15130 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  .** implementati
15140 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20  on below). This 
15150 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72  is used to ensur
15160 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69 73  e that a page is
15170 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20   only.** rolled 
15180 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  back the first t
15190 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e  ime it is encoun
151a0 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  tered in either 
151b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
151c0 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20  f pSavepoint is 
151d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73  NULL, then pages
151e0 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64   are only played
151f0 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d   back from the m
15200 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ain.** journal f
15210 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ile. There is no
15220 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74 76   need for a bitv
15230 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ec in this case.
15240 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72  .**.** In either
15250 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c   case, before pl
15260 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73  ayback commences
15270 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a   the Pager.dbSiz
15280 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73  e variable.** is
15290 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76 61   reset to the va
152a0 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c 64  lue that it held
152b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
152c0 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a   the savepoint .
152d0 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69  ** (or transacti
152e0 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74  on). No page wit
152f0 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20  h a page-number 
15300 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
15310 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c  s value.** is pl
15320 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e  ayed back. If on
15330 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  e is encountered
15340 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b   it is simply sk
15350 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
15360 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61   int pagerPlayba
15370 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  ckSavepoint(Page
15380 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72  r *pPager, Pager
15390 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65  Savepoint *pSave
153a0 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a  point){.  i64 sz
153b0 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
153c0 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20     /* Effective 
153d0 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e  size of the main
153e0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
153f0 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
15400 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
15410 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f   first segment o
15420 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72  f main-journal r
15430 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
15440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
15450 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15460 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
15470 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
15480 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
15490 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
154a0 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
154b0 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
154c0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
154d0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
154e0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
154f0 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f  bitvec to use to
15500 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f   store the set o
15510 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62  f pages rolled b
15520 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ack */.  if( pSa
15530 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70  vepoint ){.    p
15540 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69  Done = sqlite3Bi
15550 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76 65  tvecCreate(pSave
15560 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20  point->nOrig);. 
15570 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b     if( !pDone ){
15580 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15590 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
155a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
155b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
155c0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61  e back to the va
155d0 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f 72  lue it was befor
155e0 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  e the savepoint 
155f0 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65  .  ** being reve
15600 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e  rted was opened.
15610 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
15620 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f  dbSize = pSavepo
15630 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74  int ? pSavepoint
15640 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72  ->nOrig : pPager
15650 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20  ->dbOrigSize;.. 
15660 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e   /* Use pPager->
15670 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68  journalOff as th
15680 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a 65  e effective size
15690 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   of the main rol
156a0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
156b0 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20  al.  The actual 
156c0 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61  file might be la
156d0 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 69  rger than this i
156e0 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55  n.  ** PAGER_JOU
156f0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
15700 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e  E or PAGER_JOURN
15710 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
15720 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20   But anything.  
15730 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e  ** past pPager->
15740 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66  journalOff is of
15750 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a  f-limits to us..
15760 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61    */.  szJ = pPa
15770 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
15780 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
15790 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63  rolling back rec
157a0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61  ords from the ma
157b0 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
157c0 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65  ing at.  ** Page
157d0 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73  rSavepoint.iOffs
157e0 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e  et and continuin
157f0 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f  g to the next jo
15800 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
15810 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20 62  ** There might b
15820 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65  e records in the
15830 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68   main journal th
15840 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20 6e  at have a page n
15850 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74  umber.  ** great
15860 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
15870 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69 7a  ent database siz
15880 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e (pPager->dbSiz
15890 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a  e) but those.  *
158a0 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65  * will be skippe
158b0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  d automatically.
158c0 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64 65    Pages are adde
158d0 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68  d to pDone as th
158e0 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79  ey.  ** are play
158f0 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
15900 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29  if( pSavepoint )
15910 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
15920 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
15930 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
15940 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
15950 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
15960 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15970 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
15980 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
15990 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
159a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
159b0 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
159c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
159d0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
159e0 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20  e(pPager, 1, 0, 
159f0 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  &pPager->journal
15a00 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a  Off, 1, pDone);.
15a10 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
15a20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
15a30 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  E );.  }else{.  
15a40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15a50 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lOff = 0;.  }.. 
15a60 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c   /* Continue rol
15a70 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64  ling back record
15a80 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  s out of the mai
15a90 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69  n journal starti
15aa0 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66  ng at.  ** the f
15ab0 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
15ac0 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e  der seen and con
15ad0 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68  tinuing until th
15ae0 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a  e effective end.
15af0 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e    ** of the main
15b00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
15b10 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70  Continue to skip
15b20 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61   out-of-range pa
15b30 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e  ges and.  ** con
15b40 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67  tinue adding pag
15b50 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  es rolled back t
15b60 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  o pDone..  */.  
15b70 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
15b80 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
15b90 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
15ba0 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20 20  {.    u32 ii;   
15bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
15bc0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
15bd0 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20  u32 nJRec = 0;  
15be0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15bf0 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
15c00 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
15c10 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
15c20 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15c30 2c 20 30 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  , 0, szJ, &nJRec
15c40 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61  , &dummy);.    a
15c50 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15c60 45 5f 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f  E_DONE );..    /
15c70 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50  *.    ** The "pP
15c80 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15c90 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
15ca0 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d  pPager)==pPager-
15cb0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20  >journalOff".   
15cc0 20 2a 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61   ** test is rela
15cd0 74 65 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32  ted to ticket #2
15ce0 35 36 35 2e 20 20 53 65 65 20 74 68 65 20 64 69  565.  See the di
15cf0 73 63 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a  scussion in the.
15d00 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61      ** pager_pla
15d10 79 62 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e  yback() function
15d20 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
15d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20  information..   
15d40 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
15d50 21 28 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20  !(nJRec==0.     
15d60 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
15d70 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41  ournalHdr+JOURNA
15d80 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
15d90 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  !=pPager->journa
15da0 6c 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26  lOff.         &&
15db0 20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d   ((szJ - pPager-
15dc0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
15dd0 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
15de0 67 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20  ger))>0.        
15df0 20 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75   && pagerNextJou
15e00 72 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28  rnalPageIsValid(
15e10 70 50 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a  pPager)).    );.
15e20 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
15e30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72   .     && pPager
15e40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
15e50 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
15e60 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
15e70 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20  rnalOff.    ){. 
15e80 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33       nJRec = (u3
15e90 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72  2)((szJ - pPager
15ea0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f  ->journalOff)/JO
15eb0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
15ec0 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  er));.    }.    
15ed0 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51  for(ii=0; rc==SQ
15ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a  LITE_OK && ii<nJ
15ef0 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Rec && pPager->j
15f00 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69  ournalOff<szJ; i
15f10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
15f20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
15f30 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
15f40 20 31 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e   1, 0, &pPager->
15f50 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70  journalOff, 1, p
15f60 44 6f 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Done);.    }.   
15f70 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
15f80 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a  ITE_DONE );.  }.
15f90 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
15fa0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
15fb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73  r->journalOff==s
15fc0 7a 4a 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61  zJ );..  /* Fina
15fd0 6c 6c 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70  lly,  rollback p
15fe0 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75  ages from the su
15ff0 62 2d 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65  b-journal.  Page
16000 20 74 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20   that were.  ** 
16010 70 72 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65  previously rolle
16020 64 20 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68  d back out of th
16030 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28  e main journal (
16040 61 6e 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e  and are hence in
16050 20 70 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c   pDone).  ** wil
16060 6c 20 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f  l be skipped.  O
16070 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
16080 73 20 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70  s are also skipp
16090 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
160a0 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
160b0 20 75 33 32 20 69 69 3b 20 20 20 20 20 20 20 20   u32 ii;        
160c0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
160d0 74 65 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f  ter */.    i64 o
160e0 66 66 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69  ffset = pSavepoi
160f0 6e 74 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70  nt->iSubRec*(4+p
16100 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16110 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61  ;.    for(ii=pSa
16120 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63  vepoint->iSubRec
16130 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
16140 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53  && ii<pPager->nS
16150 75 62 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20  ubRec; ii++){.  
16160 20 20 20 20 61 73 73 65 72 74 28 20 6f 66 66 73      assert( offs
16170 65 74 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72  et==ii*(4+pPager
16180 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20  ->pageSize) );. 
16190 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
161a0 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
161b0 65 28 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20  e(pPager, 0, 0, 
161c0 26 6f 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e  &offset, 1, pDon
161d0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  e);.    }.    as
161e0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
161f0 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20  _DONE );.  }..  
16200 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
16210 74 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69  troy(pDone);.  i
16220 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16230 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16240 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
16250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16260 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
16270 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ge the maximum n
16280 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f  umber of in-memo
16290 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ry pages that ar
162a0 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f  e allowed..*/.vo
162b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
162c0 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65  etCachesize(Page
162d0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d  r *pPager, int m
162e0 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65  xPage){.  sqlite
162f0 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73  3PcacheSetCaches
16300 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ize(pPager->pPCa
16310 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a  che, mxPage);.}.
16320 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68  ./*.** Adjust th
16330 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20  e robustness of 
16340 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16350 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
16360 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70   crashes.** or p
16370 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79  ower failures by
16380 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75   changing the nu
16390 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73  mber of syncs()s
163a0 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a   when writing.**
163b0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
163c0 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72  urnal.  There ar
163d0 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a  e three levels:.
163e0 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20  **.**    OFF    
163f0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63     sqlite3OsSync
16400 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
16410 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
16420 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20   default.**     
16430 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d           for tem
16440 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73  porary and trans
16450 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  ient files..**.*
16460 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54  *    NORMAL    T
16470 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
16480 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65  nced once before
16490 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
164a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
164b0 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20       database.  
164c0 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
164d0 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63   adequate protec
164e0 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20  tion, but.**    
164f0 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20            it is 
16500 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f  theoretically po
16510 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76  ssible, though v
16520 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a  ery unlikely,.**
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
16540 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65  at an inopertune
16550 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
16560 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a  ould leave the j
16570 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
16580 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74         in a stat
16590 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61  e which would ca
165a0 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68  use damage to th
165b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
165c0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20             when 
165d0 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
165e0 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c  k..**.**    FULL
165f0 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61        The journa
16600 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63  l is synced twic
16610 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
16620 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
16630 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
16640 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65  abase (with some
16650 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
16660 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52  rmation - the nR
16670 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20  ec field.**     
16680 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
16690 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d  journal header -
166a0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69   being written i
166b0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  n between the tw
166c0 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  o.**            
166d0 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65    syncs).  If we
166e0 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69   assume that wri
166f0 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ting a.**       
16700 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69         single di
16710 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f  sk sector is ato
16720 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  mic, then this m
16730 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20  ode provides.** 
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
16750 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  urance that the 
16760 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74  journal will not
16770 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f   be corrupted to
16780 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
16790 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61       point of ca
167a0 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20  using damage to 
167b0 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72  the database dur
167c0 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ing rollback..**
167d0 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75  .** Numeric valu
167e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
167f0 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20  th these states 
16800 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d  are OFF==1, NORM
16810 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c  AL=2,.** and FUL
16820 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  L=3..*/.#ifndef 
16830 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
16840 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73  R_PRAGMAS.void s
16850 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
16860 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20  fetyLevel(Pager 
16870 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76  *pPager, int lev
16880 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79  el, int bFullFsy
16890 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nc){.  pPager->n
168a0 6f 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d  oSync =  (level=
168b0 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
168c0 6d 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20  mpFile) ?1:0;.  
168d0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
168e0 20 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20   = (level==3 && 
168f0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
16900 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
16910 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
16920 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
16930 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
16940 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
16950 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
16960 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
16970 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
16980 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
16990 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
169a0 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
169b0 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
169c0 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
169d0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
169e0 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
169f0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
16a00 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
16a10 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
16a20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
16a30 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
16a40 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
16a50 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
16a60 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
16a70 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
16a80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a  temporary file..
16a90 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
16aa0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16ab0 69 6e 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74  into *pFile. Ret
16ac0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16ad0 20 73 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20   success .** or 
16ae0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
16af0 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
16b00 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  . The OS will au
16b10 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
16b20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
16b30 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
16b40 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
16b50 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 70 61 73  ** The flags pas
16b60 73 65 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c  sed to the VFS l
16b70 61 79 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c  ayer xOpen() cal
16b80 6c 20 61 72 65 20 74 68 6f 73 65 20 73 70 65 63  l are those spec
16b90 69 66 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61  ified.** by para
16ba0 6d 65 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f  meter vfsFlags O
16bb0 52 65 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c  Red with the fol
16bc0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
16bd0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16be0 41 44 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53  ADWRITE.**     S
16bf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
16c00 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
16c10 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a  OPEN_EXCLUSIVE.*
16c20 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45  *     SQLITE_OPE
16c30 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a  N_DELETEONCLOSE.
16c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16c50 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
16c60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
16c70 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
16c80 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
16c90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
16ca0 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
16cb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16cc0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
16cd0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
16ce0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
16cf0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
16d00 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
16d10 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16d20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16d30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16d40 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16d50 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
16d60 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
16d70 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
16d80 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
16d90 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
16da0 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
16db0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16dc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16dd0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
16de0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
16df0 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
16e00 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
16e10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
16e20 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
16e30 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
16e40 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
16e50 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
16e60 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46  _OK || isOpen(pF
16e70 69 6c 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  ile) );.  return
16e80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
16e90 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
16ea0 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  er function..**.
16eb0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 6e 76  ** The pager inv
16ec0 6f 6b 65 73 20 74 68 65 20 62 75 73 79 2d 68 61  okes the busy-ha
16ed0 6e 64 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33  ndler if sqlite3
16ee0 4f 73 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73  OsLock() returns
16ef0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59   .** SQLITE_BUSY
16f00 20 77 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20   when trying to 
16f10 75 70 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d  upgrade from no-
16f20 6c 6f 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44  lock to a SHARED
16f30 20 6c 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65   lock,.** or whe
16f40 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72  n trying to upgr
16f50 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
16f60 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45  VED lock to an E
16f70 58 43 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63  XCLUSIVE .** loc
16f80 6b 2e 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a  k. It does *not*
16f90 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
16fa0 20 68 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70   handler when up
16fb0 67 72 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20  grading from.** 
16fc0 53 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56  SHARED to RESERV
16fd0 45 44 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72  ED, or when upgr
16fe0 61 64 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45  ading from SHARE
16ff0 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a  D to EXCLUSIVE.*
17000 2a 20 28 77 68 69 63 68 20 6f 63 63 75 72 73 20  * (which occurs 
17010 64 75 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e  during hot-journ
17020 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75  al rollback). Su
17030 6d 6d 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  mmary:.**.**   T
17040 72 61 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20  ransition       
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 7c 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79   | Invokes xBusy
17070 48 61 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d  Handler.**   ---
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
170b0 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f  -----.**   NO_LO
170c0 43 4b 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52  CK       -> SHAR
170d0 45 44 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59  ED_LOCK      | Y
170e0 65 73 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c  es.**   SHARED_L
170f0 4f 43 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45  OCK   -> RESERVE
17100 44 5f 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a  D_LOCK    | No.*
17110 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  *   SHARED_LOCK 
17120 20 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c    -> EXCLUSIVE_L
17130 4f 43 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20  OCK   | No.**   
17140 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e  RESERVED_LOCK ->
17150 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
17160 20 20 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66    | Yes.**.** If
17170 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
17180 72 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  r callback retur
17190 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
171a0 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74   lock is .** ret
171b0 72 69 65 64 2e 20 49 66 20 69 74 20 72 65 74 75  ried. If it retu
171c0 72 6e 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  rns zero, then t
171d0 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  he SQLITE_BUSY e
171e0 72 72 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72  rror is.** retur
171f0 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
17200 72 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 41  r of the pager A
17210 50 49 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  PI function..*/.
17220 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
17230 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
17240 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
17250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17260 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
17270 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
17280 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
17290 28 76 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20  (void *),       
172a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
172b0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
172c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
172d0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67  *pBusyHandlerArg
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70  /* Argument to p
17300 61 73 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64  ass to xBusyHand
17310 6c 65 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50  ler */.){  .  pP
17320 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
17330 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65  er = xBusyHandle
17340 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  r;.  pPager->pBu
17350 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70  syHandlerArg = p
17360 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a  BusyHandlerArg;.
17370 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
17380 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
17390 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49  or this pager. I
173a0 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20  f not NULL, the 
173b0 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a  reinitializer.**
173c0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
173d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
173e0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69   page in cache i
173f0 73 20 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74  s modified (rest
17400 6f 72 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74  ored).** as part
17410 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
17420 6e 20 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72  n or savepoint r
17430 6f 6c 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c  ollback. The cal
17440 6c 62 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20  lback gives .** 
17450 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
17460 65 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  e an opportunity
17470 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
17480 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f  EXTRA section to
17490 20 0a 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20   .** agree with 
174a0 74 68 65 20 72 65 73 74 6f 72 65 64 20 70 61 67  the restored pag
174b0 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
174c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
174d0 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
174e0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
174f0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29  einit)(DbPage*))
17500 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
17510 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
17520 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
17530 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
17540 65 20 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65  e size and numbe
17550 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
17560 74 65 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74  tes back.** to t
17570 68 65 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66  he codec..*/.#if
17580 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
17590 4f 44 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64  ODEC.static void
175a0 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65   pagerReportSize
175b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
175c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
175d0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b  CodecSizeChng ){
175e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f  .    pPager->xCo
175f0 64 65 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67  decSizeChng(pPag
17600 65 72 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67  er->pCodec, pPag
17610 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 70 50           (int)pP
17640 61 67 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b  ager->nReserve);
17650 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
17660 65 66 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72  efine pagerRepor
17670 74 53 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20  tSize(X)     /* 
17680 4e 6f 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e  No-op if we do n
17690 6f 74 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64  ot support a cod
176a0 65 63 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ec */.#endif../*
176b0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70  .** Change the p
176c0 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62 79  age size used by
176d0 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63   the Pager objec
176e0 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  t. The new page 
176f0 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73  size .** is pass
17700 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65  ed in *pPageSize
17710 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
17720 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 65  ager is in the e
17730 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20  rror state when 
17740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17750 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69   called, it.** i
17760 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76  s a no-op. The v
17770 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
17780 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
17790 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65   error code (i.e
177a0 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c  . .** one of SQL
177b0 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
177c0 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c  E_CORRUPT or SQL
177d0 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a  ITE_FULL)..**.**
177e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
177f0 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
17800 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a  ing are true:.**
17810 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20  .**   * the new 
17820 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65  page size (value
17830 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20   of *pPageSize) 
17840 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65  is valid (a powe
17850 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f  r .**     of two
17860 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
17870 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
17880 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65  _SIZE, inclusive
17890 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a  ), and.**.**   *
178a0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
178b0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72  tstanding page r
178c0 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a  eferences, and.*
178d0 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74  *.**   * the dat
178e0 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72 20  abase is either 
178f0 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  not an in-memory
17900 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74 20   database or it 
17910 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d  is.**     an in-
17920 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
17930 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
17940 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20  onsists of zero 
17950 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65  pages..**.** the
17960 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65  n the pager obje
17970 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ct page size is 
17980 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  set to *pPageSiz
17990 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
179a0 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68 61  page size is cha
179b0 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  nged, then this 
179c0 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71  function uses sq
179d0 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63  lite3PagerMalloc
179e0 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e  () .** to obtain
179f0 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d   a new Pager.pTm
17a00 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20 49  pSpace buffer. I
17a10 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f  f this allocatio
17a20 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61  n attempt .** fa
17a30 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
17a40 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  M is returned an
17a50 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  d the page size 
17a60 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
17a70 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74  d. .** In all ot
17a80 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54  her cases, SQLIT
17a90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17aa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
17ab0 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  age size is not 
17ac0 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20  changed, either 
17ad0 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74  because one of t
17ae0 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a  he enumerated.**
17af0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
17b00 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74  e is not true, t
17b10 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
17b20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
17b30 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
17b40 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72  n was called, or
17b50 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d   because the mem
17b60 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61  ory allocation a
17b70 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a  ttempt failed, .
17b80 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69  ** then *pPageSi
17b90 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ze is set to the
17ba0 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70   old, retained p
17bb0 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20  age size before 
17bc0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
17bd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
17be0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
17bf0 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50  *pPager, u16 *pP
17c00 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
17c10 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
17c20 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17c30 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  de;.  if( rc==SQ
17c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
17c50 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
17c60 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
17c70 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
17c80 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
17c90 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17ca0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17cb0 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
17cc0 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
17cd0 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
17ce0 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26  pageSize .     &
17cf0 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & (pPager->memDb
17d00 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
17d10 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
17d20 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
17d30 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
17d40 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
17d50 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
17d60 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
17d70 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
17d80 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
17d90 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
17da0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
17dc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
17dd0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17de0 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
17df0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
17e00 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
17e10 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
17e20 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
17e30 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ce);.        pPa
17e40 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
17e50 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73   pNew;.        s
17e60 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 50  qlite3PcacheSetP
17e70 61 67 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ageSize(pPager->
17e80 70 50 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a  pPCache, pageSiz
17e90 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
17ea0 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65  }.    *pPageSize
17eb0 20 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e   = (u16)pPager->
17ec0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66  pageSize;.    if
17ed0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e  ( nReserve<0 ) n
17ee0 52 65 73 65 72 76 65 20 3d 20 70 50 61 67 65 72  Reserve = pPager
17ef0 2d 3e 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  ->nReserve;.    
17f00 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17f10 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
17f20 31 30 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67  1000 );.    pPag
17f30 65 72 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28  er->nReserve = (
17f40 69 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  i16)nReserve;.  
17f50 20 20 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a    pagerReportSiz
17f60 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
17f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
17f90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65  inter to the "te
17fa0 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75  mporary page" bu
17fb0 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e  ffer held intern
17fc0 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70  ally.** by the p
17fd0 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61  ager.  This is a
17fe0 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20   buffer that is 
17ff0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
18000 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65  ld the.** entire
18010 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61   content of a da
18020 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68  tabase page.  Th
18030 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65  is buffer is use
18040 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
18050 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
18060 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72  and will be over
18070 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72  written whenever
18080 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f   a rollback.** o
18090 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65  ccurs.  But othe
180a0 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72  r modules are fr
180b0 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f  ee to use it too
180c0 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20  , as long as.** 
180d0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65  no rollbacks are
180e0 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76   happening..*/.v
180f0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
18100 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72  rTempSpace(Pager
18110 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
18120 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70  urn pPager->pTmp
18130 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Space;.}../*.** 
18140 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
18150 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62  he maximum datab
18160 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69  ase page count i
18170 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
18180 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e  tive. .** Make n
18190 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50  o changes if mxP
181a0 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e  age is zero or n
181b0 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65  egative.  And ne
181c0 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a  ver reduce the.*
181d0 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  * maximum page c
181e0 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63  ount below the c
181f0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
18200 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
18210 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
18220 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
18230 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69  the current maxi
18240 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  mum page count..
18250 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18260 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
18270 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
18280 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
18290 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20  ( mxPage>0 ){.  
182a0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
182b0 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20   = mxPage;.  }. 
182c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
182d0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
182e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
182f0 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
18300 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
18310 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
18320 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
18330 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
18340 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
18350 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
18360 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
18370 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
18380 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
18390 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
183a0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
183b0 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
183c0 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
183d0 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
183e0 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
183f0 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
18400 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
18410 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
18420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
18430 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
18440 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
18450 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
18460 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
18470 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
18480 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
18490 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
184a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
184b0 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
184c0 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
184d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
184e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
184f0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
18500 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
18510 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18520 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
18530 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
18540 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
18550 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
18560 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
18570 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
18580 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
18590 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
185a0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
185b0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
185c0 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
185d0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
185e0 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
185f0 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
18600 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
18610 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
18620 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  er was opened on
18630 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
18640 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22  e (zFilename==""
18650 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20  ), or.** opened 
18660 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74  on a file less t
18670 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73  han N bytes in s
18680 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20  ize, the output 
18690 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72  buffer is.** zer
186a0 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  oed and SQLITE_O
186b0 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
186c0 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68  rationale for th
186d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
186e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  .** function is 
186f0 75 73 65 64 20 74 6f 20 72 65 61 64 20 64 61 74  used to read dat
18700 61 62 61 73 65 20 68 65 61 64 65 72 73 2c 20 61  abase headers, a
18710 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65  nd a new transie
18720 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69  nt or.** zero si
18730 7a 65 64 20 64 61 74 61 62 61 73 65 20 68 61 73  zed database has
18740 20 61 20 68 65 61 64 65 72 20 74 68 61 6e 20 63   a header than c
18750 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79  onsists entirely
18760 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a   of zeroes..**.*
18770 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f  * If any IO erro
18780 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c  r apart from SQL
18790 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
187a0 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65  READ is encounte
187b0 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f  red,.** the erro
187c0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
187d0 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ed to the caller
187e0 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
187f0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70  s of the.** outp
18800 75 74 20 62 75 66 66 65 72 20 75 6e 64 65 66 69  ut buffer undefi
18810 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
18820 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
18830 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
18840 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
18850 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
18860 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
18870 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73  QLITE_OK;.  mems
18880 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
18890 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
188a0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c  n(pPager->fd) ||
188b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
188c0 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65  e );.  if( isOpe
188d0 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  n(pPager->fd) ){
188e0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
188f0 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c  BHDR %p 0 %d\n",
18900 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20   pPager, N)).   
18910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
18920 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
18930 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20  pDest, N, 0);.  
18940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18950 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
18960 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
18970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
18990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
189a0 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
189b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
189c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
189d0 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20   associated .** 
189e0 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72  with pPager. Nor
189f0 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63  mally, this is c
18a00 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64  alculated as (<d
18a10 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61  b file size>/<pa
18a20 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f  ge-size>)..** Ho
18a30 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 66 69  wever, if the fi
18a40 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20 31 20  le is between 1 
18a50 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20  and <page-size> 
18a60 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74  bytes in size, t
18a70 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20  hen .** this is 
18a80 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31 20 70  considered a 1 p
18a90 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  age file..**.** 
18aa0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
18ab0 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 20 77  in error state w
18ac0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
18ad0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  n is called, the
18ae0 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73  n the.** error s
18af0 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
18b00 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18b10 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63  *pnPage left unc
18b20 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69  hanged. Or,.** i
18b30 66 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  f the file syste
18b40 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75 65 72  m has to be quer
18b50 69 65 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65  ied for the size
18b60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
18b70 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20 61 74  .** the query at
18b80 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e  tempt returns an
18b90 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49   IO error, the I
18ba0 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
18bb0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
18bc0 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20  *pnPage is left 
18bd0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  unchanged..**.**
18be0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 65   Otherwise, if e
18bf0 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75 63  verything is suc
18c00 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51  cessful, then SQ
18c10 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18c20 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61  ned.** and *pnPa
18c30 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ge is set to the
18c40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18c50 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
18c60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18c70 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
18c80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
18c90 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67  t *pnPage){.  Pg
18ca0 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  no nPage;       
18cb0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
18cc0 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a   to return via *
18cd0 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  pnPage */..  /* 
18ce0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
18cf0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 65  already in the e
18d00 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75  rror state, retu
18d10 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
18d20 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18d30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
18d40 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18d50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
18d60 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
18d70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18d80 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  es in the file. 
18d90 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50  Store this in nP
18da0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  age. */.  if( pP
18db0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
18dc0 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d  d ){.    nPage =
18dd0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
18de0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
18df0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
18e00 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72        /* Error r
18e10 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
18e20 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69  eSize() */.    i
18e30 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  64 n = 0;       
18e40 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73         /* File s
18e50 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74  ize in bytes ret
18e60 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
18e70 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73  ize() */..    as
18e80 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
18e90 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
18ea0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
18eb0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70      if( isOpen(p
18ec0 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30  Pager->fd) && (0
18ed0 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
18ee0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
18ef0 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b  er->fd, &n))) ){
18f00 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72  .      pager_err
18f10 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
18f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
18f40 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
18f50 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
18f60 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20    nPage = 1;.   
18f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
18f80 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f  age = (Pgno)(n /
18f90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18fa0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
18fb0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
18fc0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
18fd0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18fe0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
18ff0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
19000 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  ileSize = nPage;
19010 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
19020 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a  bSizeValid = 1;.
19030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
19040 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e  If the current n
19050 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19060 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 67 72  n the file is gr
19070 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a  eater than the .
19080 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20    ** configured 
19090 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75  maximum pager nu
190a0 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74  mber, increase t
190b0 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74  he allowed limit
190c0 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
190d0 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65  e file can be re
190e0 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ad..  */.  if( n
190f0 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50  Page>pPager->mxP
19100 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
19110 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e  r->mxPgno = (Pgn
19120 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  o)nPage;.  }..  
19130 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  /* Set the outpu
19140 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72  t variable and r
19150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
19160 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20  */.  if( pnPage 
19170 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d  ){.    *pnPage =
19180 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65   nPage;.  }.  re
19190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
191b0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
191c0 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20  f type locktype 
191d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
191e0 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69  file. If.** a si
191f0 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72  milar or greater
19200 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
19210 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63   held, this func
19220 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a  tion is a no-op.
19230 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51  ** (returning SQ
19240 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74  LITE_OK immediat
19250 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  ely)..**.** Othe
19260 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74  rwise, attempt t
19270 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63  o obtain the loc
19280 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  k using sqlite3O
19290 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20  sLock(). Invoke 
192a0 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c  .** the busy cal
192b0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
192c0 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  k is currently n
192d0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65  ot available. Re
192e0 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74  peat .** until t
192f0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
19300 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f   returns false o
19310 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65  r until the atte
19320 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69  mpt to .** obtai
19330 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  n the lock succe
19340 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
19350 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
19360 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
19370 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
19380 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
19390 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65  the lock. If the
193a0 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
193b0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
193c0 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 73 74  set the Pager.st
193d0 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65  ate .** variable
193e0 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66   to locktype bef
193f0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
19400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
19410 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
19420 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
19430 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
19440 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19470 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ode */..  /* The
19480 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20   OS lock values 
19490 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
194a0 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f   as the Pager lo
194b0 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61  ck values */.  a
194c0 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41  ssert( PAGER_SHA
194d0 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  RED==SHARED_LOCK
194e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
194f0 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45  GER_RESERVED==RE
19500 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SERVED_LOCK );. 
19510 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45   assert( PAGER_E
19520 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53  XCLUSIVE==EXCLUS
19530 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  IVE_LOCK );..  /
19540 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73  * If the file is
19550 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63   currently unloc
19560 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a  ked then the siz
19570 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77  e must be unknow
19580 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  n */.  assert( p
19590 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
195a0 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50  GER_SHARED || pP
195b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
195c0 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
195d0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
195e0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
195f0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
19600 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
19610 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
19620 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
19630 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
19640 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
19650 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
19660 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
19670 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
19680 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
19690 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
196a0 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
196b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
196c0 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
196d0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
196e0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
196f0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19700 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
19710 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
19720 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19730 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
19740 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
19750 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
19760 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
19770 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
19780 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
19790 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
197a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
197b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
197c0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
197d0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
197e0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
197f0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
19800 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
19810 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
19820 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
19830 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
19840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19850 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
19860 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
19870 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
19880 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
19890 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
198a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
198b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
198c0 54 72 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d  Truncate the in-
198d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
198e0 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50  file image to nP
198f0 61 67 65 20 70 61 67 65 73 2e 20 54 68 69 73 20  age pages. This 
19900 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  .** function doe
19910 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
19920 6f 64 69 66 79 20 74 68 65 20 64 61 74 61 62 61  odify the databa
19930 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  se file on disk.
19940 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74   It .** just set
19950 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
19960 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
19970 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74  r object so that
19980 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74   the .** truncat
19990 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65  ion will be done
199a0 20 77 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   when the curren
199b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
199c0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76   committed..*/.v
199d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
199e0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61  TruncateImage(Pa
199f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
19a00 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65  o nPage){.  asse
19a10 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
19a20 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73  zeValid );.  ass
19a30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
19a40 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20  ize>=nPage );.  
19a50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19a60 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
19a70 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65  ERVED );.  pPage
19a80 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
19a90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  e;.}../*.** Shut
19aa0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
19ab0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
19ac0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
19ad0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
19ae0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
19af0 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
19b00 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
19b10 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
19b20 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
19b30 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
19b40 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
19b50 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
19b60 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
19b70 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
19b80 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
19b90 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
19ba0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
19bb0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
19bc0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
19bd0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
19be0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
19bf0 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
19c00 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
19c10 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
19c20 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
19c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19c40 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
19c50 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
19c60 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
19c70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
19c80 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
19c90 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
19ca0 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
19cb0 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
19cc0 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
19cd0 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
19ce0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
19cf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
19d00 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
19d10 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62  pPager){.  disab
19d20 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
19d30 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
19d40 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
19d50 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
19d60 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
19d70 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
19d80 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
19d90 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
19da0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
19db0 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f  {.    pager_unlo
19dc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  ck(pPager);.  }e
19dd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20  lse{.    /* Set 
19de0 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72  Pager.journalHdr
19df0 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62   to -1 for the b
19e00 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20 70 61  enefit of the pa
19e10 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a  ger_playback() .
19e20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63      ** call whic
19e30 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72  h may be made fr
19e40 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 55  om within pagerU
19e50 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
19e60 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a  (). If it.    **
19e70 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e   is not -1, then
19e80 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f   the unsynced po
19e90 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e  rtion of an open
19ea0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61   journal file ma
19eb0 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79  y.    ** be play
19ec0 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
19ed0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 61 20   database. If a 
19ee0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
19ef0 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a  curs while.    *
19f00 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
19f10 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62 61 73  ing, the databas
19f20 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72  e may become cor
19f30 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rupt..    */.   
19f40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19f50 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61  Hdr = -1;.    pa
19f60 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
19f70 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19f80 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
19f90 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
19fa0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
19fb0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
19fc0 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f  PAGERTRACE(("CLO
19fd0 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
19fe0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49  D(pPager)));.  I
19ff0 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  OTRACE(("CLOSE %
1a000 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1a010 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
1a020 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73  pPager->fd);.  s
1a030 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
1a040 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
1a050 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  );.  sqlite3Pcac
1a060 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  heClose(pPager->
1a070 70 50 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65  pPCache);..#ifde
1a080 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1a090 45 43 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  EC.  if( pPager-
1a0a0 3e 78 43 6f 64 65 63 46 72 65 65 20 29 20 70 50  >xCodecFree ) pP
1a0b0 61 67 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65  ager->xCodecFree
1a0c0 28 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29  (pPager->pCodec)
1a0d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
1a0e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61  rt( !pPager->aSa
1a0f0 76 65 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67  vepoint && !pPag
1a100 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1a110 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
1a120 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
1a130 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
1a140 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20  er->sjfd) );..  
1a150 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
1a160 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
1a170 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
1a180 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
1a190 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1a1a0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1a1b0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
1a1c0 6e 75 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20  number for page 
1a1d0 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  pPg..*/.Pgno sql
1a1e0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
1a1f0 62 65 72 28 44 62 50 61 67 65 20 2a 70 50 67 29  ber(DbPage *pPg)
1a200 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1a210 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
1a220 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
1a230 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
1a240 75 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  unt for page pPg
1a250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a260 33 50 61 67 65 72 52 65 66 28 44 62 50 61 67 65  3PagerRef(DbPage
1a270 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1a280 33 50 63 61 63 68 65 52 65 66 28 70 50 67 29 3b  3PcacheRef(pPg);
1a290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1a2a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f  he journal. In o
1a2b0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
1a2c0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
1a2d0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
1a2e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1a2f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
1a300 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
1a310 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
1a320 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  f the.** disk an
1a330 64 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  d can be restore
1a340 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
1a350 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  f a hot-journal 
1a360 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
1a370 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
1a380 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f  dSync flag is no
1a390 74 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73  t set, then this
1a3a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a   function is a.*
1a3b0 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  * no-op. Otherwi
1a3c0 73 65 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20  se, the actions 
1a3d0 72 65 71 75 69 72 65 64 20 64 65 70 65 6e 64 20  required depend 
1a3e0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d  on the journal-m
1a3f0 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ode.** and the d
1a400 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1a410 73 74 69 63 73 20 6f 66 20 74 68 65 20 74 68 65  stics of the the
1a420 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73   file-system, as
1a430 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1a440 20 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e    * If the journ
1a450 61 6c 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e  al file is an in
1a460 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20  -memory journal 
1a470 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20  file, no action 
1a480 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74  need.**     be t
1a490 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  aken..**.**   * 
1a4a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
1a4b0 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f  e device does no
1a4c0 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53 41  t support the SA
1a4d0 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72  FE_APPEND proper
1a4e0 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20  ty,.**     then 
1a4f0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f  the nRec field o
1a500 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1a510 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72  tly written jour
1a520 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20  nal header.**   
1a530 20 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20    is updated to 
1a540 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1a550 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65  er of journal re
1a560 63 6f 72 64 73 20 74 68 61 74 20 68 61 76 65 0a  cords that have.
1a570 2a 2a 20 20 20 20 20 62 65 65 6e 20 77 72 69 74  **     been writ
1a580 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74  ten following it
1a590 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
1a5a0 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66  s operating in f
1a5b0 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20  ull-sync.**     
1a5c0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1a5d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73  ournal file is s
1a5e0 79 6e 63 65 64 20 62 65 66 6f 72 65 20 74 68 69  ynced before thi
1a5f0 73 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  s field is updat
1a600 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66  ed..**.**   * If
1a610 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
1a620 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
1a630 20 53 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70   SEQUENTIAL prop
1a640 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20  erty, then .**  
1a650 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
1a660 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1a670 20 4f 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63   Or, in pseudo-c
1a680 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28  ode:.**.**   if(
1a690 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20   NOT <in-memory 
1a6a0 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20  journal> ){.**  
1a6b0 20 20 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f     if( NOT SAFE_
1a6c0 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20  APPEND ){.**    
1a6d0 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e     if( <full-syn
1a6e0 63 20 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28  c mode> ) xSync(
1a6f0 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b  <journal file>);
1a700 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74  .**       <updat
1a710 65 20 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a  e nRec field>.**
1a720 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69       } .**     i
1a730 66 28 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41  f( NOT SEQUENTIA
1a740 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e  L ) xSync(<journ
1a750 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20  al file>);.**   
1a760 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  }.**.** The Page
1a770 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1a780 69 73 20 6e 65 76 65 72 20 62 65 20 73 65 74 20  is never be set 
1a790 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
1a7a0 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66  les, or any.** f
1a7b0 69 6c 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  ile operating in
1a7c0 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50   no-sync mode (P
1a7d0 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20  ager.noSync set 
1a7e0 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a  to non-zero)..**
1a7f0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1a800 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
1a810 63 6c 65 61 72 73 20 74 68 65 20 50 47 48 44 52  clears the PGHDR
1a820 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
1a830 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67  of every .** pag
1a840 65 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  e currently held
1a850 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72   in memory befor
1a860 65 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  e returning SQLI
1a870 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a  TE_OK. If an IO.
1a880 2a 2a 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  ** error is enco
1a890 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68  untered, then th
1a8a0 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
1a8b0 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
1a8c0 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74  he caller..*/.st
1a8d0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
1a8e0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1a8f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1a900 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  r->needSync ){. 
1a910 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1a920 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
1a930 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a940 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
1a950 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
1a960 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69  EMORY ){.      i
1a970 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1a980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a990 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1a9a0 64 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  de */.      cons
1a9b0 74 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69  t int iDc = sqli
1a9c0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
1a9d0 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65  cteristics(pPage
1a9e0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73  r->fd);.      as
1a9f0 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
1aa00 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20  ger->jfd) );..  
1aa10 20 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26      if( 0==(iDc&
1aa20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1aa30 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20  E_APPEND) ){.   
1aa40 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
1aa50 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61 6e  ck deals with an
1aa60 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65 6d   obscure problem
1aa70 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63 6f  . If the last co
1aa80 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nnection.       
1aa90 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20 74   ** that wrote t
1aaa0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
1aab0 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69 6e  was operating in
1aac0 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75 72   persistent-jour
1aad0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  nal.        ** m
1aae0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ode, then the jo
1aaf0 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 61  urnal file may a
1ab00 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63 74  t this point act
1ab10 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72 0a  ually be larger.
1ab20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
1ab30 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
1ab40 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20 6e   bytes. If the n
1ab50 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68 65  ext thing in the
1ab60 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1ab70 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e 73   ** file happens
1ab80 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61 6c   to be a journal
1ab90 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65 6e  -header (written
1aba0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a   as part of the.
1abb0 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
1abc0 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ous connections 
1abd0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61 6e  transaction), an
1abe0 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f 77  d a crash or pow
1abf0 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20 20  er-failure .    
1ac00 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61 66      ** occurs af
1ac10 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64 61  ter nRec is upda
1ac20 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20 74  ted but before t
1ac30 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
1ac40 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20 2a  rites .        *
1ac50 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  * anything else 
1ac60 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1ac70 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73 2f  ile (or commits/
1ac80 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20 0a  rolls back its .
1ac90 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1aca0 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53 51  action), then SQ
1acb0 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65 20  Lite may become 
1acc0 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64 6f  confused when do
1acd0 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
1ace0 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   ** hot-journal 
1acf0 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77 69  rollback followi
1ad00 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74 20  ng recovery. It 
1ad10 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c  may roll back al
1ad20 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  l.        ** of 
1ad30 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  this connections
1ad40 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f 63   data, then proc
1ad50 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20 62  eed to rolling b
1ad60 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20 20  ack the old,.   
1ad70 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64       ** out-of-d
1ad80 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66 6f  ate data that fo
1ad90 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62 61  llows it. Databa
1ada0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
1adb0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1adc0 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f    ** To work aro
1add0 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68 65  und this, if the
1ade0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f   journal file do
1adf0 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f 6e  es appear to con
1ae00 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tain.        ** 
1ae10 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 66  a valid header f
1ae20 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e 6a  ollowing Pager.j
1ae30 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e 20  ournalOff, then 
1ae40 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20 20  write a 0x00.   
1ae50 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f 20       ** byte to 
1ae60 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74 20  the start of it 
1ae70 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66 72  to prevent it fr
1ae80 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e 69  om being recogni
1ae90 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  zed..        **.
1aea0 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69 61          ** Varia
1aeb0 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66 73  ble iNextHdrOffs
1aec0 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  et is set to the
1aed0 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63 68   offset at which
1aee0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
1aef0 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65 61   problematic hea
1af00 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c 20  der will occur, 
1af10 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61 4d  if it exists. aM
1af20 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20 20  agic is used .  
1af30 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74 65        ** as a te
1af40 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74  mporary buffer t
1af50 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66 69  o inspect the fi
1af60 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62 79  rst couple of by
1af70 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  tes of.        *
1af80 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c 20  * the potential 
1af90 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a  journal header..
1afa0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1afb0 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72 4f     i64 iNextHdrO
1afc0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 75  ffset;.        u
1afd0 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 09 75 38  8 aMagic[8];..u8
1afe0 20 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28   zHeader[sizeof(
1aff0 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
1b000 5d 3b 0a 0a 09 6d 65 6d 63 70 79 28 7a 48 65 61  ];...memcpy(zHea
1b010 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
1b020 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
1b030 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 09 70 75 74  nalMagic));..put
1b040 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
1b050 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
1b060 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
1b070 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20 20  nRec);..        
1b080 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 3d  iNextHdrOffset =
1b090 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65   journalHdrOffse
1b0a0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
1b0b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b0c0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66  sRead(pPager->jf
1b0d0 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e  d, aMagic, 8, iN
1b0e0 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20  extHdrOffset);. 
1b0f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1b100 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d  QLITE_OK && 0==m
1b110 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
1b120 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
1b130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
1b140 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72  tic const u8 zer
1b150 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  obyte = 0;.     
1b160 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1b170 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1b180 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c  >jfd, &zerobyte,
1b190 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73   1, iNextHdrOffs
1b1a0 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  et);.        }. 
1b1b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b1c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
1b1d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1b1e0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
1b1f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b200 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1b210 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1b220 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
1b230 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b240 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
1b250 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
1b260 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
1b270 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
1b280 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
1b290 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
1b2a0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
1b2b0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
1b2c0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
1b2d0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
1b2e0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
1b2f0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
1b300 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
1b310 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1b320 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
1b330 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
1b340 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
1b350 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
1b360 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
1b370 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1b380 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
1b390 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
1b3a0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
1b3b0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
1b3c0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
1b3d0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
1b3e0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
1b3f0 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
1b400 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
1b410 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
1b420 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
1b430 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
1b440 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
1b450 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
1b460 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
1b470 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
1b480 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1b490 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45  & 0==(iDc&SQLITE
1b4a0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1b4b0 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
1b4c0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b4d0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b4e0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b4f0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  er)));.         
1b500 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
1b510 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
1b520 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b530 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1b540 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b550 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1b560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1b570 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1b580 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b590 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41   }.        IOTRA
1b5a0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
1b5b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1b5c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1b5d0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
1b5e0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1b5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1b600 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
1b610 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
1b620 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r), pPager->jour
1b630 6e 61 6c 48 64 72 0a 09 29 3b 0a 20 20 20 20 20  nalHdr..);.     
1b640 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b650 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1b660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b670 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
1b680 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1b690 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
1b6a0 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59 4e  PAGERTRACE(("SYN
1b6b0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
1b6c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1b6d0 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20 49  er)));.        I
1b6e0 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b6f0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b700 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1b710 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
1b720 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
1b730 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20  ync_flags| .    
1b740 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73        (pPager->s
1b750 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54  ync_flags==SQLIT
1b760 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49  E_SYNC_FULL?SQLI
1b770 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
1b780 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  :0).        );. 
1b790 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b7a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1b7b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b7c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
1b7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 61 73  journal file was
1b7e0 20 6a 75 73 74 20 73 75 63 63 65 73 73 66 75 6c   just successful
1b7f0 6c 79 20 73 79 6e 63 65 64 2e 20 53 65 74 20 50  ly synced. Set P
1b800 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20  ager.needSync . 
1b810 20 20 20 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e     ** to zero an
1b820 64 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  d clear the PGHD
1b830 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
1b840 20 6f 6e 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a   on all pagess..
1b850 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65      */.    pPage
1b860 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1b870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
1b880 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
1b890 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
1b8a0 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
1b8b0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1b8c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b8d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b8e0 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
1b8f0 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  t is the first i
1b900 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
1b910 6f 66 20 64 69 72 74 79 20 70 61 67 65 73 20 63  of dirty pages c
1b920 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20 62 79 20 74  onnected.** by t
1b930 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
1b940 70 6f 69 6e 74 65 72 2e 20 54 68 69 73 20 66 75  pointer. This fu
1b950 6e 63 74 69 6f 6e 20 77 72 69 74 65 73 20 65 61  nction writes ea
1b960 63 68 20 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a  ch one of the.**
1b970 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
1b980 20 69 6e 20 74 68 65 20 6c 69 73 74 20 74 6f 20   in the list to 
1b990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b9a0 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  e. The argument 
1b9b0 6d 61 79 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20  may.** be NULL, 
1b9c0 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
1b9d0 65 6d 70 74 79 20 6c 69 73 74 2e 20 49 6e 20 74  empty list. In t
1b9e0 68 69 73 20 63 61 73 65 20 74 68 69 73 20 66 75  his case this fu
1b9f0 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e  nction is.** a n
1ba00 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
1ba10 70 61 67 65 72 20 6d 75 73 74 20 68 6f 6c 64 20  pager must hold 
1ba20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45 52  at least a RESER
1ba30 56 45 44 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68  VED lock when th
1ba40 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
1ba50 73 20 63 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65  s called. Before
1ba60 20 77 72 69 74 69 6e 67 20 61 6e 79 74 68 69 6e   writing anythin
1ba70 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1ba80 65 20 66 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63  e file, this loc
1ba90 6b 0a 2a 2a 20 69 73 20 75 70 67 72 61 64 65 64  k.** is upgraded
1baa0 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49 56 45   to an EXCLUSIVE
1bab0 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f   lock. If the lo
1bac0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
1bad0 61 69 6e 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  ained,.** SQLITE
1bae0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
1baf0 64 20 61 6e 64 20 6e 6f 20 64 61 74 61 20 69 73  d and no data is
1bb00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1bb10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bb20 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  * .** If the pag
1bb30 65 72 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c  er is a temp-fil
1bb40 65 20 70 61 67 65 72 20 61 6e 64 20 74 68 65 20  e pager and the 
1bb50 61 63 74 75 61 6c 20 66 69 6c 65 2d 73 79 73 74  actual file-syst
1bb60 65 6d 20 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f  em file.** is no
1bb70 74 20 79 65 74 20 6f 70 65 6e 2c 20 69 74 20 69  t yet open, it i
1bb80 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6f 70  s created and op
1bb90 65 6e 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ened before any 
1bba0 64 61 74 61 20 69 73 20 0a 2a 2a 20 77 72 69 74  data is .** writ
1bbb0 74 65 6e 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ten out..**.** O
1bbc0 6e 63 65 20 74 68 65 20 6c 6f 63 6b 20 68 61 73  nce the lock has
1bbd0 20 62 65 65 6e 20 75 70 67 72 61 64 65 64 20 61   been upgraded a
1bbe0 6e 64 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nd, if necessary
1bbf0 2c 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  , the file opene
1bc00 64 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20  d,.** the pages 
1bc10 61 72 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20  are written out 
1bc20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1bc30 66 69 6c 65 20 69 6e 20 6c 69 73 74 20 6f 72 64  file in list ord
1bc40 65 72 2e 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61  er. Writing.** a
1bc50 20 70 61 67 65 20 69 73 20 73 6b 69 70 70 65 64   page is skipped
1bc60 20 69 66 20 69 74 20 6d 65 65 74 73 20 65 69 74   if it meets eit
1bc70 68 65 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  her of the follo
1bc80 77 69 6e 67 20 63 72 69 74 65 72 69 61 3a 0a 2a  wing criteria:.*
1bc90 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67  *.**   * The pag
1bca0 65 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  e number is grea
1bcb0 74 65 72 20 74 68 61 6e 20 50 61 67 65 72 2e 64  ter than Pager.d
1bcc0 62 53 69 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a  bSize, or.**   *
1bcd0 20 54 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   The PGHDR_DONT_
1bce0 57 52 49 54 45 20 66 6c 61 67 20 69 73 20 73 65  WRITE flag is se
1bcf0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
1bd00 2a 0a 2a 2a 20 49 66 20 77 72 69 74 69 6e 67 20  *.** If writing 
1bd10 6f 75 74 20 61 20 70 61 67 65 20 63 61 75 73 65  out a page cause
1bd20 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bd30 69 6c 65 20 74 6f 20 67 72 6f 77 2c 20 50 61 67  ile to grow, Pag
1bd40 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a  er.dbFileSize.**
1bd50 20 69 73 20 75 70 64 61 74 65 64 20 61 63 63 6f   is updated acco
1bd60 72 64 69 6e 67 6c 79 2e 20 49 66 20 70 61 67 65  rdingly. If page
1bd70 20 31 20 69 73 20 77 72 69 74 74 65 6e 20 6f 75   1 is written ou
1bd80 74 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  t, then the valu
1bd90 65 20 63 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50  e cached.** in P
1bda0 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b  ager.dbFileVers[
1bdb0 5d 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  ] is updated to 
1bdc0 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 76 61  match the new va
1bdd0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
1bde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1bdf0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65  le..**.** If eve
1be00 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
1be10 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
1be20 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1be30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a   an IO error .**
1be40 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
1be50 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1be60 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1be70 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
1be80 20 63 61 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62   cannot.** be ob
1be90 74 61 69 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42  tained, SQLITE_B
1bea0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2e  USY is returned.
1beb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1bec0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1bed0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
1bee0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1bef0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1bf00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1bf10 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1bf20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1bf50 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 4e 45 56  de */..  if( NEV
1bf60 45 52 28 70 4c 69 73 74 3d 3d 30 29 20 29 20 72  ER(pList==0) ) r
1bf70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bf80 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
1bf90 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
1bfa0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
1bfb0 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
1bfc0 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
1bfd0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1bfe0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
1bff0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
1c000 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
1c010 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
1c020 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
1c030 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20 6e    ** call is a n
1c040 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o-op..  **.  ** 
1c050 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
1c060 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
1c070 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
1c080 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
1c090 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
1c0a0 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
1c0b0 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
1c0c0 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
1c0d0 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
1c0e0 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
1c0f0 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
1c100 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
1c110 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
1c120 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
1c130 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
1c140 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
1c150 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
1c160 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
1c170 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
1c180 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
1c190 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
1c1a0 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
1c1b0 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
1c1c0 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
1c1d0 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
1c1e0 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1c1f0 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
1c200 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
1c210 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
1c220 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1c230 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
1c240 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
1c250 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1c260 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
1c270 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
1c280 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
1c290 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
1c2a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
1c2b0 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
1c2c0 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
1c2d0 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
1c2e0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
1c2f0 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  back..  */.  ass
1c300 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1c310 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1c320 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ED );.  rc = pag
1c330 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1c340 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1c350 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49  E_LOCK);..  /* I
1c360 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61 20  f the file is a 
1c370 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f  temp-file has no
1c380 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
1c390 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
1c3a0 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  It.  ** is not p
1c3b0 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74  ossible for rc t
1c3c0 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20  o be other than 
1c3d0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69  SQLITE_OK if thi
1c3e0 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73  s branch.  ** is
1c3f0 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72   taken, as pager
1c400 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20  _wait_on_lock() 
1c410 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74  is a no-op for t
1c420 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a  emp-files..  */.
1c430 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50    if( !isOpen(pP
1c440 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
1c450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c460 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d  >tempFile && rc=
1c470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1c480 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e    rc = pagerOpen
1c490 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
1c4a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1c4b0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a  >vfsFlags);.  }.
1c4c0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
1c4d0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74  LITE_OK && pList
1c4e0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1c4f0 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b  o = pList->pgno;
1c500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
1c510 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
1c520 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
1c530 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
1c540 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
1c550 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
1c560 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
1c570 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
1c580 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77  runcateImage() w
1c590 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
1c5a0 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
1c5b0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
1c5c0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
1c5d0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
1c5e0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
1c5f0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
1c600 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
1c610 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  **.    ** Also, 
1c620 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74  do not write out
1c630 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 68   any page that h
1c640 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e  as the PGHDR_DON
1c650 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20  T_WRITE flag.   
1c660 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79 20   ** set (set by 
1c670 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1c680 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f  Write())..    */
1c690 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
1c6a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26  Pager->dbSize &&
1c6b0 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67   0==(pList->flag
1c6c0 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  s&PGHDR_DONT_WRI
1c6d0 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  TE) ){.      i64
1c6e0 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
1c6f0 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
1c700 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f  pageSize;   /* O
1c710 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a  ffset to write *
1c720 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  /.      char *pD
1c730 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74         /* Data t
1c760 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a  o write */    ..
1c770 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20        /* Encode 
1c780 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1c790 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
1c7a0 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74  ger, pList->pDat
1c7b0 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75  a, pgno, 6, retu
1c7c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rn SQLITE_NOMEM,
1c7d0 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20   pData);..      
1c7e0 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68 65  /* Write out the
1c7f0 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20   page data. */. 
1c800 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1c810 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1c820 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
1c830 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
1c840 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  fset);..      /*
1c850 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20 6a   If page 1 was j
1c860 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64  ust written, upd
1c870 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65  ate Pager.dbFile
1c880 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20  Vers to match.  
1c890 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
1c8a0 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74   now stored in t
1c8b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1c8c0 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68 69  . If writing thi
1c8d0 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  s .      ** page
1c8e0 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74 61   caused the data
1c8f0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f  base file to gro
1c900 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c 65  w, update dbFile
1c910 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  Size. .      */.
1c920 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d        if( pgno==
1c930 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  1 ){.        mem
1c940 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46  cpy(&pPager->dbF
1c950 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b  ileVers, &pData[
1c960 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  24], sizeof(pPag
1c970 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
1c980 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c990 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
1c9a0 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
1c9b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64         pPager->d
1c9c0 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f  bFileSize = pgno
1c9d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1c9e0 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62   /* Update any b
1c9f0 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f  ackup objects co
1ca00 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  pying the conten
1ca10 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 72  ts of this pager
1ca20 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1ca30 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28 70  e3BackupUpdate(p
1ca40 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20  Pager->pBackup, 
1ca50 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74  pgno, (u8*)pList
1ca60 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->pData);..     
1ca70 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 54   PAGERTRACE(("ST
1ca80 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68  ORE %d page %d h
1ca90 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1caa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cab0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cac0 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  , pgno, pager_pa
1cad0 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b  gehash(pList)));
1cae0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1caf0 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c  "PGOUT %p %d\n",
1cb00 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
1cb10 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1cb20 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1cb30 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
1cb40 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1cb50 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
1cb60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cb70 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1cb80 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
1cb90 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1cba0 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a  Pager), pgno));.
1cbb0 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
1cbc0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1cbd0 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
1cbe0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1cbf0 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
1cc00 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
1cc10 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
1cc20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1cc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1cc40 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65   a record of the
1cc50 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1cc60 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74 68  f page pPg to th
1cc70 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a  e sub-journal. .
1cc80 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  ** It is the cal
1cc90 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
1cca0 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52  ity to use subjR
1ccb0 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74 6f  equiresPage() to
1ccc0 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20   check .** that 
1ccd0 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71  it is really req
1cce0 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c  uired before cal
1ccf0 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  ling this functi
1cd00 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  on..**.** If suc
1cd10 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65  cessful, set the
1cd20 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69   bit correspondi
1cd30 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20  ng to pPg->pgno 
1cd40 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a  in the bitvecs.*
1cd50 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73  * for all open s
1cd60 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65  avepoints before
1cd70 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1cd80 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1cd90 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1cda0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
1cdb0 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
1cdc0 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  n IO.** error co
1cdd0 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d 70  de if the attemp
1cde0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1cdf0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61  e sub-journal fa
1ce00 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49  ils, or .** SQLI
1ce10 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61  TE_NOMEM if a ma
1ce20 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65  lloc fails while
1ce30 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20 69   setting a bit i
1ce40 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a  n a savepoint.**
1ce50 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74   bitvec..*/.stat
1ce60 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61  ic int subjourna
1ce70 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  lPage(PgHdr *pPg
1ce80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1ce90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1cea0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1ceb0 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73  pPager;.  if( is
1cec0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
1ced0 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  d) ){.    void *
1cee0 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61  pData = pPg->pDa
1cef0 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  ta;.    i64 offs
1cf00 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75  et = pPager->nSu
1cf10 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  bRec*(4+pPager->
1cf20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63  pageSize);.    c
1cf30 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20 20  har *pData2;..  
1cf40 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
1cf50 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1cf60 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
1cf70 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
1cf80 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41  2);.    PAGERTRA
1cf90 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
1cfa0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1cfb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cfc0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1cfd0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61   .    assert( pa
1cfe0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1cff0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
1d000 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1d010 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   );.    rc = wri
1d020 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1d030 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1d040 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1d050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d060 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d070 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1d080 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
1d090 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1d0a0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1d0b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1d0c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d0d0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
1d0e0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
1d0f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1d100 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1d110 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
1d120 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1d130 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1d140 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1d150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1d160 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d170 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1d180 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1d190 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1d1a0 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1d1b0 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1d1c0 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1d1d0 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1d1e0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1d1f0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1d200 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1d210 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1d220 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1d230 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1d240 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1d250 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1d260 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1d270 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1d280 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1d290 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1d2a0 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1d2b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1d2c0 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1d2d0 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1d2e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1d2f0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1d300 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1d310 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1d320 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1d330 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1d340 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1d350 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1d360 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1d370 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1d380 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1d390 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1d3a0 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1d3b0 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1d3c0 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1d3d0 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1d3e0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1d3f0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1d400 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1d410 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1d420 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1d430 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1d440 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1d450 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1d460 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1d470 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1d480 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1d490 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1d4a0 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1d4b0 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1d4c0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1d4d0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1d4e0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1d4f0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1d500 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1d510 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1d520 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1d530 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1d540 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1d550 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1d560 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1d570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d580 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1d590 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1d5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1d5b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1d5c0 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1d5d0 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1d5e0 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1d5f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1d600 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1d610 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1d620 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1d630 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1d640 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1d650 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1d660 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1d670 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1d680 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d690 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1d6a0 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1d6b0 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1d6c0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1d6d0 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1d6e0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1d6f0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1d700 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1d710 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1d720 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1d730 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d740 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d750 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d760 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d770 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d780 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d790 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d7a0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d7b0 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d7c0 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d7d0 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d7e0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d7f0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d800 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d810 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d820 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d830 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d840 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d850 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d860 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d870 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d880 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d890 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d8a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d8b0 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
1d8c0 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d8d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d8e0 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20  EED_SYNC) ){.   
1d8f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d900 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e  K;.  }..  /* Syn
1d910 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d920 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
1d930 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
1d940 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d950 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  YNC ){.    rc = 
1d960 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1d970 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1d980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1d990 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1d9a0 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65  & .      !(pPage
1d9b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1d9c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1d9d0 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
1d9e0 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
1d9f0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1da00 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
1da10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1da20 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b  E_APPEND).    ){
1da30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1da40 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Rec = 0;.      r
1da50 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1da60 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1da70 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1da80 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1da90 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
1daa0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1dab0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1dac0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1dad0 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
1dae0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
1daf0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
1db00 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73  urnal..  ** This
1db10 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1db20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1db30 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1db40 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1db50 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1db60 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1db70 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1db80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69  .  **.  ** Consi
1db90 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1dba0 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
1dbb0 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents:.  **.  ** 
1dbc0 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
1dbd0 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
1dbe0 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  X>.  **     <mod
1dbf0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  ify page X>.  **
1dc00 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1dc10 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  p;.  **       <s
1dc20 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1dc30 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1dc40 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
1dc50 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
1dc60 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
1dc70 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a   TO sp;.  **.  *
1dc80 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
1dc90 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
1dca0 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
1dcb0 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
1dcc0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20  ritten.  ** out 
1dcd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1dce0 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
1dcf0 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
1dd00 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
1dd10 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
1dd20 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
1dd30 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
1dd40 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
1dd50 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74  ll read.  ** dat
1dd60 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1dd70 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1dd80 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1dd90 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1dda0 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1ddb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1ddc0 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1ddd0 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1dde0 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61  OINT sp".  ** wa
1ddf0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
1de00 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  .  ** The soluti
1de10 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1de20 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1de30 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1de40 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
1de50 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
1de60 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1de70 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
1de80 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a  that it will.  *
1de90 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
1dea0 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
1deb0 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
1dec0 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
1ded0 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a  .  ** executed..
1dee0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1def0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
1df00 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1df10 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
1df20 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
1df30 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
1df40 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
1df50 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1df60 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1df70 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
1df80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1df90 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1dfa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dfb0 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1dfc0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1dfd0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1dfe0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Pg);.  }..  /* M
1dff0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1e000 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
1e010 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e020 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1e030 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
1e040 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1e050 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1e060 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
1e070 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1e080 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
1e090 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1e0a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1e0b0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1e0c0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1e0d0 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
1e0e0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
1e0f0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
1e100 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
1e110 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
1e120 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
1e130 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
1e140 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e150 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
1e160 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1e170 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1e180 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1e190 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
1e1a0 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
1e1b0 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
1e1c0 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
1e1d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
1e1e0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
1e1f0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
1e200 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
1e210 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
1e220 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
1e230 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1e240 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
1e250 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
1e260 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
1e270 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
1e280 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
1e290 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
1e2a0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
1e2b0 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
1e2c0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
1e2d0 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
1e2e0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1e2f0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
1e300 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
1e310 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
1e320 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1e330 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
1e340 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
1e350 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
1e360 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
1e370 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1e380 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
1e390 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
1e3a0 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
1e3b0 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
1e3c0 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
1e3d0 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
1e3e0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
1e3f0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
1e400 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
1e410 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
1e420 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
1e430 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
1e440 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
1e450 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
1e460 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
1e470 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
1e480 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
1e490 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
1e4a0 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
1e4b0 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
1e4c0 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
1e4d0 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
1e4e0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
1e4f0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
1e500 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1e510 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
1e520 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
1e530 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
1e540 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
1e550 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
1e560 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1e570 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
1e580 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
1e590 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
1e5a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e5b0 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
1e5c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1e5d0 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
1e5e0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
1e5f0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
1e600 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
1e610 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
1e620 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
1e630 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
1e640 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1e650 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
1e660 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
1e670 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
1e680 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
1e690 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e6a0 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
1e6b0 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
1e6c0 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
1e6d0 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
1e6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e6f0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
1e700 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
1e710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e720 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
1e730 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e740 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1e750 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
1e760 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
1e770 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
1e780 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
1e790 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e7a0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e7c0 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
1e7d0 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
1e7e0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
1e7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e800 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1e810 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
1e820 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
1e830 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
1e840 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
1e850 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e860 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
1e870 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
1e880 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e890 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1e8a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e8b0 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
1e8c0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e8d0 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
1e8e0 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
1e8f0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
1e900 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
1e910 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e920 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e930 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
1e940 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
1e950 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e960 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1e970 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
1e980 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
1e990 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
1e9a0 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e9b0 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1e9c0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
1e9d0 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e9e0 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
1e9f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1ea00 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
1ea10 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1ea20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ea30 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
1ea40 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
1ea50 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1ea60 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
1ea70 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
1ea80 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
1ea90 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
1eaa0 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1eab0 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
1eac0 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
1ead0 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
1eae0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
1eaf0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
1eb00 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
1eb10 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1eb20 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
1eb30 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
1eb40 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
1eb50 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
1eb60 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
1eb70 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
1eb80 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
1eb90 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
1eba0 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
1ebb0 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
1ebc0 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
1ebd0 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
1ebe0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
1ebf0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
1ec00 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
1ec10 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
1ec20 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
1ec30 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1ec40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1ec50 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
1ec60 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
1ec70 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
1ec80 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
1ec90 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
1eca0 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
1ecb0 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
1ecc0 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
1ecd0 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
1ece0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
1ecf0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
1ed00 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
1ed10 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
1ed20 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
1ed30 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
1ed40 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
1ed50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
1ed60 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
1ed70 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1ed80 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
1ed90 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1eda0 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33 4a   ROUND8(sqlite3J
1edb0 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1edc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1edd0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ede0 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1edf0 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
1ee00 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1ee10 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1ee20 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
1ee30 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
1ee40 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
1ee50 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
1ee60 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
1ee70 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1ee80 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
1ee90 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
1eea0 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
1eeb0 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
1eec0 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
1eed0 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
1eee0 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
1eef0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
1ef00 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
1ef10 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
1ef20 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1ef30 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1ef40 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
1ef50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
1ef60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
1ef70 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1ef80 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
1ef90 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
1efa0 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
1efb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1efc0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
1efd0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1efe0 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
1eff0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
1f000 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
1f010 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
1f020 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
1f030 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
1f040 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1f050 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61 74      {.      zPat
1f060 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f 2a  hname[0] = 0; /*
1f070 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74 69   Make sure initi
1f080 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20 46  alized even if F
1f090 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66 61  ullPathname() fa
1f0a0 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ils */.      rc 
1f0b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
1f0c0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
1f0d0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
1f0e0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
1f0f0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68      }..    nPath
1f100 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  name = sqlite3St
1f110 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65  rlen30(zPathname
1f120 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f130 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74  QLITE_OK && nPat
1f140 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78  hname+8>pVfs->mx
1f150 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
1f160 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
1f170 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74   is taken when t
1f180 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20  he journal path 
1f190 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
1f1a0 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1f1b0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77  e being opened w
1f1c0 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e  ill be more than
1f1d0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1f1e0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  e.      ** bytes
1f1f0 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73   in length. This
1f200 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1f210 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ase cannot be op
1f220 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61  ened,.      ** a
1f230 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65  s it will not be
1f240 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65   possible to ope
1f250 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1f260 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20  le or even.     
1f270 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20   ** check for a 
1f280 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  hot-journal befo
1f290 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20  re reading..    
1f2a0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
1f2b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1f2c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1f2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f2e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1f2f0 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1f300 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f310 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1f320 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
1f330 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74  for the Pager st
1f340 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20  ructure, PCache 
1f350 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a  object, the.  **
1f360 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63   three file desc
1f370 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74  riptors, the dat
1f380 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20  abase file name 
1f390 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
1f3a0 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e  .  ** file name.
1f3b0 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d   The layout in m
1f3c0 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c  emory is as foll
1f3d0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1f3e0 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20     Pager object 
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72     (sizeof(Pager
1f410 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20  ) bytes).  **   
1f420 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20    PCache object 
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65    (sqlite3Pcache
1f450 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20  Size() bytes).  
1f460 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20  **     Database 
1f470 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20  file handle     
1f480 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a         (pVfs->sz
1f490 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20  OsFile bytes).  
1f4a0 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e  **     Sub-journ
1f4b0 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20  al file handle  
1f4c0 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1f4d0 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1f4e0 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75   **     Main jou
1f4f0 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65  rnal file handle
1f500 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f510 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f520 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73    **     Databas
1f530 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20  e file name     
1f540 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e           (nPathn
1f550 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  ame+1 bytes).  *
1f560 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69  *     Journal fi
1f570 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20  le name         
1f580 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65        (nPathname
1f590 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f  +8+1 bytes).  */
1f5a0 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29  .  pPtr = (u8 *)
1f5b0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1f5c0 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73 69  o(.    ROUND8(si
1f5d0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20 2b  zeof(*pPager)) +
1f5e0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 73        /* Pager s
1f5f0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
1f600 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69 7a  ROUND8(pcacheSiz
1f610 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  e) +           /
1f620 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20  * PCache object 
1f630 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70 56  */.    ROUND8(pV
1f640 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b 20  fs->szOsFile) + 
1f650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
1f660 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
1f670 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1f680 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20 20   * 2 +          
1f690 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e  /* The two journ
1f6a0 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20  al files */ .   
1f6b0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20 2b   nPathname + 1 +
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6d0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
1f6e0 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f6f0 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
1f700 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a     /* zJournal *
1f710 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28  /.  );.  assert(
1f720 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1f730 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e 54  NMENT(SQLITE_INT
1f740 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c 46  _TO_PTR(journalF
1f750 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20 69  ileSize)) );.  i
1f760 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20 20  f( !pPtr ){.    
1f770 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
1f780 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
1f790 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1f7a0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20 3d  ;.  }.  pPager =
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50                (P
1f7c0 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20 20  ager*)(pPtr);.  
1f7d0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
1f7e0 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28 70  =    (PCache*)(p
1f7f0 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  Ptr += ROUND8(si
1f800 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29 3b  zeof(*pPager)));
1f810 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
1f820 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1f830 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38  )(pPtr += ROUND8
1f840 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a 20  (pcacheSize));. 
1f850 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d 20   pPager->sjfd = 
1f860 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 28  (sqlite3_file*)(
1f870 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 70  pPtr += ROUND8(p
1f880 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29 3b  Vfs->szOsFile));
1f890 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
1f8a0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1f8b0 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61  )(pPtr += journa
1f8c0 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50  lFileSize);.  pP
1f8d0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
1f8e0 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74  =    (char*)(pPt
1f8f0 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65  r += journalFile
1f900 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
1f910 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
1f920 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a 66  NMENT(pPager->jf
1f930 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  d) );..  /* Fill
1f940 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
1f950 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
1f960 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
1f970 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
1f980 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
1f990 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ame ){.    pPage
1f9a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
1f9b0 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
1f9c0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a  nPathname + 1);.
1f9d0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1f9e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
1f9f0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
1fa00 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
1fa10 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1fa20 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
1fa30 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
1fa40 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
1fa50 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
1fa60 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
1fa70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1fa80 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  ->zFilename[0]==
1fa90 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  0 ) pPager->zJou
1faa0 72 6e 61 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  rnal[0] = 0;.   
1fab0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1fac0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  athname);.  }.  
1fad0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
1fae0 56 66 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  Vfs;.  pPager->v
1faf0 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
1fb00 67 73 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  gs;..  /* Open t
1fb10 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
1fb20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
1fb30 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
1fb40 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
1fb50 0a 20 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20  .    int fout = 
1fb60 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1fb70 20 20 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61        /* VFS fla
1fb80 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 78  gs returned by x
1fb90 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 20 20 72 63  Open() */.    rc
1fba0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1fbb0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1fbc0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
1fbd0 2d 3e 66 64 2c 20 76 66 73 46 6c 61 67 73 2c 20  ->fd, vfsFlags, 
1fbe0 26 66 6f 75 74 29 3b 0a 20 20 20 20 72 65 61 64  &fout);.    read
1fbf0 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26 53 51 4c  Only = (fout&SQL
1fc00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1fc10 59 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  Y);..    /* If t
1fc20 68 65 20 66 69 6c 65 20 77 61 73 20 73 75 63 63  he file was succ
1fc30 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20  essfully opened 
1fc40 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
1fc50 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 63 68  ccess,.    ** ch
1fc60 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
1fc70 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
1fc80 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
1fc90 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
1fca0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
1fcb0 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
1fcc0 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
1fcd0 6d 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  m of:.    **.   
1fce0 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f   **    + SQLITE_
1fcf0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1fd00 45 2c 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  E,.    **    + T
1fd10 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1fd20 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
1fd30 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
1fd40 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67 65  *    + The large
1fd50 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68 61  st page size tha
1fd60 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  t can be written
1fd70 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 20   atomically..   
1fd80 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
1fd90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65  SQLITE_OK && !re
1fda0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
1fdb0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
1fdc0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
1fdd0 65 72 74 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ert(SQLITE_DEFAU
1fde0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 53 51  LT_PAGE_SIZE<=SQ
1fdf0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1fe00 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
1fe10 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
1fe20 74 3c 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  t<pPager->sector
1fe30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
1fe40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
1fe50 6f 72 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  orSize>SQLITE_MA
1fe60 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
1fe70 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IZE ){.         
1fe80 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51   szPageDflt = SQ
1fe90 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
1fea0 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20  _PAGE_SIZE;.    
1feb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fec0 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20       szPageDflt 
1fed0 3d 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 73  = (u16)pPager->s
1fee0 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20  ectorSize;.     
1fef0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
1ff00 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1ff10 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
1ff20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 69       {.        i
1ff30 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
1ff40 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
1ff50 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
1ff60 66 64 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  fd);.        int
1ff70 20 69 69 3b 0a 20 20 20 20 20 20 20 20 61 73 73   ii;.        ass
1ff80 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
1ff90 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32  _ATOMIC512==(512
1ffa0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 61  >>8));.        a
1ffb0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
1ffc0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
1ffd0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
1ffe0 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1fff0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
20000 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a  E_SIZE<=65536);.
20010 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
20020 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
20030 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
20040 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
20050 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
20060 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54 45   if( iDc&(SQLITE
20070 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69  _IOCAP_ATOMIC|(i
20080 69 3e 3e 38 29 29 20 29 7b 0a 20 20 20 20 20 20  i>>8)) ){.      
20090 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
200a0 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20   = ii;.         
200b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
200c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
200d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
200e0 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
200f0 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
20100 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
20110 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
20120 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
20130 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
20140 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
20150 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
20160 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
20170 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
20180 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
20190 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
201a0 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
201b0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
201c0 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
201d0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
201e0 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
201f0 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
20200 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
20210 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
20220 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
20230 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
20240 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
20250 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
20260 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
20270 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
20280 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
20290 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
202a0 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
202b0 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 76 66 73   readOnly = (vfs
202c0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
202d0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 7d  N_READONLY);.  }
202e0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
202f0 77 69 6e 67 20 63 61 6c 6c 20 74 6f 20 50 61 67  wing call to Pag
20300 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29 20  erSetPagesize() 
20310 73 65 72 76 65 73 20 74 6f 20 73 65 74 20 74 68  serves to set th
20320 65 20 76 61 6c 75 65 20 6f 66 20 0a 20 20 2a 2a  e value of .  **
20330 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
20340 61 6e 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  and to allocate 
20350 74 68 65 20 50 61 67 65 72 2e 70 54 6d 70 53 70  the Pager.pTmpSp
20360 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 2a 2f  ace buffer..  */
20370 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
20390 72 74 28 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  rt( pPager->memD
203a0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  b==0 );.    rc =
203b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
203c0 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c  Pagesize(pPager,
203d0 20 26 73 7a 50 61 67 65 44 66 6c 74 2c 20 2d 31   &szPageDflt, -1
203e0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
203f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
20410 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
20420 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
20430 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
20440 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
20450 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
20460 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
20470 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
20480 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20490 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
204a0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
204b0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
204c0 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
204d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
204e0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
204f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
20500 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
20510 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
20520 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
20530 45 78 74 72 61 3c 31 30 30 30 20 29 3b 0a 20 20  Extra<1000 );.  
20540 6e 45 78 74 72 61 20 3d 20 52 4f 55 4e 44 38 28  nExtra = ROUND8(
20550 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
20560 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
20570 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
20580 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
20590 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
205a0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
205b0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
205c0 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
205d0 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
205e0 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
205f0 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
20600 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
20610 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
20620 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
20630 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
20640 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
20650 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
20660 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
20670 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
20680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
20690 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
206a0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
206b0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
206c0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
206d0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
206e0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
206f0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20700 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
20710 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
20720 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62  alid = (u8)memDb
20730 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
20740 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
20750 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
20760 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
20770 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
20780 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
20790 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
207a0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
207b0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
207c0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
207d0 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
207e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
207f0 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
20800 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
20810 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
20820 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
20830 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
20840 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
20850 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
20860 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
20870 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
20880 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
20890 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
208a0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
208b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
208c0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
208d0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
208e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
208f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
20900 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
20910 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
20920 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20930 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20940 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
20950 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
20960 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
20970 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
20980 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20  )readOnly;.  /* 
20990 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
209a0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
209b0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61  r->noSync = (pPa
209c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
209d0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31   !useJournal) ?1
209e0 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
209f0 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
20a00 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
20a10 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
20a20 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
20a30 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
20a40 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
20a50 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20a60 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
20a70 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
20a80 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
20a90 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
20aa0 72 61 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61  ra = (u16)nExtra
20ab0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
20ac0 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53  nalSizeLimit = S
20ad0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f  QLITE_DEFAULT_JO
20ae0 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54  URNAL_SIZE_LIMIT
20af0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
20b00 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
20b10 7c 20 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  | tempFile );.  
20b20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
20b30 61 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d  ager);.  if( mem
20b40 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  Db ){.    pPager
20b50 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
20b60 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20b70 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20  E_MEMORY;.  }.  
20b80 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79  /* pPager->xBusy
20b90 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
20ba0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75    /* pPager->pBu
20bb0 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 30  syHandlerArg = 0
20bc0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
20bd0 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
20be0 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
20bf0 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
20c00 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
20c10 72 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  r;.  return SQLI
20c20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  TE_OK;.}..../*.*
20c30 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20c40 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
20c50 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
20c60 6f 6d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  om PAGER_UNLOCK 
20c70 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 53 48 41 52  to.** PAGER_SHAR
20c80 45 44 20 73 74 61 74 65 2e 20 49 74 20 74 65 73  ED state. It tes
20c90 74 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ts if there is a
20ca0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 70 72 65   hot journal pre
20cb0 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65 20 66  sent in.** the f
20cc0 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74  ile-system for t
20cd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 20  he given pager. 
20ce0 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
20cf0 20 6f 6e 65 20 74 68 61 74 20 0a 2a 2a 20 6e 65   one that .** ne
20d00 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
20d10 20 62 61 63 6b 2e 20 41 63 63 6f 72 64 69 6e 67   back. According
20d20 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
20d30 6e 2c 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  n, a hot-journal
20d40 0a 2a 2a 20 66 69 6c 65 20 65 78 69 73 74 73 20  .** file exists 
20d50 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
20d60 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d 65   criteria are me
20d70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65  t:.**.**   * The
20d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
20d90 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
20da0 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a 20   system, and.** 
20db0 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20 68    * No process h
20dc0 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
20dd0 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
20de0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20df0 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a  file, and.**   *
20e00 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
20e10 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72 65  le itself is gre
20e20 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74 65  ater than 0 byte
20e30 73 20 69 6e 20 73 69 7a 65 2c 20 61 6e 64 0a 2a  s in size, and.*
20e40 2a 20 20 20 2a 20 54 68 65 20 66 69 72 73 74 20  *   * The first 
20e50 62 79 74 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  byte of the jour
20e60 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
20e70 61 6e 64 20 69 73 20 6e 6f 74 20 30 78 30 30 2e  and is not 0x00.
20e80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
20e90 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
20ea0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20eb0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
20ec0 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
20ed0 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
20ee0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
20ef0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
20f00 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
20f10 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
20f20 61 6d 65 20 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ame name. In thi
20f30 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
20f40 61 6c 20 66 69 6c 65 20 69 73 0a 2a 2a 20 6a 75  al file is.** ju
20f50 73 74 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  st deleted using
20f60 20 4f 73 44 65 6c 65 74 65 2c 20 2a 70 45 78 69   OsDelete, *pExi
20f70 73 74 73 20 69 73 20 73 65 74 20 74 6f 20 30 20  sts is set to 0 
20f80 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  and SQLITE_OK.**
20f90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
20fa0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20fb0 20 64 6f 65 73 20 6e 6f 74 20 63 68 65 63 6b 20   does not check 
20fc0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 6d 61  if there is a ma
20fd0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20fe0 65 6e 61 6d 65 0a 2a 2a 20 61 74 20 74 68 65 20  ename.** at the 
20ff0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
21000 20 49 66 20 74 68 65 72 65 20 69 73 2c 20 61 6e   If there is, an
21010 64 20 74 68 61 74 20 6d 61 73 74 65 72 20 6a 6f  d that master jo
21020 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 64 6f  urnal file.** do
21030 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
21040 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
21050 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  ile is not reall
21060 79 20 68 6f 74 2e 20 49 6e 20 74 68 69 73 0a 2a  y hot. In this.*
21070 2a 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  * case this rout
21080 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  ine will return 
21090 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65  a false-positive
210a0 2e 20 54 68 65 20 70 61 67 65 72 5f 70 6c 61 79  . The pager_play
210b0 62 61 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  back().** routin
210c0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
210d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
210e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 72 65 61   file is not rea
210f0 6c 6c 79 20 68 6f 74 20 61 6e 64 20 0a 2a 2a 20  lly hot and .** 
21100 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 69 74  will not roll it
21110 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   back. .**.** If
21120 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
21130 69 6c 65 20 69 73 20 66 6f 75 6e 64 20 74 6f 20  ile is found to 
21140 65 78 69 73 74 2c 20 2a 70 45 78 69 73 74 73 20  exist, *pExists 
21150 69 73 20 73 65 74 20 74 6f 20 31 20 61 6e 64 20  is set to 1 and 
21160 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
21170 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 20 68 6f  turned. If no ho
21180 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  t-journal file i
21190 73 20 70 72 65 73 65 6e 74 2c 20 2a 70 45 78 69  s present, *pExi
211a0 73 74 73 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  sts is.** set to
211b0 20 30 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b   0 and SQLITE_OK
211c0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
211d0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
211e0 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a   while trying.**
211f0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
21200 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 68  ether or not a h
21210 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ot-journal file 
21220 65 78 69 73 74 73 2c 20 74 68 65 20 49 4f 20 65  exists, the IO e
21230 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 69 73 20  rror.** code is 
21240 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
21250 20 76 61 6c 75 65 20 6f 66 20 2a 70 45 78 69 73   value of *pExis
21260 74 73 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ts is undefined.
21270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
21280 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
21290 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
212a0 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c  *pExists){.  sql
212b0 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
212c0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
212d0 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20  pVfs;.  int rc; 
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
21300 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 65 78  code */.  int ex
21310 69 73 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  ists;           
21320 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
21330 69 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  if a journal fil
21340 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  e is present */.
21350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21360 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
21370 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
21380 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
21390 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
213a0 3e 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  >fd) );.  assert
213b0 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  ( !isOpen(pPager
213c0 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2a 70 45  ->jfd) );..  *pE
213d0 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20  xists = 0;.  rc 
213e0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
213f0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
21400 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
21410 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
21420 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20  &exists);.  if( 
21430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21440 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 69   exists ){.    i
21450 6e 74 20 6c 6f 63 6b 65 64 3b 20 20 20 20 20 20  nt locked;      
21460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21470 75 65 20 69 66 20 73 6f 6d 65 20 70 72 6f 63 65  ue if some proce
21480 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52  ss holds a RESER
21490 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 20  VED lock */..   
214a0 20 2f 2a 20 52 61 63 65 20 63 6f 6e 64 69 74 69   /* Race conditi
214b0 6f 6e 20 68 65 72 65 3a 20 20 41 6e 6f 74 68 65  on here:  Anothe
214c0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
214d0 68 61 76 65 20 62 65 65 6e 20 68 6f 6c 64 69 6e  have been holdin
214e0 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65  g the.    ** the
214f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
21500 6e 64 20 68 61 76 65 20 61 20 6a 6f 75 72 6e 61  nd have a journa
21510 6c 20 6f 70 65 6e 20 61 74 20 74 68 65 20 73 71  l open at the sq
21520 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
21530 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62 6f  .    ** call abo
21540 76 65 2c 20 62 75 74 20 74 68 65 6e 20 64 65 6c  ve, but then del
21550 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
21560 61 6e 64 20 64 72 6f 70 20 74 68 65 20 6c 6f 63  and drop the loc
21570 6b 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  k before.    ** 
21580 77 65 20 67 65 74 20 74 6f 20 74 68 65 20 66 6f  we get to the fo
21590 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 4f  llowing sqlite3O
215a0 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
215b0 63 6b 28 29 20 63 61 6c 6c 2e 20 20 49 66 20 74  ck() call.  If t
215c0 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 68  hat.    ** is th
215d0 65 20 63 61 73 65 2c 20 74 68 69 73 20 72 6f 75  e case, this rou
215e0 74 69 6e 65 20 6d 69 67 68 74 20 74 68 69 6e 6b  tine might think
215f0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
21600 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 0a 20 20 20  journal when.   
21610 20 2a 2a 20 69 6e 20 66 61 63 74 20 74 68 65 72   ** in fact ther
21620 65 20 69 73 20 6e 6f 6e 65 2e 20 20 54 68 69 73  e is none.  This
21630 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 66 61   results in a fa
21640 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 68 69  lse-positive whi
21650 63 68 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62  ch will.    ** b
21660 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79 20  e dealt with by 
21670 74 68 65 20 70 6c 61 79 62 61 63 6b 20 72 6f 75  the playback rou
21680 74 69 6e 65 2e 20 20 54 69 63 6b 65 74 20 23 33  tine.  Ticket #3
21690 38 38 33 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  883..    */.    
216a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68  rc = sqlite3OsCh
216b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
216c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63  pPager->fd, &loc
216d0 6b 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ked);.    if( rc
216e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
216f0 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
21700 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 20 20  int nPage;..    
21710 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 73    /* Check the s
21720 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
21730 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20  ase file. If it 
21740 63 6f 6e 73 69 73 74 73 20 6f 66 20 30 20 70 61  consists of 0 pa
21750 67 65 73 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  ges,.      ** th
21760 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
21770 75 72 6e 61 6c 20 66 69 6c 65 2e 20 53 65 65 20  urnal file. See 
21780 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
21790 6e 74 20 61 62 6f 76 65 20 66 6f 72 20 0a 20 20  nt above for .  
217a0 20 20 20 20 2a 2a 20 74 68 65 20 72 65 61 73 6f      ** the reaso
217b0 6e 69 6e 67 20 68 65 72 65 2e 20 20 44 65 6c 65  ning here.  Dele
217c0 74 65 20 74 68 65 20 6f 62 73 6f 6c 65 74 65 20  te the obsolete 
217d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 75 6e 64  journal file und
217e0 65 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 52 45  er.      ** a RE
217f0 53 45 52 56 45 44 20 6c 6f 63 6b 20 74 6f 20 61  SERVED lock to a
21800 76 6f 69 64 20 72 61 63 65 20 63 6f 6e 64 69 74  void race condit
21810 69 6f 6e 73 20 61 6e 64 20 74 6f 20 61 76 6f 69  ions and to avoi
21820 64 20 76 69 6f 6c 61 74 69 6e 67 0a 20 20 20 20  d violating.    
21830 20 20 2a 2a 20 5b 48 33 33 30 32 30 5d 2e 0a 20    ** [H33020].. 
21840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
21850 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
21860 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
21870 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
21880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21890 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
218a0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
218b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
218c0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
218d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
218e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
218f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 0a 20  PAGER_RESERVED. 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 7c 7c 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  ||  sqlite3OsLoc
21920 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
21930 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d 53 51  SERVED_LOCK)==SQ
21940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
21960 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61  Delete(pVfs, pPa
21970 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30  ger->zJournal, 0
21980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
21990 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
219a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
219b0 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
219c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
219d0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
219e0 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  D ){.           
219f0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
21a00 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
21a10 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
21a20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21a40 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
21a50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
21a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21a70 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
21a80 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
21a90 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
21aa0 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
21ab0 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
21ac0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
21ad0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21ae0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
21af0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
21b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
21b10 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
21b20 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
21b30 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
21b40 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
21b50 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
21b60 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
21b70 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
21b80 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
21b90 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
21ba0 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
21bb0 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
21bc0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
21bd0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
21be0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
21bf0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
21c00 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
21c10 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
21c20 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
21c30 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
21c40 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
21c50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
21c60 3d 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 20 20 20 20 75 38 20 66 69             u8 fi
21c80 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
21c90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
21ca0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
21cb0 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
21cc0 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
21cd0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
21ce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
21cf0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
21d00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
21d10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
21d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
21d30 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
21d40 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
21d50 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
21d60 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
21d70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
21d80 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
21d90 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
21da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
21db0 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
21dc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
21dd0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
21de0 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
21df0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68          ** its h
21e00 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
21e10 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
21e20 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
21e30 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
21e40 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
21e50 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
21e60 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
21e70 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
21e80 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
21e90 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
21ea0 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
21eb0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
21ec0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
21ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
21ee0 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
21ef0 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
21f00 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
21f10 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
21f20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
21f30 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
21f40 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
21f50 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
21f60 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
21f70 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
21f80 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
21f90 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
21fa0 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
21fb0 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
21fc0 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
21fd0 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
21fe0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21ff0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
22000 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
22010 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22030 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22040 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
22050 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
22060 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66  ad the content f
22070 6f 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20  or page pPg out 
22080 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22090 66 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a  file and into .*
220a0 2a 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20  * pPg->pData. A 
220b0 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67  shared lock or g
220c0 72 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68  reater must be h
220d0 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  eld on the datab
220e0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f  ase.** file befo
220f0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
22100 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
22110 2a 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72  * If page 1 is r
22120 65 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ead, then the va
22130 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
22140 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74  ileVers[] is set
22150 20 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65   to.** the value
22160 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64   read from the d
22170 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
22180 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
22190 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
221a0 74 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20  the IO error is 
221b0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
221c0 63 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72  caller..** Other
221d0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  wise, SQLITE_OK 
221e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
221f0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
22200 62 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  bPage(PgHdr *pPg
22210 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
22220 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
22230 3b 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63  ; /* Pager objec
22240 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
22250 68 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20  h page pPg */.  
22260 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d  Pgno pgno = pPg-
22270 3e 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20  >pgno;       /* 
22280 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72  Page number to r
22290 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ead */.  int rc;
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
222c0 63 6f 64 65 20 2a 2f 0a 20 20 69 36 34 20 69 4f  code */.  i64 iO
222d0 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
222e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
222f0 66 66 73 65 74 20 6f 66 20 66 69 6c 65 20 74 6f  ffset of file to
22300 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 0a 20   read from */.. 
22310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22320 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
22330 41 52 45 44 20 26 26 20 21 4d 45 4d 44 42 20 29  ARED && !MEMDB )
22340 3b 0a 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  ;..  if( !isOpen
22350 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a  (pPager->fd) ){.
22360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22370 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
22380 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e      memset(pPg->
22390 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72  pData, 0, pPager
223a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
223b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
223c0 4b 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 73 65 74  K;.  }.  iOffset
223d0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
223e0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
223f0 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
22400 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
22410 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
22420 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22430 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66  , iOffset);.  if
22440 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
22450 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
22460 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22470 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
22480 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 75 38  gno==1 ){.    u8
22490 20 2a 64 62 46 69 6c 65 56 65 72 73 20 3d 20 26   *dbFileVers = &
224a0 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61  ((u8*)pPg->pData
224b0 29 5b 32 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  )[24];.    memcp
224c0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
224d0 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72  eVers, dbFileVer
224e0 73 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  s, sizeof(pPager
224f0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
22500 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
22510 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c  ger, pPg->pData,
22520 20 70 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53   pgno, 3, rc = S
22530 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20  QLITE_NOMEM);.. 
22540 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
22550 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
22560 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52  _count);.  PAGER
22570 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
22580 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  ead);.  IOTRACE(
22590 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c  ("PGIN %p %d\n",
225a0 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
225b0 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
225c0 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
225d0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
225f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22600 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
22610 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
22620 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22630 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
22640 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
22650 62 74 61 69 6e 20 61 20 73 68 61 72 65 64 20 6c  btain a shared l
22660 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22670 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 74 20  ase file..** It 
22680 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
22690 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  ll sqlite3PagerA
226a0 63 71 75 69 72 65 28 29 20 75 6e 74 69 6c 20 61  cquire() until a
226b0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
226c0 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 73  on.** has been s
226d0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 61 6c 6c  uccessfully call
226e0 65 64 2e 20 49 66 20 61 20 73 68 61 72 65 64 2d  ed. If a shared-
226f0 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20  lock is already 
22700 68 65 6c 64 20 77 68 65 6e 0a 2a 2a 20 74 68 69  held when.** thi
22710 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22720 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
22730 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  -op..**.** The f
22740 6f 6c 6c 6f 77 69 6e 67 20 6f 70 65 72 61 74 69  ollowing operati
22750 6f 6e 73 20 61 72 65 20 61 6c 73 6f 20 70 65 72  ons are also per
22760 66 6f 72 6d 65 64 20 62 79 20 74 68 69 73 20 66  formed by this f
22770 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
22780 20 31 29 20 49 66 20 74 68 65 20 70 61 67 65 72   1) If the pager
22790 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
227a0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74   PAGER_UNLOCK st
227b0 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68 65 6c  ate (no lock hel
227c0 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65  d.**      on the
227d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
227e0 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   then an attempt
227f0 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62 74 61   is made to obta
22800 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53 48 41  in a.**      SHA
22810 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  RED lock on the 
22820 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
22830 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
22840 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20 20 20   obtaining.**   
22850 20 20 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f     the SHARED lo
22860 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73 79 73  ck, the file-sys
22870 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64 20 66  tem is checked f
22880 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
22890 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63 68 20  ,.**      which 
228a0 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b 20 69  is played back i
228b0 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c 6c 6f  f present. Follo
228c0 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a 6f 75  wing any hot-jou
228d0 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20 72 6f  rnal .**      ro
228e0 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f 6e 74  llback, the cont
228f0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61 63 68  ents of the cach
22900 65 20 61 72 65 20 76 61 6c 69 64 61 74 65 64 20  e are validated 
22910 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 20  by checking.**  
22920 20 20 20 20 74 68 65 20 27 63 68 61 6e 67 65 2d      the 'change-
22930 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64 20 6f  counter' field o
22940 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
22950 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64 0a 2a  ile header and.*
22960 2a 20 20 20 20 20 20 64 69 73 63 61 72 64 65 64  *      discarded
22970 20 69 66 20 74 68 65 79 20 61 72 65 20 66 6f 75   if they are fou
22980 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  nd to be invalid
22990 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49 66 20  ..**.**   2) If 
229a0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
229b0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
229c0 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68 65 72  e-mode, and ther
229d0 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
229e0 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74 73 74  **      no outst
229f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
22a00 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73 2c 20  s to any pages, 
22a10 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20 65 72  and is in the er
22a20 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20 20 20  ror state,.**   
22a30 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d     then an attem
22a40 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
22a50 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
22a60 61 74 65 20 62 79 20 64 69 73 63 61 72 64 69 6e  ate by discardin
22a70 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 63 6f  g.**      the co
22a80 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
22a90 67 65 20 63 61 63 68 65 20 61 6e 64 20 72 6f 6c  ge cache and rol
22aa0 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20 6f 70  ling back any op
22ab0 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  en journal.**   
22ac0 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49     file..**.** I
22ad0 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
22ae0 64 65 73 63 72 69 62 65 64 20 62 79 20 28 32 29  described by (2)
22af0 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20 61 74   above is not at
22b00 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69 66 20  tempted, and if 
22b10 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69 73 20  the.** pager is 
22b20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
22b30 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
22b40 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20 74 68  ITE_FULL when th
22b50 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  is is called,.**
22b60 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
22b70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
22b80 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73 20 70  eturned. It is p
22b90 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65 61 64  ermitted to read
22ba0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
22bb0 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54 45 5f   when in SQLITE_
22bc0 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61 74 65  FULL error state
22bd0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
22be0 65 2c 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  e, if everything
22bf0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
22c00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
22c10 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a 2a 20  urned. If an.** 
22c20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
22c30 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 74 68  while locking th
22c40 65 20 64 61 74 61 62 61 73 65 2c 20 63 68 65 63  e database, chec
22c50 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74 2d 6a  king for a hot-j
22c60 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 6f  ournal.** file o
22c70 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
22c80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
22c90 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
22ca0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
22cb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22cc0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
22cd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
22ce0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
22d10 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72  */.  int isError
22d20 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  Reset = 0;      
22d30 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22d40 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20 66 72  if recovering fr
22d50 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65 20 2a  om error state *
22d60 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  /..  /* If this 
22d70 64 61 74 61 62 61 73 65 20 68 61 73 20 6e 6f 20  database has no 
22d80 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
22d90 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
22da0 69 73 20 69 6e 20 61 6e 20 0a 20 20 2a 2a 20 65  is in an .  ** e
22db0 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68 69 73  rror-state, this
22dc0 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 6f 20   is a chance to 
22dd0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 2e  clear the error.
22de0 20 44 69 73 63 61 72 64 20 74 68 65 20 0a 20 20   Discard the .  
22df0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
22e00 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
22e10 6e 64 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20  nd rollback any 
22e20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74  hot journal in t
22e30 68 65 0a 20 20 2a 2a 20 66 69 6c 65 2d 73 79 73  he.  ** file-sys
22e40 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tem..  */.  if( 
22e50 21 4d 45 4d 44 42 20 26 26 20 73 71 6c 69 74 65  !MEMDB && sqlite
22e60 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
22e70 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
22e80 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ==0 && pPager->e
22e90 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66  rrCode ){.    if
22ea0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
22eb0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
22ec0 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  >zJournal ){.   
22ed0 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20     isErrorReset 
22ee0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
22ef0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
22f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22f10 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
22f20 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
22f30 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73  f the pager is s
22f40 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72  till in an error
22f50 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70   state, do not p
22f60 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f  roceed. The erro
22f70 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69  r .  ** state wi
22f80 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74  ll be cleared at
22f90 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
22fa0 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61  he future when a
22fb0 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65  ll page .  ** re
22fc0 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f  ferences are dro
22fd0 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63  pped and the cac
22fe0 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72  he can be discar
22ff0 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ded..  */.  if( 
23000 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
23010 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
23020 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
23030 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
23040 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
23050 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
23060 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
23070 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72  NLOCK || isError
23080 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c  Reset ){.    sql
23090 69 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74  ite3_vfs * const
230a0 20 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e   pVfs = pPager->
230b0 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  pVfs;.    int is
230c0 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  HotJournal = 0;.
230d0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
230e0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
230f0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
23100 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
23110 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
23120 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
23130 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
23140 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
23150 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
23160 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
23170 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
231a0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
231b0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
231c0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
231d0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
231e0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
231f0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
23200 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
23210 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
23220 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
23230 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
23240 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
23250 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
23260 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
23270 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
23280 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
23290 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
232a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
232b0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
232c0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
232d0 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
232e0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
232f0 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
23300 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45   */.    if( !isE
23310 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20  rrorReset ){.   
23320 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
23330 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69  urnal(pPager, &i
23340 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sHotJournal);.  
23350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
23370 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
23380 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23390 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65 74  if( isErrorReset
233a0 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c   || isHotJournal
233b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74   ){.      /* Get
233c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
233d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
233e0 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
233f0 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
23400 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20     ** important 
23410 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44 20  that a RESERVED 
23420 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61  lock is not obta
23430 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20  ined on the way 
23440 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
23450 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
23460 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74  If it were, anot
23470 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68  her process migh
23480 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20  t open the.     
23490 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
234a0 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45  e, detect the RE
234b0 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64  SERVED lock, and
234c0 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74   conclude that t
234d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
234e0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
234f0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
23500 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
23510 20 72 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20   rolling the .  
23520 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e      ** hot-journ
23530 61 6c 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a  al back..      *
23540 2a 20 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61  * .      ** Beca
23550 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
23560 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
23570 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
23580 74 65 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a  ted, any.      *
23590 2a 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  * other process 
235a0 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63  attempting to ac
235b0 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
235c0 65 20 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20  e file will get 
235d0 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  to .      ** thi
235e0 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63  s point in the c
235f0 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20  ode and fail to 
23600 6f 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45  obtain its own E
23610 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20  XCLUSIVE lock . 
23620 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
23630 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
23640 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23650 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45   pPager->state<E
23660 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
23670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23680 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
23690 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
236a0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
236b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
236c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
236d0 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
236e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
236f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
23700 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
23710 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
23720 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
23730 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a  LUSIVE;.      }.
23740 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   .      /* Open 
23750 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
23760 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
23770 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
23780 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20  se in .      ** 
23790 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
237a0 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
237b0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
237c0 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a  e kept open and.
237d0 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c        ** possibl
237e0 79 20 75 73 65 64 20 66 6f 72 20 61 20 74 72 61  y used for a tra
237f0 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f  nsaction later o
23800 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  n. On some syste
23810 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ms, the.      **
23820 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61   OsTruncate() ca
23830 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75  ll used in exclu
23840 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
23850 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20   also requires. 
23860 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77       ** a read/w
23870 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  rite file handle
23880 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23890 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61   if( !isOpen(pPa
238a0 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
238b0 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
238c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
238d0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
238e0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
238f0 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  ,SQLITE_ACCESS_E
23900 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20  XISTS,&res);.   
23910 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23930 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
23940 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
23950 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
23960 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
23970 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
23980 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
23990 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
239a0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
239b0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
239c0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
239d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
239e0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
239f0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
23a00 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
23a10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
23a20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
23a30 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
23a40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
23a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23a70 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  & fout&SQLITE_OP
23a80 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
23aa0 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
23ab0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N;.             
23ac0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
23ad0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
23ae0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23af0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23b00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
23b10 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  he journal does 
23b20 6e 6f 74 20 65 78 69 73 74 2c 20 69 74 20 75 73  not exist, it us
23b30 75 61 6c 6c 79 20 6d 65 61 6e 73 20 74 68 61 74  ually means that
23b40 20 73 6f 6d 65 20 0a 20 20 20 20 20 20 20 20 20   some .         
23b50 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
23b60 65 63 74 69 6f 6e 20 6d 61 6e 61 67 65 64 20 74  ection managed t
23b70 6f 20 67 65 74 20 69 6e 20 61 6e 64 20 72 6f 6c  o get in and rol
23b80 6c 20 69 74 20 62 61 63 6b 20 62 65 66 6f 72 65  l it back before
23b90 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
23ba0 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
23bb0 20 6f 62 74 61 69 6e 65 64 20 74 68 65 20 65 78   obtained the ex
23bc0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 62 6f  clusive lock abo
23bd0 76 65 2e 20 4f 72 2c 20 69 74 20 0a 20 20 20 20  ve. Or, it .    
23be0 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d          ** may m
23bf0 65 61 6e 20 74 68 61 74 20 74 68 65 20 70 61 67  ean that the pag
23c00 65 72 20 77 61 73 20 69 6e 20 74 68 65 20 65 72  er was in the er
23c10 72 6f 72 2d 73 74 61 74 65 20 77 68 65 6e 20 74  ror-state when t
23c20 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
23c30 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  ** function was 
23c40 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 20 6a  called and the j
23c50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
23c60 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 2a 2f 0a   not exist.  */.
23c70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23c80 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
23c90 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30  action(pPager, 0
23ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
23cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23cc0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23ce0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
23cf0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23d00 2f 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61 72 65  /* TODO: Why are
23d10 20 74 68 65 73 65 20 63 6c 65 61 72 65 64 20 68   these cleared h
23d20 65 72 65 3f 20 49 73 20 69 74 20 6e 65 63 65 73  ere? Is it neces
23d30 73 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70  sary? */.      p
23d40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
23d50 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
23d60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23d70 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
23d80 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
23d90 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
23da0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
23db0 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50   0;. .      /* P
23dc0 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65  layback and dele
23dd0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  te the journal. 
23de0 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61   Drop the databa
23df0 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  se write.      *
23e00 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
23e10 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
23e20 63 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61  ck. Purge the ca
23e30 63 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20  che before.     
23e40 20 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   ** playing back
23e50 20 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c   the hot-journal
23e60 20 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27   so that we don'
23e70 74 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20  t end up with.  
23e80 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73      ** an incons
23e90 69 73 74 65 6e 74 20 63 61 63 68 65 2e 0a 20 20  istent cache..  
23ea0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
23eb0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
23ec0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  jfd) ){.        
23ed0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
23ee0 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
23ef0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f10 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
23f20 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
23f30 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
23f40 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
23f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23f60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
23f70 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
23f80 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
23f90 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
23fa0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
23fb0 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
23fc0 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
23fd0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
23fe0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
23ff0 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
24000 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
24010 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
24020 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
24030 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
24040 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
24050 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
24060 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
24070 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
24080 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
24090 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
240a0 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
240b0 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
240c0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
240d0 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
240e0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
240f0 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
24100 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
24110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
24120 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
24130 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
24140 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
24150 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
24160 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
24170 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
24180 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
24190 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
241a0 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
241b0 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
241c0 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
241d0 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
241e0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
241f0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
24200 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
24210 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
24220 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
24230 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
24240 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
24250 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
24260 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
24270 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
24280 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
24290 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
242a0 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
242b0 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
242c0 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
242d0 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
242e0 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
242f0 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
24300 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
24310 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
24320 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
24330 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
24340 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
24350 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
24360 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
24370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
24380 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
24390 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20  ager, 0);..     
243a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
243b0 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
243c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
243d0 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f  Code;.        go
243e0 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
243f0 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74   }..      assert
24400 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
24410 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 69  Valid );.      i
24420 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
24430 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 49  e>0 ){.        I
24440 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20  OTRACE(("CKVERS 
24450 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
24460 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
24470 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ers)));.        
24480 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
24490 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
244a0 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
244b0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 2c 20  of(dbFileVers), 
244c0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  24);.        if(
244d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
244e0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
244f0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
24500 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
24510 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64          memset(d
24520 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69  bFileVers, 0, si
24530 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
24540 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
24550 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61    if( memcmp(pPa
24560 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
24570 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a   dbFileVers, siz
24580 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
24590 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
245a0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
245b0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
245c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
245d0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
245e0 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ode || pPager->s
245f0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
24600 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66 61 69 6c  ED );.  }.. fail
24610 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
24620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
24630 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  * pager_unlock()
24640 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
24650 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61  exclusive mode a
24660 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  nd in-memory dat
24670 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70  abases. */.    p
24680 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
24690 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
246a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
246b0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
246c0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
246d0 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62 61 63 6b  d zero, rollback
246e0 20 61 6e 79 20 61 63 74 69 76 65 0a 2a 2a 20 74   any active.** t
246f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
24700 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
24710 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74 2c 20 69  .**.** Except, i
24720 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45  n locking_mode=E
24730 58 43 4c 55 53 49 56 45 20 77 68 65 6e 20 74 68  XCLUSIVE when th
24740 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
24750 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  o in.** the roll
24760 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  back journal, th
24770 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  e unlock is not 
24780 70 65 72 66 6f 72 6d 65 64 20 61 6e 64 20 74 68  performed and th
24790 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74 68 69 6e  ere is.** nothin
247a0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 73  g to rollback, s
247b0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
247c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a 73  s a no-op..*/ .s
247d0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
247e0 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50  UnlockIfUnused(P
247f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
24800 20 69 66 28 20 28 73 71 6c 69 74 65 33 50 63 61   if( (sqlite3Pca
24810 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
24820 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29  er->pPCache)==0)
24830 0a 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d  .   && (!pPager-
24840 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
24850 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
24860 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20  lOff>0) .  ){.  
24870 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
24880 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
24890 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
248a0 63 71 75 69 72 65 20 61 20 72 65 66 65 72 65 6e  cquire a referen
248b0 63 65 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ce to page numbe
248c0 72 20 70 67 6e 6f 20 69 6e 20 70 61 67 65 72 20  r pgno in pager 
248d0 70 50 61 67 65 72 20 28 61 20 70 61 67 65 0a 2a  pPager (a page.*
248e0 2a 20 72 65 66 65 72 65 6e 63 65 20 68 61 73 20  * reference has 
248f0 74 79 70 65 20 44 62 50 61 67 65 2a 29 2e 20 49  type DbPage*). I
24900 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
24910 72 65 66 65 72 65 6e 63 65 20 69 73 20 0a 2a 2a  reference is .**
24920 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 62   successfully ob
24930 74 61 69 6e 65 64 2c 20 69 74 20 69 73 20 63 6f  tained, it is co
24940 70 69 65 64 20 74 6f 20 2a 70 70 50 61 67 65 20  pied to *ppPage 
24950 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
24960 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
24970 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
24980 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
24990 6e 20 74 68 65 20 63 61 63 68 65 2c 20 69 74 20  n the cache, it 
249a0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  is returned. .**
249b0 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 6e 65   Otherwise, a ne
249c0 77 20 70 61 67 65 20 6f 62 6a 65 63 74 20 69 73  w page object is
249d0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 70   allocated and p
249e0 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 64 61  opulated with da
249f0 74 61 0a 2a 2a 20 72 65 61 64 20 66 72 6f 6d 20  ta.** read from 
24a00 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24a10 65 2e 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  e. In some cases
24a20 2c 20 74 68 65 20 70 63 61 63 68 65 20 6d 6f 64  , the pcache mod
24a30 75 6c 65 20 6d 61 79 0a 2a 2a 20 63 68 6f 6f 73  ule may.** choos
24a40 65 20 6e 6f 74 20 74 6f 20 61 6c 6c 6f 63 61 74  e not to allocat
24a50 65 20 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a  e a new page obj
24a60 65 63 74 20 61 6e 64 20 6d 61 79 20 72 65 75 73  ect and may reus
24a70 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 2a 2a  e an existing.**
24a80 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 6f 20   object with no 
24a90 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
24aa0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rences..**.** Th
24ab0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
24ac0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
24ad0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
24ae0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 74  lized to zeros t
24af0 68 65 20 0a 2a 2a 20 66 69 72 73 74 20 74 69 6d  he .** first tim
24b00 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
24b10 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20  ed into memory. 
24b20 49 66 20 74 68 65 20 70 61 67 65 20 72 65 71 75  If the page requ
24b30 65 73 74 65 64 20 69 73 20 0a 2a 2a 20 61 6c 72  ested is .** alr
24b40 65 61 64 79 20 69 6e 20 74 68 65 20 63 61 63 68  eady in the cach
24b50 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  e when this func
24b60 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
24b70 74 68 65 6e 20 74 68 65 20 65 78 74 72 61 0a 2a  then the extra.*
24b80 2a 20 64 61 74 61 20 69 73 20 6c 65 66 74 20 61  * data is left a
24b90 73 20 69 74 20 77 61 73 20 77 68 65 6e 20 74 68  s it was when th
24ba0 65 20 70 61 67 65 20 6f 62 6a 65 63 74 20 77 61  e page object wa
24bb0 73 20 6c 61 73 74 20 75 73 65 64 2e 0a 2a 2a 0a  s last used..**.
24bc0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
24bd0 73 65 20 69 6d 61 67 65 20 69 73 20 73 6d 61 6c  se image is smal
24be0 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
24bf0 75 65 73 74 65 64 20 70 61 67 65 20 6f 72 20 69  uested page or i
24c00 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  f a .** non-zero
24c10 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65 64   value is passed
24c20 20 61 73 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   as the noConten
24c30 74 20 70 61 72 61 6d 65 74 65 72 20 61 6e 64 20  t parameter and 
24c40 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65  the .** requeste
24c50 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  d page is not al
24c60 72 65 61 64 79 20 73 74 6f 72 65 64 20 69 6e 20  ready stored in 
24c70 74 68 65 20 63 61 63 68 65 2c 20 74 68 65 6e 20  the cache, then 
24c80 6e 6f 20 0a 2a 2a 20 61 63 74 75 61 6c 20 64 69  no .** actual di
24c90 73 6b 20 72 65 61 64 20 6f 63 63 75 72 73 2e 20  sk read occurs. 
24ca0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
24cb0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
24cc0 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 69 73   the .** page is
24cd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
24ce0 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a 2a 2a 0a 2a  all zeros. .**.*
24cf0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
24d00 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73  s true, it means
24d10 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
24d20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 63  care about the c
24d30 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68  ontents.** of th
24d40 65 20 70 61 67 65 2e 20 54 68 69 73 20 6f 63 63  e page. This occ
24d50 75 72 73 20 69 6e 20 74 77 6f 20 73 65 70 65 72  urs in two seper
24d60 61 74 65 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  ate scenarios:.*
24d70 2a 0a 2a 2a 20 20 20 61 29 20 57 68 65 6e 20 72  *.**   a) When r
24d80 65 61 64 69 6e 67 20 61 20 66 72 65 65 2d 6c 69  eading a free-li
24d90 73 74 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f  st leaf page fro
24da0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  m the database, 
24db0 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 57  and.**.**   b) W
24dc0 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20  hen a savepoint 
24dd0 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
24de0 62 61 63 6b 20 61 6e 64 20 77 65 20 6e 65 65 64  back and we need
24df0 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 20 20 20 20   to load.**     
24e00 20 61 20 6e 65 77 20 70 61 67 65 20 69 6e 74 6f   a new page into
24e10 20 74 68 65 20 63 61 63 68 65 20 74 6f 20 70 6f   the cache to po
24e20 70 75 6c 61 74 65 20 77 69 74 68 20 74 68 65 20  pulate with the 
24e30 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 20 20 20  data read.**    
24e40 20 20 66 72 6f 6d 20 74 68 65 20 73 61 76 65 70    from the savep
24e50 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  oint journal..**
24e60 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
24e70 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
24e80 68 65 20 64 61 74 61 20 72 65 74 75 72 6e 65 64  he data returned
24e90 20 69 73 20 7a 65 72 6f 65 64 20 69 6e 73 74 65   is zeroed inste
24ea0 61 64 20 6f 66 0a 2a 2a 20 62 65 69 6e 67 20 72  ad of.** being r
24eb0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
24ec0 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
24ed0 6c 6c 79 2c 20 74 68 65 20 62 69 74 73 20 63 6f  lly, the bits co
24ee0 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
24ef0 6f 20 70 67 6e 6f 20 69 6e 20 50 61 67 65 72 2e  o pgno in Pager.
24f00 70 49 6e 4a 6f 75 72 6e 61 6c 20 28 62 69 74 76  pInJournal (bitv
24f10 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
24f20 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
24f30 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
24f40 6c 65 29 20 61 6e 64 20 74 68 65 20 50 61 67 65  le) and the Page
24f50 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61  rSavepoint.pInSa
24f60 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73 20  vepoint bitvecs 
24f70 6f 66 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 73  of any open.** s
24f80 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 73 65  avepoints are se
24f90 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66  t. This means if
24fa0 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 64   the page is mad
24fb0 65 20 77 72 69 74 61 62 6c 65 20 61 74 20 61 6e  e writable at an
24fc0 79 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68  y.** point in th
24fd0 65 20 66 75 74 75 72 65 2c 20 75 73 69 6e 67 20  e future, using 
24fe0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
24ff0 33 50 61 67 65 72 57 72 69 74 65 28 29 2c 20 69  3PagerWrite(), i
25000 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 77  ts contents.** w
25010 69 6c 6c 20 6e 6f 74 20 62 65 20 6a 6f 75 72 6e  ill not be journ
25020 61 6c 65 64 2e 20 54 68 69 73 20 73 61 76 65 73  aled. This saves
25030 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61   IO..**.** The a
25040 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
25050 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
25060 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
25070 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
25080 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
25090 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
250a0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
250b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
250c0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
250d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
250e0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
250f0 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
25100 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
25110 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
25120 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
25130 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
25140 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
25150 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
25160 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
25170 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
25180 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
25190 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
251a0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
251b0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
251c0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
251d0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
251e0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
251f0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
25200 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
25210 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
25220 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
25230 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
25240 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
25250 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
25260 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
25270 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
25280 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
25290 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
252a0 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
252b0 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
252c0 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
252d0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
252e0 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
252f0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
25300 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
25310 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
25320 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
25330 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
25340 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
25350 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
25360 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
25370 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
25380 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
25390 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
253a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
253b0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
253c0 20 61 73 73 65 72 74 28 20 61 73 73 65 72 74 5f   assert( assert_
253d0 70 61 67 65 72 5f 73 74 61 74 65 28 70 50 61 67  pager_state(pPag
253e0 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  er) );.  assert(
253f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
25400 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
25410 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
25420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
25430 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25440 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
25450 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
25460 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72  e error state, r
25470 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 69  eturn an error i
25480 6d 6d 65 64 69 61 74 65 6c 79 2e 20 0a 20 20 2a  mmediately. .  *
25490 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 71  * Otherwise, req
254a0 75 65 73 74 20 74 68 65 20 70 61 67 65 20 66 72  uest the page fr
254b0 6f 6d 20 74 68 65 20 50 43 61 63 68 65 20 6c 61  om the PCache la
254c0 79 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  yer. */.  if( pP
254d0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
254e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
254f0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
25500 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
25510 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
25520 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Code;.  }else{. 
25530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25540 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
25550 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
25560 2c 20 31 2c 20 70 70 50 61 67 65 29 3b 0a 20 20  , 1, ppPage);.  
25570 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  }..  if( rc!=SQL
25580 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
25590 20 45 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   Either the call
255a0 20 74 6f 20 73 71 6c 69 74 65 33 50 63 61 63 68   to sqlite3Pcach
255b0 65 46 65 74 63 68 28 29 20 72 65 74 75 72 6e 65  eFetch() returne
255c0 64 20 61 6e 20 65 72 72 6f 72 20 6f 72 20 74 68  d an error or th
255d0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 77  e.    ** pager w
255e0 61 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  as already in th
255f0 65 20 65 72 72 6f 72 2d 73 74 61 74 65 20 77 68  e error-state wh
25600 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
25610 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
25620 20 2a 2a 20 53 65 74 20 70 50 67 20 74 6f 20 30   ** Set pPg to 0
25630 20 61 6e 64 20 6a 75 6d 70 20 74 6f 20 74 68 65   and jump to the
25640 20 65 78 63 65 70 74 69 6f 6e 20 68 61 6e 64 6c   exception handl
25650 65 72 2e 20 20 2a 2f 0a 20 20 20 20 70 50 67 20  er.  */.    pPg 
25660 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 70 61  = 0;.    goto pa
25670 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3b  ger_acquire_err;
25680 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
25690 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
256a0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
256b0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50 61  ( (*ppPage)->pPa
256c0 67 65 72 3d 3d 70 50 61 67 65 72 20 7c 7c 20 28  ger==pPager || (
256d0 2a 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72  *ppPage)->pPager
256e0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 2a  ==0 );..  if( (*
256f0 70 70 50 61 67 65 29 2d 3e 70 50 61 67 65 72 20  ppPage)->pPager 
25700 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
25710 73 20 63 61 73 65 20 74 68 65 20 70 63 61 63 68  s case the pcach
25720 65 20 61 6c 72 65 61 64 79 20 63 6f 6e 74 61 69  e already contai
25730 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c 69 7a 65  ns an initialize
25740 64 20 63 6f 70 79 20 6f 66 0a 20 20 20 20 2a 2a  d copy of.    **
25750 20 74 68 65 20 70 61 67 65 2e 20 52 65 74 75 72   the page. Retur
25760 6e 20 77 69 74 68 6f 75 74 20 66 75 72 74 68 65  n without furthe
25770 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20 20 20 61  r ado.  */.    a
25780 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 50 41 47  ssert( pgno<=PAG
25790 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26 26 20 70  ER_MAX_PGNO && p
257a0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
257b0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
257c0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
257d0 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
257e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
257f0 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
25800 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 63  /* The pager cac
25810 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20 61  he has created a
25820 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20 63   new page. Its c
25830 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20  ontent needs to 
25840 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69  .    ** be initi
25850 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20 20 20 20  alized.  */.    
25860 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20 20 20 50  int nMax;..    P
25870 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
25880 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
25890 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 20  g = *ppPage;.   
258a0 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
258b0 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 54  Pager;..    /* T
258c0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
258d0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
258e0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
258f0 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
25900 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72      ** number gr
25910 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
25920 20 6f 72 20 74 68 65 20 75 6e 75 73 65 64 20 6c   or the unused l
25930 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20 69 73 20  ocking-page, is 
25940 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
25950 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
25960 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
25970 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
25980 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
25990 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
259a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
259b0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
259c0 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
259d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
259e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
259f0 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
25a00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
25a20 6f 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72  oto pager_acquir
25a30 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_err;.    }..  
25a40 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
25a50 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
25a60 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20   noContent ){.  
25a70 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
25a80 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 09  ger->mxPgno ){..
25a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
25aa0 3b 0a 09 67 6f 74 6f 20 70 61 67 65 72 5f 61 63  ;..goto pager_ac
25ab0 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 20  quire_err;.     
25ac0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43   }.      if( noC
25ad0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
25ae0 20 20 2f 2a 20 46 61 69 6c 75 72 65 20 74 6f 20    /* Failure to 
25af0 73 65 74 20 74 68 65 20 62 69 74 73 20 69 6e 20  set the bits in 
25b00 74 68 65 20 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  the InJournal bi
25b10 74 2d 76 65 63 74 6f 72 73 20 69 73 20 62 65 6e  t-vectors is ben
25b20 69 67 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ign..        ** 
25b30 49 74 20 6d 65 72 65 6c 79 20 6d 65 61 6e 73 20  It merely means 
25b40 74 68 61 74 20 77 65 20 6d 69 67 68 74 20 64 6f  that we might do
25b50 20 73 6f 6d 65 20 65 78 74 72 61 20 77 6f 72 6b   some extra work
25b60 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 61 20 0a 20   to journal a . 
25b70 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74         ** page t
25b80 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
25b90 64 20 74 6f 20 62 65 20 6a 6f 75 72 6e 61 6c 65  d to be journale
25ba0 64 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73  d.  Nevertheless
25bb0 2c 20 62 65 20 73 75 72 65 20 0a 20 20 20 20 20  , be sure .     
25bc0 20 20 20 2a 2a 20 74 6f 20 74 65 73 74 20 74 68     ** to test th
25bd0 65 20 63 61 73 65 20 77 68 65 72 65 20 61 20 6d  e case where a m
25be0 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75  alloc error occu
25bf0 72 73 20 77 68 69 6c 65 20 74 72 79 69 6e 67 20  rs while trying 
25c00 74 6f 20 73 65 74 20 0a 20 20 20 20 20 20 20 20  to set .        
25c10 2a 2a 20 61 20 62 69 74 20 69 6e 20 61 20 62 69  ** a bit in a bi
25c20 74 20 76 65 63 74 6f 72 2e 0a 20 20 20 20 20 20  t vector..      
25c30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c    */.        sql
25c40 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
25c50 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
25c60 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61 67 65   if( pgno<=pPage
25c70 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 29 7b  r->dbOrigSize ){
25c80 0a 20 20 20 20 20 20 20 20 20 20 54 45 53 54 4f  .          TESTO
25c90 4e 4c 59 28 20 72 63 20 3d 20 29 20 73 71 6c 69  NLY( rc = ) sqli
25ca0 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
25cb0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
25cc0 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
25cd0 20 20 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d    testcase( rc==
25ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
25cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25d00 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20 3d    TESTONLY( rc =
25d10 20 29 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e   ) addToSavepoin
25d20 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
25d30 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
25d40 74 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51  testcase( rc==SQ
25d50 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
25d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
25d70 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
25d80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25d90 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2d       memset(pPg-
25da0 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >pData, 0, pPage
25db0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
25dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52      }.      IOTR
25dd0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
25de0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
25df0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
25e00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
25e10 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65  g->pPager==pPage
25e20 72 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r );.      rc = 
25e30 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
25e40 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
25e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25e60 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
25e70 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20  cquire_err;.    
25e80 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
25e90 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
25ea0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
25eb0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
25ec0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
25ed0 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  dif.  }..  retur
25ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
25ef0 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72 72 3a  ger_acquire_err:
25f00 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
25f10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
25f20 28 20 70 50 67 20 29 7b 0a 20 20 20 20 73 71 6c  ( pPg ){.    sql
25f30 69 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70  ite3PcacheDrop(p
25f40 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
25f50 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70  UnlockIfUnused(p
25f60 50 61 67 65 72 29 3b 0a 0a 20 20 2a 70 70 50 61  Pager);..  *ppPa
25f70 67 65 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ge = 0;.  return
25f80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
25f90 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20  quire a page if 
25fa0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  it is already in
25fb0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
25fc0 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74  ache.  Do.** not
25fd0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66   read the page f
25fe0 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72  rom disk.  Retur
25ff0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
26000 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30  he page,.** or 0
26010 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
26020 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 41 6c  not in cache. Al
26030 73 6f 2c 20 72 65 74 75 72 6e 20 30 20 69 66 20  so, return 0 if 
26040 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 20 69 73  the .** pager is
26050 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   in PAGER_UNLOCK
26060 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
26070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26080 6c 65 64 2c 0a 2a 2a 20 6f 72 20 69 66 20 74 68  led,.** or if th
26090 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e  e pager is in an
260a0 20 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68   error state oth
260b0 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46  er than SQLITE_F
260c0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
260d0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
260e0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
260f0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
26100 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
26110 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
26120 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
26130 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
26140 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
26150 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
26160 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
26170 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
26180 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
26190 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
261a0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
261b0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
261c0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
261d0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
261e0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
261f0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
26200 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
26210 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
26220 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
26230 50 67 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  Pg = 0;.  assert
26240 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
26250 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
26260 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67   );..  if( (pPag
26270 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
26280 5f 55 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28  _UNLOCK).   && (
26290 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
262a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
262b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
262c0 51 4c 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b  QLITE_FULL).  ){
262d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
262e0 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e  heFetch(pPager->
262f0 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30  pPCache, pgno, 0
26300 2c 20 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  , &pPg);.  }..  
26310 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f  return pPg;.}../
26320 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
26330 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a  age reference..*
26340 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
26350 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
26360 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
26370 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
26380 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
26390 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
263a0 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
263b0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
263c0 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
263d0 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
263e0 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
263f0 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
26400 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
26410 6d 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  moved..*/.void s
26420 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26430 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
26440 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
26450 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
26460 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
26470 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
26480 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20  lease(pPg);.    
26490 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
264a0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  sed(pPager);.  }
264b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
264c0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
264d0 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  le has already b
264e0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 65 6e 73 75  een opened, ensu
264f0 72 65 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 73  re that the.** s
26500 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
26510 69 73 20 6f 70 65 6e 20 74 6f 6f 2e 20 49 66 20  is open too. If 
26520 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
26530 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 0a 2a 2a   is not open,.**
26540 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
26550 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
26560 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26570 74 75 72 6e 65 64 20 69 66 20 65 76 65 72 79 74  turned if everyt
26580 68 69 6e 67 20 67 6f 65 73 20 61 63 63 6f 72 64  hing goes accord
26590 69 6e 67 20 74 6f 20 70 6c 61 6e 2e 20 0a 2a 2a  ing to plan. .**
265a0 20 41 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   An SQLITE_IOERR
265b0 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20  _XXX error code 
265c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
265d0 20 63 61 6c 6c 20 74 6f 20 0a 2a 2a 20 73 71 6c   call to .** sql
265e0 69 74 65 33 4f 73 4f 70 65 6e 28 29 20 66 61 69  ite3OsOpen() fai
265f0 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
26600 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  t openSubJournal
26610 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26630 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 73 4f  TE_OK;.  if( isO
26640 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26650 20 26 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67   && !isOpen(pPag
26660 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20  er->sjfd) ){.   
26670 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
26680 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
26690 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
266a0 52 59 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 75  RY || pPager->su
266b0 62 6a 49 6e 4d 65 6d 6f 72 79 20 29 7b 0a 20 20  bjInMemory ){.  
266c0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
266d0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
266e0 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c  ->sjfd);.    }el
266f0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
26700 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61  agerOpentemp(pPa
26710 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66  ger, pPager->sjf
26720 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  d, SQLITE_OPEN_S
26730 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  UBJOURNAL);.    
26740 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
26750 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
26760 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
26770 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  led at the start
26780 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65 20   of every write 
26790 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
267a0 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65 61  There must alrea
267b0 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
267c0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
267d0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
267e0 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  se .** file when
267f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
26800 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   called..**.** O
26810 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
26820 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
26830 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65 20  Pager and write 
26840 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  a journal header
26850 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72 74  .** to the start
26860 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72 65   of it. If there
26870 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76 65   are active save
26880 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65  points, open the
26890 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   sub-journal.** 
268a0 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66 75  as well. This fu
268b0 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
268c0 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  sed when the jou
268d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
268e0 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f  ng .** opened to
268f0 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61 63   write a rollbac
26900 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61 6e  k log for a tran
26910 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e  saction. It is n
26920 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e  ot used .** when
26930 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a   opening a hot j
26940 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72  ournal file to r
26950 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a  oll it back..**.
26960 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
26970 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61 64  l file is alread
26980 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d 61  y open (as it ma
26990 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69 76  y be in exclusiv
269a0 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e  e mode),.** then
269b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a   this function j
269c0 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f 75  ust writes a jou
269d0 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74  rnal header to t
269e0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
269f0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 20  ** already open 
26a00 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65  file. .**.** Whe
26a10 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
26a20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
26a30 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20 66  opened by this f
26a40 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20  unction, the.** 
26a50 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c  Pager.pInJournal
26a60 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75 72   bitvec structur
26a70 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  e is allocated..
26a80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
26a90 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
26aa0 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
26ab0 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
26ac0 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
26ad0 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61 74  _NOMEM if the at
26ae0 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74  tempt to allocat
26af0 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  e Pager.pInJourn
26b00 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a  al fails, or .**
26b10 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
26b20 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20  e if opening or 
26b30 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  writing the jour
26b40 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a  nal file fails..
26b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
26b60 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26b70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
26b80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26b90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26bb0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
26bc0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
26bd0 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
26be0 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a 20  ger->pVfs;   /* 
26bf0 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 76  Local cache of v
26c00 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20  fs pointer */.. 
26c10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
26c20 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
26c30 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
26c40 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
26c50 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
26c60 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
26c70 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a  ournal==0 );.  .
26c80 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20    /* If already 
26c90 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
26ca0 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  te, this functio
26cb0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  n is a no-op. */
26cc0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
26cd0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
26ce0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26cf0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
26d00 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61 6c  TODO: Is it real
26d10 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 67  ly possible to g
26d20 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62 53  et here with dbS
26d30 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66 20  izeValid==0? If 
26d40 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63 61  not,.  ** the ca
26d50 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65 63  ll to PagerPagec
26d60 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72 65  ount() can be re
26d70 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74 65  moved..  */.  te
26d80 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e  stcase( pPager->
26d90 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29  dbSizeValid==0 )
26da0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
26db0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
26dc0 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72 2d  , 0);..  pPager-
26dd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
26de0 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
26df0 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
26e00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
26e10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
26e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26e30 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
26e40 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
26e50 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69 74  urnal file if it
26e60 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
26e70 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20 21  open. */.  if( !
26e80 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
26e90 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
26ea0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
26eb0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26ec0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
26ed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
26ee0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
26ef0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 65  er->jfd);.    }e
26f00 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
26f10 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20 20   int flags =    
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26f30 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20 6f  * VFS flags to o
26f40 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  pen journal file
26f50 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
26f60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
26f70 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
26f80 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 28 70  EATE|.        (p
26f90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
26fa0 3f 20 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ? .          (SQ
26fb0 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
26fc0 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f  ONCLOSE|SQLITE_O
26fd0 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
26fe0 29 3a 0a 20 20 20 20 20 20 20 20 20 20 28 53 51  ):.          (SQ
26ff0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27000 4f 55 52 4e 41 4c 29 0a 20 20 20 20 20 20 20 20  OURNAL).        
27010 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
27020 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
27030 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d 20  RITE.      rc = 
27040 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70  sqlite3JournalOp
27050 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70 56  en(.          pV
27060 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
27070 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
27080 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75  d, flags, jrnlBu
27090 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29  fferSize(pPager)
270a0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a  .      );.#else.
270b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
270c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
270d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
270e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c   pPager->jfd, fl
270f0 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ags, 0);.#endif.
27100 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
27110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27120 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  || isOpen(pPager
27130 2d 3e 6a 66 64 29 20 29 3b 0a 20 20 7d 0a 0a 0a  ->jfd) );.  }...
27140 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
27150 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
27160 64 65 72 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  der to the journ
27170 61 6c 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e  al file and open
27180 20 0a 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a   .  ** the sub-j
27190 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
271a0 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ary..  */.  if( 
271b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
271c0 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68  .    /* TODO: Ch
271d0 65 63 6b 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  eck if all of th
271e0 65 73 65 20 61 72 65 20 72 65 61 6c 6c 79 20 72  ese are really r
271f0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
27200 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
27210 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
27220 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
27230 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
27240 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
27250 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
27260 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
27270 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
27280 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
27290 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74  .    pPager->set
272a0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
272b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
272c0 64 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  dr = 0;.    rc =
272d0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
272e0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
272f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27300 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 53 61  K && pPager->nSa
27310 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 72  vepoint ){.    r
27320 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e  c = openSubJourn
27330 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  al(pPager);.  }.
27340 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27350 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
27360 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
27370 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
27380 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72  nal);.    pPager
27390 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->pInJournal = 0
273a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
273b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  c;.}../*.** Begi
273c0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
273d0 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 70 65  ction on the spe
273e0 63 69 66 69 65 64 20 70 61 67 65 72 20 6f 62 6a  cified pager obj
273f0 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a 20 77 72  ect. If a .** wr
27400 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
27410 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
27420 20 6f 70 65 6e 65 64 2c 20 74 68 69 73 20 66 75   opened, this fu
27430 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
27440 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
27450 65 78 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  exFlag argument 
27460 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61  is false, then a
27470 63 71 75 69 72 65 20 61 74 20 6c 65 61 73 74 20  cquire at least 
27480 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  a RESERVED.** lo
27490 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
274a0 73 65 20 66 69 6c 65 2e 20 49 66 20 65 78 46 6c  se file. If exFl
274b0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
274c0 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61 73   acquire at leas
274d0 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55 53 49 56  t.** an EXCLUSIV
274e0 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75 63 68 20  E lock. If such 
274f0 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  a lock is alread
27500 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f 63 6b 69  y held, no locki
27510 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  ng .** functions
27520 20 6e 65 65 64 20 62 65 20 63 61 6c 6c 65 64 2e   need be called.
27530 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69  .**.** If this i
27540 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
27550 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66  y or in-memory f
27560 69 6c 65 20 61 6e 64 2c 20 74 68 65 20 6a 6f 75  ile and, the jou
27570 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 2a 2a  rnal file is .**
27580 20 6f 70 65 6e 65 64 20 69 66 20 69 74 20 68 61   opened if it ha
27590 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 72 65 61  s not been alrea
275a0 64 79 2e 20 46 6f 72 20 61 20 74 65 6d 70 6f 72  dy. For a tempor
275b0 61 72 79 20 66 69 6c 65 2c 20 74 68 65 20 6f 70  ary file, the op
275c0 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20 74 68 65  ening .** of the
275d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
275e0 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
275f0 74 68 65 72 65 20 69 73 20 61 6e 20 61 63 74 75  there is an actu
27600 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a 2a 20 77  al need to .** w
27610 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
27620 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68 79 20 68  nal. TODO: Why h
27630 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61 72 79 20  andle temporary 
27640 66 69 6c 65 73 20 64 69 66 66 65 72 65 6e 74 6c  files differentl
27650 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y?.**.** If the 
27660 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
27670 6f 70 65 6e 65 64 20 28 6f 72 20 69 66 20 69 74  opened (or if it
27680 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
27690 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 6a 6f 75  ), then a.** jou
276a0 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77  rnal-header is w
276b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
276c0 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a 0a 2a 2a  art of it..**.**
276d0 20 49 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65   If the subjInMe
276e0 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73  mory argument is
276f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
27700 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  any sub-journal 
27710 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74 68 69 6e  opened.** within
27720 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
27730 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  n will be opened
27740 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
27750 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 68   file. This.** h
27760 61 73 20 6e 6f 20 65 66 66 65 63 74 20 69 66 20  as no effect if 
27770 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
27780 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
27790 64 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20  d (as it may be 
277a0 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  when.** running 
277b0 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
277c0 65 29 20 6f 72 20 69 66 20 74 68 65 20 74 72 61  e) or if the tra
277d0 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  nsaction does no
277e0 74 20 72 65 71 75 69 72 65 20 61 0a 2a 2a 20 73  t require a.** s
277f0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  ub-journal. If t
27800 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  he subjInMemory 
27810 61 72 67 75 6d 65 6e 74 20 69 73 20 7a 65 72 6f  argument is zero
27820 2c 20 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69  , then any requi
27830 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e  red.** sub-journ
27840 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  al is implemente
27850 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 66 20 70  d in-memory if p
27860 50 61 67 65 72 20 69 73 20 61 6e 20 69 6e 2d 6d  Pager is an in-m
27870 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20  emory database, 
27880 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20 61 20 74  .** or using a t
27890 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6f 74  emporary file ot
278a0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20  herwise..*/.int 
278b0 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
278c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
278d0 20 69 6e 74 20 65 78 46 6c 61 67 2c 20 69 6e 74   int exFlag, int
278e0 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 7b 0a   subjInMemory){.
278f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
27900 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
27910 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
27920 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
27930 20 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d   pPager->subjInM
27940 65 6d 6f 72 79 20 3d 20 28 75 38 29 73 75 62 6a  emory = (u8)subj
27950 49 6e 4d 65 6d 6f 72 79 3b 0a 20 20 69 66 28 20  InMemory;.  if( 
27960 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
27970 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
27980 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
27990 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
279a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
279b0 21 4d 45 4d 44 42 20 26 26 20 21 70 50 61 67 65  !MEMDB && !pPage
279c0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 0a  r->tempFile );..
279d0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20      /* Obtain a 
279e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
279f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
27a00 6c 65 2e 20 49 66 20 74 68 65 20 65 78 46 6c 61  le. If the exFla
27a10 67 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  g parameter.    
27a20 2a 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ** is true, then
27a30 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67   immediately upg
27a40 72 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20  rade this to an 
27a50 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
27a60 54 68 65 0a 20 20 20 20 2a 2a 20 62 75 73 79 2d  The.    ** busy-
27a70 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
27a80 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
27a90 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20 74  n upgrading to t
27aa0 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20 20  he EXCLUSIVE.   
27ab0 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f   ** lock, but no
27ac0 74 20 77 68 65 6e 20 6f 62 74 61 69 6e 69 6e 67  t when obtaining
27ad0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
27ae0 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ck..    */.    r
27af0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
27b00 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
27b10 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
27b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
27b40 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27b50 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
27b60 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b     if( exFlag ){
27b70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
27b80 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
27b90 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
27ba0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
27bb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
27bc0 49 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20  If the required 
27bd0 6c 6f 63 6b 73 20 77 65 72 65 20 73 75 63 63 65  locks were succe
27be0 73 73 66 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64  ssfully obtained
27bf0 2c 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , open the journ
27c00 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  al.    ** file a
27c10 6e 64 20 77 72 69 74 65 20 74 68 65 20 66 69 72  nd write the fir
27c20 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
27c30 72 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  r to it..    */.
27c40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
27c50 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
27c60 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20  >useJournal.    
27c70 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
27c80 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
27c90 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
27ca0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
27cb0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
27cc0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
27cd0 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
27ce0 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27cf0 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  fd) && pPager->j
27d00 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
27d10 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
27d20 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61 67  ens when the pag
27d30 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73  er was in exclus
27d40 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
27d50 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  the last.    ** 
27d60 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
27d70 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
27d80 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
27d90 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
27da0 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
27db0 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
27dc0 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
27dd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
27de0 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
27df0 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65  t open and eithe
27e00 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  r was truncated 
27e10 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69 74  to 0 bytes or it
27e20 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20 20  s header was.   
27e30 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20   ** overwritten 
27e40 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20  with zeros..    
27e50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
27e60 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29  Pager->nRec==0 )
27e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
27e80 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
27e90 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
27ea0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
27eb0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
27ec0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
27ed0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
27ee0 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41  .  }..  PAGERTRA
27ef0 43 45 28 28 22 54 52 41 4e 53 41 43 54 49 4f 4e  CE(("TRANSACTION
27f00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
27f10 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
27f20 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 50 61  ert( !isOpen(pPa
27f30 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61  ger->jfd) || pPa
27f40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
27f50 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  0 || rc!=SQLITE_
27f60 4f 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OK );.  if( rc!=
27f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27f80 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
27f90 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a  ->dbModified );.
27fa0 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e      /* Ignore an
27fb0 79 20 49 4f 20 65 72 72 6f 72 20 74 68 61 74 20  y IO error that 
27fc0 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 70 61  occurs within pa
27fd0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
27fe0 69 6f 6e 28 29 2e 20 54 68 65 0a 20 20 20 20 2a  ion(). The.    *
27ff0 2a 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 69  * purpose of thi
28000 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 72 65 73  s call is to res
28010 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  et the internal 
28020 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
28030 65 72 0a 20 20 20 20 2a 2a 20 73 75 62 2d 73 79  er.    ** sub-sy
28040 73 74 65 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74  stem. It doesn't
28050 20 6d 61 74 74 65 72 20 69 66 20 74 68 65 20 6a   matter if the j
28060 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
28070 6f 74 20 70 72 6f 70 65 72 6c 79 0a 20 20 20 20  ot properly.    
28080 2a 2a 20 66 69 6e 61 6c 69 7a 65 64 20 61 74 20  ** finalized at 
28090 74 68 69 73 20 70 6f 69 6e 74 20 28 73 69 6e 63  this point (sinc
280a0 65 20 69 74 20 69 73 20 6e 6f 74 20 61 20 76 61  e it is not a va
280b0 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
280c0 20 61 6e 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f   anyway)..    */
280d0 0a 20 20 20 20 70 61 67 65 72 5f 65 6e 64 5f 74  .    pager_end_t
280e0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
280f0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  r, 0);.  }.  ret
28100 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28110 20 4d 61 72 6b 20 61 20 73 69 6e 67 6c 65 20 64   Mark a single d
28120 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
28130 65 61 62 6c 65 2e 20 54 68 65 20 70 61 67 65 20  eable. The page 
28140 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
28150 74 68 65 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75  the .** main jou
28160 72 6e 61 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72  rnal or sub-jour
28170 6e 61 6c 20 61 73 20 72 65 71 75 69 72 65 64 2e  nal as required.
28180 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
28190 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
281a0 6f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  one of the journ
281b0 61 6c 73 2c 20 74 68 65 20 63 6f 72 72 65 73 70  als, the corresp
281c0 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
281d0 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67  t in the .** Pag
281e0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
281f0 74 76 65 63 20 61 6e 64 20 74 68 65 20 50 61 67  tvec and the Pag
28200 65 72 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53  erSavepoint.pInS
28210 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65 63 73  avepoint bitvecs
28220 0a 2a 2a 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20  .** of any open 
28230 73 61 76 65 70 6f 69 6e 74 73 20 61 73 20 61 70  savepoints as ap
28240 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
28250 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
28260 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67 29  rite(PgHdr *pPg)
28270 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20  {.  void *pData 
28280 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20  = pPg->pData;.  
28290 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
282a0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
282b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
282c0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
282d0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
282e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
282f0 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
28300 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
28310 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
28320 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
28330 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
28340 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
28350 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
28360 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
28370 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
28380 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
28390 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
283a0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
283b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
283c0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
283d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
283e0 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
283f0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
28400 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
28410 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
28420 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e   if( pageInJourn
28430 61 6c 28 70 50 67 29 20 26 26 20 21 73 75 62 6a  al(pPg) && !subj
28440 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
28450 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
28460 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
28470 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
28480 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
28490 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
284a0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
284b0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
284c0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
284d0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
284e0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
284f0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
28500 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
28510 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
28520 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
28530 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
28540 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
28550 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
28560 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
28570 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
28580 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
28590 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
285a0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
285b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
285c0 67 69 6e 28 70 50 61 67 65 72 2c 20 30 2c 20 70  gin(pPager, 0, p
285d0 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d  Pager->subjInMem
285e0 6f 72 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ory);.    if( rc
285f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28600 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
28610 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28620 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
28630 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
28640 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f 70  );.    if( !isOp
28650 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
28660 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
28670 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20  urnal.          
28680 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
28690 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
286a0 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b  URNALMODE_OFF ){
286b0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
286c0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
286d0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
286e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
286f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28700 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64   }.    pPager->d
28710 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20  bModified = 1;. 
28720 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
28730 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
28740 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
28750 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
28760 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
28770 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
28780 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
28790 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
287a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
287b0 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
287c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
287d0 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
287e0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
287f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
28800 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
28810 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  g) && isOpen(pPa
28820 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20  ger->jfd) ){.   
28830 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
28840 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  <=pPager->dbOrig
28850 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
28860 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20  u32 cksum;.     
28870 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b     char *pData2;
28880 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20  ..        /* We 
28890 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
288a0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
288b0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
288c0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
288d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
288e0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
288f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
28900 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
28910 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
28920 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
28930 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
28940 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
28950 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
28960 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50 61        CODEC2(pPa
28970 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
28980 3e 70 67 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e  >pgno, 7, return
28990 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
289a0 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
289b0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
289c0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
289d0 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
289e0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
289f0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
28a00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28a10 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
28a20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
28a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28a40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28a50 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
28a60 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
28a70 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28a80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28ab0 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
28ac0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28ad0 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
28ae0 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
28af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
28b00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28b20 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
28b30 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
28b40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
28b50 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
28b60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
28b70 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
28b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
28b90 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
28ba0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
28bb0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
28bc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28bd0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
28be0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
28bf0 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
28c00 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
28c10 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
28c20 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
28c30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
28c40 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
28c50 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
28c60 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
28c70 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
28c80 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
28c90 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
28ca0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
28cb0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
28cc0 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
28cd0 61 67 65 68 61 73 68 28 70 50 67 29 29 29 3b 0a  agehash(pPg)));.
28ce0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e  .        /* Even
28cf0 20 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73   if an IO or dis
28d00 6b 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75  kfull error occu
28d10 72 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e  rred while journ
28d20 61 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  alling the.     
28d30 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
28d40 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73  e block above, s
28d50 65 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63  et the need-sync
28d60 20 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61   flag for the pa
28d70 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ge..        ** O
28d80 74 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74  therwise, when t
28d90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
28da0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74  s rolled back, t
28db0 68 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20  he logic in.    
28dc0 20 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f      ** playback_
28dd0 6f 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20  one_page() will 
28de0 74 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70  think that the p
28df0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  age needs to be 
28e00 72 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20  restored.       
28e10 20 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62   ** in the datab
28e20 61 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66  ase file. And if
28e30 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
28e40 75 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20  urs while doing 
28e50 73 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  so,.        ** t
28e60 68 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d  hen corruption m
28e70 61 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20  ay follow..     
28e80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28e90 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
28ea0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  c ){.          p
28eb0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
28ec0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
28ed0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28ee0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
28ef0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
28f00 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
28f10 20 6f 63 63 75 72 72 65 64 20 77 72 69 74 69 6e   occurred writin
28f20 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
28f30 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
28f40 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
28f50 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
28f60 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
28f70 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
28f80 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
28f90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28fa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
28fb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
28fc0 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
28fd0 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
28fe0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
28ff0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
29000 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
29010 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
29020 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
29030 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  rnal, pPg->pgno)
29040 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
29050 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
29060 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
29070 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
29080 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c  TE_OK || rc==SQL
29090 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
290a0 20 20 20 20 20 72 63 20 7c 3d 20 61 64 64 54 6f       rc |= addTo
290b0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
290c0 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
290d0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
290e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
290f0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
29100 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
29110 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
29120 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
29130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
29140 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
29150 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
29160 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
29170 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
29180 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
29190 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
291a0 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  _SYNC;.         
291b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
291c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
291d0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
291e0 41 43 45 28 28 22 41 50 50 45 4e 44 20 25 64 20  ACE(("APPEND %d 
291f0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
29200 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
29210 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
29220 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
29230 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
29240 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26     ((pPg->flags&
29250 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
29260 3f 31 3a 30 29 29 29 3b 0a 20 20 20 20 20 20 7d  ?1:0)));.      }
29270 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
29280 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
29290 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
292a0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
292b0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
292c0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
292d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
292e0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
292f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
29300 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
29310 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
29320 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
29330 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
29340 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
29350 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
29360 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
29370 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
29380 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
29390 20 20 20 69 66 28 20 73 75 62 6a 52 65 71 75 69     if( subjRequi
293a0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
293b0 20 20 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f        rc = subjo
293c0 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
293d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
293e0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
293f0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
29400 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
29410 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
29420 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
29430 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
29440 3e 64 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e  >dbSize<pPg->pgn
29450 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
29460 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
29470 67 6e 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  gno;.  }.  retur
29480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
29490 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
294a0 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
294b0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
294c0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
294d0 20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e   .** making chan
294e0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54  ges to a page. T
294f0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
29500 68 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20  heck the return 
29510 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69  value .** of thi
29520 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62  s function and b
29530 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
29540 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
29550 20 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a   data unless .**
29560 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
29570 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
29580 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
29590 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
295a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
295b0 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
295c0 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
295d0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
295e0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
295f0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
29600 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
29610 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
29620 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
29630 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
29640 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
29650 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
29660 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
29670 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
29680 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
29690 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
296a0 6f 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54  or occurs, SQLIT
296b0 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
296c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
296d0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70  eturned.** as ap
296e0 70 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72  propriate. Other
296f0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
29700 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29710 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
29720 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
29730 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
29740 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
29750 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
29760 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29770 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
29780 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
29790 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
297a0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
297b0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
297c0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
297d0 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
297e0 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
297f0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
29800 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
29810 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
29820 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
29830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29840 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
29850 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
29860 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
29870 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29890 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
298a0 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
298b0 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
298c0 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
298d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
298e0 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
298f0 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20     int needSync 
29900 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
29910 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65  True if any page
29920 20 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f   has PGHDR_NEED_
29930 53 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  SYNC */..    /* 
29940 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
29950 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
29960 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
29970 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
29980 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
29990 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
299a0 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
299b0 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
299c0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
299d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
299e0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
299f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
29a00 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
29a10 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
29a20 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
29a30 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
29a40 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
29a50 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
29a60 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
29a70 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
29a80 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
29a90 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
29aa0 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
29ab0 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
29ac0 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
29ad0 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
29ae0 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
29af0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
29b00 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
29b10 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
29b20 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
29b30 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29b40 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
29b50 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43  , (int *)&nPageC
29b60 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ount);.    if( p
29b70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
29b80 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
29b90 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
29ba0 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
29bb0 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
29bc0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
29bd0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
29be0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29bf0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
29c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
29c10 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
29c20 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
29c30 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
29c40 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
29c50 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
29c60 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
29c70 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
29c80 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
29c90 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
29ca0 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
29cb0 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
29cc0 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
29cd0 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
29ce0 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
29cf0 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
29d00 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
29d10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
29d20 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
29d30 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
29d40 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
29d50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29d60 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
29d70 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
29d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
29d90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29da0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29db0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
29dc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29dd0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
29de0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
29df0 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
29e00 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
29e10 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
29e20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
29e30 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
29e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29e50 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
29e60 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
29e70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29e80 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
29e90 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
29ea0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
29eb0 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
29ec0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29ed0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
29ee0 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
29ef0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
29f00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29f10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
29f20 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
29f30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
29f40 20 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52   /* If the PGHDR
29f50 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20  _NEED_SYNC flag 
29f60 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f  is set for any o
29f70 66 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65  f the nPage page
29f80 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69  s .    ** starti
29f90 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20  ng at pg1, then 
29fa0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
29fb0 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  et for all of th
29fc0 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20  em. Because.    
29fd0 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  ** writing to an
29fe0 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65  y of these nPage
29ff0 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67   pages may damag
2a000 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68  e the others, th
2a010 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
2a020 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61   file must conta
2a030 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69  in sync()ed copi
2a040 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65  es of all of the
2a050 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  m.    ** before 
2a060 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20  any of them can 
2a070 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  be written out t
2a080 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2a090 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
2a0a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a0b0 4b 20 26 26 20 6e 65 65 64 53 79 6e 63 20 29 7b  K && needSync ){
2a0c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
2a0d0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
2a0e0 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  >noSync==0 );.  
2a0f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2a100 3c 6e 50 61 67 65 20 26 26 20 6e 65 65 64 53 79  <nPage && needSy
2a110 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nc; ii++){.     
2a120 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 20     PgHdr *pPage 
2a130 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
2a140 50 61 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a  Pager, pg1+ii);.
2a150 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2a160 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e ){.          p
2a170 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
2a180 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2a190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2a1a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
2a1b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2a1c0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2a1d0 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
2a1e0 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
2a1f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2a200 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
2a210 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
2a220 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
2a230 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
2a240 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
2a250 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
2a260 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
2a270 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2a280 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74   page given in t
2a290 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20  he argument was 
2a2a0 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65  previously passe
2a2b0 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50  d.** to sqlite3P
2a2c0 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e  agerWrite().  In
2a2d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
2a2e0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
2a2f0 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
2a300 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
2a310 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23  f the page..*/.#
2a320 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e  ifndef NDEBUG.in
2a330 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
2a340 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65  writeable(DbPage
2a350 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2a360 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
2a370 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69  R_DIRTY;.}.#endi
2a380 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  f../*.** A call 
2a390 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
2a3a0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
2a3b0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
2a3c0 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
2a3d0 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
2a3e0 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67  tion on page pPg
2a3f0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73   back to the dis
2a400 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a  k, even though.*
2a410 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68  * that page migh
2a420 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64  t be marked as d
2a430 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70  irty.  This happ
2a440 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
2a450 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61  , when.** the pa
2a460 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65  ge has been adde
2a470 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74  d as a leaf of t
2a480 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20  he freelist and 
2a490 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e  so its.** conten
2a4a0 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74  t no longer matt
2a4b0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  ers..**.** The o
2a4c0 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
2a4d0 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
2a4e0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2a4f0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
2a500 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
2a510 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
2a520 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
2a530 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
2a540 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
2a550 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
2a560 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
2a570 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
2a580 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
2a590 61 74 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75  ation can quadru
2a5a0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
2a5b0 20 6c 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54   large .** DELET
2a5c0 45 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f  E operations..*/
2a5d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
2a5e0 65 72 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64  erDontWrite(PgHd
2a5f0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
2a600 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
2a610 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70  pPager;.  if( (p
2a620 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
2a630 44 49 52 54 59 29 20 26 26 20 70 50 61 67 65 72  DIRTY) && pPager
2a640 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20  ->nSavepoint==0 
2a650 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  ){.    PAGERTRAC
2a660 45 28 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E(("DONT_WRITE p
2a670 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
2a680 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
2a690 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2a6a0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
2a6b0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
2a6c0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
2a6d0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
2a6e0 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  |= PGHDR_DONT_WR
2a6f0 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ITE;.#ifdef SQLI
2a700 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
2a710 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
2a720 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
2a730 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
2a740 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2a750 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a760 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
2a770 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
2a780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
2a790 2a 2a 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  ** change-counte
2a7a0 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 34  r, stored as a 4
2a7b0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2a7c0 20 69 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e   integer startin
2a7d0 67 20 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66  g at .** byte of
2a7e0 66 73 65 74 20 32 34 20 6f 66 20 74 68 65 20 70  fset 24 of the p
2a7f0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  ager file..**.**
2a800 20 49 66 20 74 68 65 20 69 73 44 69 72 65 63 74   If the isDirect
2a810 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74   flag is zero, t
2a820 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65  hen this is done
2a830 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20   by calling .** 
2a840 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a850 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74  e() on page 1, t
2a860 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  hen modifying th
2a870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a880 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20  e.** page data. 
2a890 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2a8a0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70   file will be up
2a8b0 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20 63  dated when the c
2a8c0 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  urrent.** transa
2a8d0 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74  ction is committ
2a8e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  ed..**.** The is
2a8f0 44 69 72 65 63 74 20 66 6c 61 67 20 6d 61 79 20  Direct flag may 
2a900 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f  only be non-zero
2a910 20 69 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   if the library 
2a920 77 61 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20  was compiled.** 
2a930 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
2a940 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
2a950 49 54 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65  ITE macro define
2a960 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  d. In this case,
2a970 0a 2a 2a 20 69 66 20 69 73 44 69 72 65 63 74 20  .** if isDirect 
2a980 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2a990 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a9a0 69 6c 65 20 69 73 20 75 70 64 61 74 65 64 20 64  ile is updated d
2a9b0 69 72 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72  irectly.** by wr
2a9c0 69 74 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64  iting an updated
2a9d0 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65   version of page
2a9e0 20 31 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20   1 using a call 
2a9f0 74 6f 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  to the .** sqlit
2aa00 65 33 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63  e3OsWrite() func
2aa10 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
2aa20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
2aa30 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
2aa40 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
2aa50 69 73 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20  isDirectMode){. 
2aa60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2aa70 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61  _OK;..  /* Decla
2aa80 72 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  re and initializ
2aa90 65 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  e constant integ
2aaa0 65 72 20 27 69 73 44 69 72 65 63 74 27 2e 20 49  er 'isDirect'. I
2aab0 66 20 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69  f the.  ** atomi
2aac0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
2aad0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20  tion is enabled 
2aae0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74  in this build, t
2aaf0 68 65 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a  hen isDirect.  *
2ab00 2a 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  * is initialized
2ab10 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
2ab20 73 73 65 64 20 61 73 20 74 68 65 20 69 73 44 69  ssed as the isDi
2ab30 72 65 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74  rectMode paramet
2ab40 65 72 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  er.  ** to this 
2ab50 66 75 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77  function. Otherw
2ab60 69 73 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ise, it is alway
2ab70 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20  s set to zero.. 
2ab80 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65   **.  ** The ide
2ab90 61 20 69 73 20 74 68 61 74 20 69 66 20 74 68 65  a is that if the
2aba0 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70   atomic-write op
2abb0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f  timization is no
2abc0 74 0a 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61  t.  ** enabled a
2abd0 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
2abe0 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e  the compiler can
2abf0 20 6f 6d 69 74 20 74 68 65 20 74 65 73 74 73 20   omit the tests 
2ac00 6f 66 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63  of.  ** 'isDirec
2ac10 74 27 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c  t' below, as wel
2ac20 6c 20 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65  l as the block e
2ac30 6e 63 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20  nclosed in the. 
2ac40 20 2a 2a 20 22 69 66 28 20 69 73 44 69 72 65 63   ** "if( isDirec
2ac50 74 20 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a  t )" condition..
2ac60 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2ac70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2ac80 43 5f 57 52 49 54 45 0a 20 20 63 6f 6e 73 74 20  C_WRITE.  const 
2ac90 69 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20 30  int isDirect = 0
2aca0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 69  ;.  assert( isDi
2acb0 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20  rectMode==0 );. 
2acc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2acd0 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b  R(isDirectMode);
2ace0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
2acf0 6e 74 20 69 73 44 69 72 65 63 74 20 3d 20 69 73  nt isDirect = is
2ad00 44 69 72 65 63 74 4d 6f 64 65 3b 0a 23 65 6e 64  DirectMode;.#end
2ad10 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
2ad20 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
2ad30 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
2ad40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
2ad50 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
2ad60 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
2ad70 30 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  0 ){.    PgHdr *
2ad80 70 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20  pPgHdr;         
2ad90 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65         /* Refere
2ada0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
2adb0 0a 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f  .    u32 change_
2adc0 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20  counter;        
2add0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
2ade0 6c 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f  lue of change-co
2adf0 75 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a  unter field */..
2ae00 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
2ae10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26  ger->tempFile &&
2ae20 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2ae30 66 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f  fd) );..    /* O
2ae40 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
2ae50 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
2ae60 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
2ae70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2ae80 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
2ae90 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dr);.    assert(
2aea0 20 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63   pPgHdr==0 || rc
2aeb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
2aec0 20 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f      /* If page o
2aed0 6e 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73  ne was fetched s
2aee0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64  uccessfully, and
2aef0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2af00 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65  s not.    ** ope
2af10 72 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74  rating in direct
2af20 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65  -mode, make page
2af30 20 31 20 77 72 69 74 61 62 6c 65 2e 0a 20 20 20   1 writable..   
2af40 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
2af50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73  SQLITE_OK && !is
2af60 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Direct ){.      
2af70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2af80 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
2af90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
2afa0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2afb0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
2afc0 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
2afd0 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
2afe0 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
2aff0 20 32 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68   24. */.      ch
2b000 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
2b010 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
2b020 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
2b030 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63  leVers);.      c
2b040 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
2b050 0a 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73  .      put32bits
2b060 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d  (((char*)pPgHdr-
2b070 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e  >pData)+24, chan
2b080 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20  ge_counter);..  
2b090 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2b0a0 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2b0b0 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2b0c0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2b0d0 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2b0e0 20 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63       if( isDirec
2b0f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t ){.        con
2b100 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20  st void *zBuf = 
2b110 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20  pPgHdr->pData;. 
2b120 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2b130 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
2b140 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  e>0 );.        r
2b150 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
2b160 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a  te(pPager->fd, z
2b170 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
2b180 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20  eSize, 0);.     
2b190 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2b1a0 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65  everything worke
2b1b0 64 2c 20 73 65 74 20 74 68 65 20 63 68 61 6e 67  d, set the chang
2b1c0 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 2e  eCountDone flag.
2b1d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
2b1e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b1f0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63         pPager->c
2b200 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
2b210 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2b220 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
2b230 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
2b240 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
2b250 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2b260 50 67 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65  PgHdr);.  }.  re
2b270 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b280 2a 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72  * Sync the pager
2b290 20 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54   file to disk. T
2b2a0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  his is a no-op f
2b2b0 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c  or in-memory fil
2b2c0 65 73 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77  es.** or pages w
2b2d0 69 74 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f  ith the Pager.no
2b2e0 53 79 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a  Sync flag set..*
2b2f0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2b300 75 6c 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e  ul, or called on
2b310 20 61 20 70 61 67 65 72 20 66 6f 72 20 77 68 69   a pager for whi
2b320 63 68 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  ch it is a no-op
2b330 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
2b340 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
2b350 45 5f 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c  E_OK. Otherwise,
2b360 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2b370 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
2b380 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b390 65 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50  erSync(Pager *pP
2b3a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b3d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2b3e0 20 20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70    if( MEMDB || p
2b3f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2b400 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2b410 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2b420 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b430 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2b440 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2b450 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ags);.  }.  retu
2b460 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b470 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
2b480 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
2b490 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
2b4a0 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
2b4b0 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
2b4c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2b4d0 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
2b4e0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
2b4f0 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
2b500 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
2b510 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
2b520 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
2b530 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
2b540 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
2b550 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
2b560 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
2b570 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
2b580 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
2b590 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  at:.**.**   * Th
2b5a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2b5b0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2b5c0 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20  s updated,.**   
2b5d0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
2b5e0 20 73 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20   synced (unless 
2b5f0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2b600 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73   optimization is
2b610 20 75 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61   used),.**   * a
2b620 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 61  ll dirty pages a
2b630 72 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  re written to th
2b640 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2b650 20 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74   .**   * the dat
2b660 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 72  abase file is tr
2b670 75 6e 63 61 74 65 64 20 28 69 66 20 72 65 71 75  uncated (if requ
2b680 69 72 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20  ired), and.**   
2b690 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
2b6a0 69 6c 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a  ile synced. .**.
2b6b0 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
2b6c0 67 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  g that remains t
2b6d0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
2b6e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66  nsaction is to f
2b6f0 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c  inalize .** (del
2b700 65 74 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72  ete, truncate or
2b710 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
2b720 70 61 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75  part of) the jou
2b730 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a  rnal file (or .*
2b740 2a 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * delete the mas
2b750 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
2b760 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
2b770 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
2b780 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
2b790 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
2b7a0 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
2b7b0 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
2b7c0 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
2b7d0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
2b7e0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a  seOne() call..**
2b7f0 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c  .** If the final
2b800 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53   parameter - noS
2b810 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74  ync - is true, t
2b820 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
2b830 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20   file itself.** 
2b840 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54  is not synced. T
2b850 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63  he caller must c
2b860 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
2b870 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20  Sync() directly 
2b880 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64  to.** sync the d
2b890 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66  atabase file bef
2b8a0 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d  ore calling Comm
2b8b0 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20  itPhaseTwo() to 
2b8c0 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  delete the.** jo
2b8d0 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68  urnal file in th
2b8e0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  is case..*/.int 
2b8f0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2b900 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61  itPhaseOne(.  Pa
2b910 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
2b920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b930 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f   Pager object */
2b940 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b950 4d 61 73 74 65 72 2c 20 20 20 20 20 20 20 20 20  Master,         
2b960 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c     /* If not NUL
2b970 4c 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  L, the master jo
2b980 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
2b990 69 6e 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20  int noSync      
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9b0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
2b9c0 74 68 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65  the xSync on the
2b9d0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20   db file */.){. 
2b9e0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b9f0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2ba00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2ba10 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  */..  if( pPager
2ba20 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
2ba30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2ba40 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
2ba50 50 41 47 45 52 54 52 41 43 45 28 28 22 44 41 54  PAGERTRACE(("DAT
2ba60 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
2ba70 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
2ba80 53 69 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  Size=%d\n", .   
2ba90 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
2baa0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70  name, zMaster, p
2bab0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b  Pager->dbSize));
2bac0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
2bad0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
2bae0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
2baf0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2bb00 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
2bb10 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
2bb20 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
2bb30 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
2bb40 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45  p..  */.  if( ME
2bb50 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
2bb60 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20  bModified ){.   
2bb70 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65   sqlite3BackupRe
2bb80 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42  start(pPager->pB
2bb90 61 63 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20  ackup);.  }else 
2bba0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2bbb0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
2bbc0 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  && pPager->dbMod
2bbd0 69 66 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a  ified ){..    /*
2bbe0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bbf0 6c 6f 63 6b 20 75 70 64 61 74 65 73 20 74 68 65  lock updates the
2bc00 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e   change-counter.
2bc10 20 45 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a   Exactly how it.
2bc20 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
2bc30 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
2bc40 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
2bc50 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
2bc60 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2bc70 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20   was enabled at 
2bc80 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e  compile time, an
2bc90 64 20 69 66 20 74 68 69 73 20 74 72 61 6e 73 61  d if this transa
2bca0 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20  ction meets the 
2bcb0 0a 20 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20  .    ** runtime 
2bcc0 63 72 69 74 65 72 69 61 20 74 6f 20 75 73 65 20  criteria to use 
2bcd0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a  the operation: .
2bce0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2bcf0 20 2a 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74   * The file-syst
2bd00 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20  em supports the 
2bd10 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f  atomic-write pro
2bd20 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a  perty for.    **
2bd30 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20        blocks of 
2bd40 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20  size page-size, 
2bd50 61 6e 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a  and .    **    *
2bd60 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
2bd70 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
2bd80 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
2bd90 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
2bda0 20 20 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e      * Exactly on
2bdb0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2bdc0 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
2bdd0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
2bde0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
2bdf0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
2be00 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f  imization was no
2be10 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  t enabled at com
2be20 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20  pile time, then 
2be30 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  the.    ** pager
2be40 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2be50 74 65 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ter() function i
2be60 73 20 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61  s called to upda
2be70 74 65 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20  te the change.  
2be80 20 20 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20    ** counter in 
2be90 27 69 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e  'indirect-mode'.
2bea0 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
2beb0 74 69 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64  tion is compiled
2bec0 20 69 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69   in but.    ** i
2bed0 73 20 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65  s not applicable
2bee0 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63   to this transac
2bef0 74 69 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74  tion, call sqlit
2bf00 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28  e3JournalCreate(
2bf10 29 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  ).    ** to make
2bf20 20 73 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61   sure the journa
2bf30 6c 20 66 69 6c 65 20 68 61 73 20 61 63 74 75 61  l file has actua
2bf40 6c 6c 79 20 62 65 65 6e 20 63 72 65 61 74 65 64  lly been created
2bf50 2c 20 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20  , then call.    
2bf60 2a 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ** pager_incr_ch
2bf70 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2bf80 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2bf90 67 65 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e  ge-counter in in
2bfa0 64 69 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f  direct.    ** mo
2bfb0 64 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  de. .    **.    
2bfc0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
2bfd0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2bfe0 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65  n is both enable
2bff0 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65  d and applicable
2c000 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61  ,.    ** then ca
2c010 6c 6c 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  ll pager_incr_ch
2c020 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f  angecounter() to
2c030 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
2c040 67 65 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a  ge-counter.    *
2c050 2a 20 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f  * in 'direct' mo
2c060 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2c070 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2c080 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a  e will never be.
2c090 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66      ** created f
2c0a0 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
2c0b0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64  ion..    */.#ifd
2c0c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2c0d0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
2c0e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2c0f0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
2c100 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
2c110 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2c120 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2c130 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
2c140 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20     if( !zMaster 
2c150 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  && isOpen(pPager
2c160 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20  ->jfd) .     && 
2c170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c180 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69  ff==jrnlBufferSi
2c190 7a 65 28 70 50 61 67 65 72 29 20 0a 20 20 20 20  ze(pPager) .    
2c1a0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
2c1b0 7a 65 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69  ze>=pPager->dbFi
2c1c0 6c 65 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28  leSize.     && (
2c1d0 30 3d 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65  0==(pPg = sqlite
2c1e0 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74  3PcacheDirtyList
2c1f0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
2c200 29 29 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44  )) || 0==pPg->pD
2c210 69 72 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20  irty).    ){.   
2c220 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2c230 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
2c240 63 6f 75 6e 74 65 72 20 76 69 61 20 74 68 65 20  counter via the 
2c250 64 69 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74  direct-write met
2c260 68 6f 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20  hod. The .      
2c270 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  ** following cal
2c280 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68  l will modify th
2c290 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
2c2a0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
2c2b0 67 65 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74  ge 1 .      ** t
2c2c0 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
2c2d0 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75  dated change cou
2c2e0 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
2c2f0 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20  ite page 1 .    
2c300 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
2c310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c320 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74  le. Because of t
2c330 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
2c340 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72  .      ** proper
2c350 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
2c360 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73  ile-system, this
2c370 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20   is safe..      
2c380 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  */.      rc = pa
2c390 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
2c3a0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31  ounter(pPager, 1
2c3b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2c3c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c3d0 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50  JournalCreate(pP
2c3e0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
2c3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c400 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2c410 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2c420 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2c430 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ger, 0);.      }
2c440 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
2c450 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
2c460 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
2c470 50 61 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69  Pager, 0);.#endi
2c480 66 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  f.    if( rc!=SQ
2c490 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2c4a0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2c4b0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  exit;..    /* If
2c4c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2c4d0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
2c4e0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
2c4f0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
2c500 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
2c510 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
2c520 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
2c530 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2c540 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
2c550 69 6c 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ile. This can on
2c560 6c 79 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74  ly happen in aut
2c570 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20  o-vacuum mode.. 
2c580 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66     **.    ** Bef
2c590 6f 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  ore reading the 
2c5a0 70 61 67 65 73 20 77 69 74 68 20 70 61 67 65 20  pages with page 
2c5b0 6e 75 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74  numbers larger t
2c5c0 68 61 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  han the .    ** 
2c5d0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
2c5e0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73   Pager.dbSize, s
2c5f0 65 74 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74  et dbSize back t
2c600 6f 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  o the value.    
2c610 2a 2a 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20  ** that it took 
2c620 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2c630 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
2c640 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a   Otherwise, the.
2c650 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20      ** calls to 
2c660 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2c670 29 20 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20  ) return zeroed 
2c680 70 61 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66  pages instead of
2c690 20 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67   .    ** reading
2c6a0 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
2c6b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2c6c0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2c6d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2c6e0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2c6f0 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65  er->dbSize<pPage
2c700 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20  r->dbOrigSize.  
2c710 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2c720 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2c730 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2c740 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 50   .    ){.      P
2c750 67 6e 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20  gno i;          
2c760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c770 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2c780 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2c790 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e  .      const Pgn
2c7a0 6f 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  o iSkip = PAGER_
2c7b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
2c7c0 20 2f 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b   /* Pending lock
2c7d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 63   page */.      c
2c7e0 6f 6e 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65  onst Pgno dbSize
2c7f0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
2c800 65 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  e;       /* Data
2c810 62 61 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20  base image size 
2c820 2a 2f 20 0a 20 20 20 20 20 20 70 50 61 67 65 72  */ .      pPager
2c830 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
2c840 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20  r->dbOrigSize;. 
2c850 20 20 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69       for( i=dbSi
2c860 7a 65 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  ze+1; i<=pPager-
2c870 3e 64 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b  >dbOrigSize; i++
2c880 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2c890 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
2c8a0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
2c8b0 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d  urnal, i) && i!=
2c8c0 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20  iSkip ){.       
2c8d0 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c8f0 50 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  Page to journal 
2c900 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
2c910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
2c920 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
2c930 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2c940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c950 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
2c960 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2c970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2c980 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2c990 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2c9a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
2c9b0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
2c9c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2c9d0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2c9e0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
2c9f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
2ca00 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20  .      } .      
2ca10 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
2ca20 20 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 23   dbSize;.    }.#
2ca30 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
2ca40 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ite the master j
2ca50 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
2ca60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2ca70 65 2e 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a  e. If a master .
2ca80 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
2ca90 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
2caa0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
2cab0 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2cac0 20 66 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20 6f   file, .    ** o
2cad0 72 20 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20  r if zMaster is 
2cae0 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20  NULL (no master 
2caf0 6a 6f 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74  journal), then t
2cb00 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
2cb10 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  -op..    */.    
2cb20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
2cb30 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
2cb40 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66  zMaster);.    if
2cb50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cb60 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2cb70 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20  ase_one_exit;.. 
2cb80 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a     /* Sync the j
2cb90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
2cba0 74 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74  the atomic-updat
2cbb0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2cbc0 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75  s being.    ** u
2cbd0 73 65 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77  sed, this call w
2cbe0 69 6c 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74  ill not create t
2cbf0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2cc00 6f 72 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20  or perform any. 
2cc10 20 20 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20     ** real IO.. 
2cc20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2cc30 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
2cc40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2cc50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2cc60 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e   commit_phase_on
2cc70 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20  e_exit;..    /* 
2cc80 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
2cc90 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
2cca0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
2ccb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
2ccc0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c  ite_pagelist(sql
2ccd0 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c  ite3PcacheDirtyL
2cce0 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ist(pPager->pPCa
2ccf0 63 68 65 29 29 3b 0a 20 20 20 20 69 66 28 20 72  che));.    if( r
2cd00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2cd10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2cd20 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  !=SQLITE_IOERR_B
2cd30 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20  LOCKED );.      
2cd40 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2cd50 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20  e_one_exit;.    
2cd60 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  }.    sqlite3Pca
2cd70 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
2cd80 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
2cd90 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
2cda0 65 20 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74  e on disk is not
2cdb0 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
2cdc0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  s the database i
2cdd0 6d 61 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  mage,.    ** the
2cde0 6e 20 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e  n use pager_trun
2cdf0 63 61 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20  cate to grow or 
2ce00 73 68 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20  shrink the file 
2ce10 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  here..    */.   
2ce20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2ce30 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46  ize!=pPager->dbF
2ce40 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
2ce50 20 50 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61   Pgno nNew = pPa
2ce60 67 65 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70  ger->dbSize - (p
2ce70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
2ce80 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2ce90 67 65 72 29 29 3b 0a 20 20 20 20 20 20 61 73 73  ger));.      ass
2cea0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2ceb0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
2cec0 49 56 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  IVE );.      rc 
2ced0 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
2cee0 28 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a  (pPager, nNew);.
2cef0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2cf00 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2cf10 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2cf20 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  exit;.    }..   
2cf30 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e   /* Finally, syn
2cf40 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
2cf50 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
2cf60 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
2cf70 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  && !noSync ){.  
2cf80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2cf90 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
2cfa0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
2cfb0 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20  flags);.    }.  
2cfc0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
2cfd0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
2cfe0 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ))..    pPager->
2cff0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
2d000 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69  NCED;.  }..commi
2d010 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2d020 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
2d030 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
2d040 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
2d050 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
2d060 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70  ter() may attemp
2d070 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65  t to obtain an e
2d080 78 63 6c 75 73 69 76 65 0a 20 20 20 20 2a 2a 20  xclusive.    ** 
2d090 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68  lock to spill th
2d0a0 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74 75  e cache and retu
2d0b0 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  rn IOERR_BLOCKED
2d0c0 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20  . But since .   
2d0d0 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20   ** there is no 
2d0e0 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68 65  chance the cache
2d0f0 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   is inconsistent
2d100 2c 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 62  , it is.    ** b
2d110 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  etter to return 
2d120 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
2d130 20 2a 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51   **/.    rc = SQ
2d140 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
2d150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2d160 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
2d170 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2d180 65 64 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ed, the database
2d190 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
2d1a0 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64  ompletely.** upd
2d1b0 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20  ated to reflect 
2d1c0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
2d1d0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
2d1e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a  transaction and.
2d1f0 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  ** synced to dis
2d200 6b 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  k. The journal f
2d210 69 6c 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73  ile still exists
2d220 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
2d230 74 65 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20  tem .** though, 
2d240 61 6e 64 20 69 66 20 61 20 66 61 69 6c 75 72 65  and if a failure
2d250 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
2d260 70 6f 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76  point it will ev
2d270 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75  entually.** be u
2d280 73 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  sed as a hot-jou
2d290 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72  rnal and the cur
2d2a0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
2d2b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
2d2c0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d2d0 6e 20 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20  n finalizes the 
2d2e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69  journal file, ei
2d2f0 74 68 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67  ther by deleting
2d300 2c 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67  , .** truncating
2d310 20 6f 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65   or partially ze
2d320 72 6f 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61  roing it, so tha
2d330 74 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75  t it cannot be u
2d340 73 65 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d  sed .** for hot-
2d350 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2d360 2e 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64  . Once this is d
2d370 6f 6e 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  one the transact
2d380 69 6f 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f  ion is.** irrevo
2d390 63 61 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e  cably committed.
2d3a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2d3b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f  or occurs, an IO
2d3c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2d3d0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2d3e0 70 61 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69  pager.** moves i
2d3f0 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74  nto the error st
2d400 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
2d410 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2d420 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
2d430 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2d440 50 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a  PhaseTwo(Pager *
2d450 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2d460 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d480 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2d490 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70  /..  /* Do not p
2d4a0 72 6f 63 65 65 64 20 69 66 20 74 68 65 20 70 61  roceed if the pa
2d4b0 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 69  ger is already i
2d4c0 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  n the error stat
2d4d0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
2d4e0 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
2d4f0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
2d500 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a  ->errCode;.  }..
2d510 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2d520 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
2d530 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70   called if the p
2d540 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61  ager is not in a
2d550 74 20 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47  t least.  ** PAG
2d560 45 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74  ER_RESERVED stat
2d570 65 2e 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51  e. And indeed SQ
2d580 4c 69 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20  Lite never does 
2d590 74 68 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a  this. But it is.
2d5a0 20 20 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76    ** nice to hav
2d5b0 65 20 74 68 69 73 20 64 65 66 65 6e 73 69 76 65  e this defensive
2d5c0 20 62 6c 6f 63 6b 20 68 65 72 65 20 61 6e 79 77   block here anyw
2d5d0 61 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e  ay..  */.  if( N
2d5e0 45 56 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61  EVER(pPager->sta
2d5f0 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
2d600 44 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  D) ){.    return
2d610 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2d620 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69   }..  /* An opti
2d630 6d 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65  mization. If the
2d640 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f   database was no
2d650 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66  t actually modif
2d660 69 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20  ied during.  ** 
2d670 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
2d680 2c 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  , the pager is r
2d690 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
2d6a0 69 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a  ive-mode and is.
2d6b0 20 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69    ** using persi
2d6c0 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20  stent journals, 
2d6d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
2d6e0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
2d6f0 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61   **.  ** The sta
2d700 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
2d710 6c 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  l file currently
2d720 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
2d730 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  le journal .  **
2d740 20 68 65 61 64 65 72 20 77 69 74 68 20 74 68 65   header with the
2d750 20 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74 20   nRec field set 
2d760 74 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61 20  to 0. If such a 
2d770 6a 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20  journal is used 
2d780 61 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f  as.  ** a hot-jo
2d790 75 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74  urnal during hot
2d7a0 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63  -journal rollbac
2d7b0 6b 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c  k, 0 changes wil
2d7c0 6c 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74  l be made.  ** t
2d7d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2d7e0 69 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73  ile. So there is
2d7f0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f   no need to zero
2d800 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
2d810 2a 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65  ** header. Since
2d820 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
2d830 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c   exclusive mode,
2d840 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
2d850 64 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61  d.  ** to drop a
2d860 6e 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e  ny locks either.
2d870 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2d880 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
2d890 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  0 && pPager->exc
2d8a0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
2d8b0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
2d8c0 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
2d8d0 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
2d8e0 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
2d8f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
2d900 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
2d910 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
2d920 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d930 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
2d940 45 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54  ERTRACE(("COMMIT
2d950 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
2d960 70 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73  pPager)));.  ass
2d970 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
2d980 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
2d990 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50   || MEMDB || !pP
2d9a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
2d9b0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
2d9c0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2d9d0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
2d9e0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
2d9f0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
2da00 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
2da10 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
2da20 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68   all changes. Th
2da30 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
2da40 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
2da50 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  HARED mode..**.*
2da60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2da70 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73  performs two tas
2da80 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49  ks:.**.**   1) I
2da90 74 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  t rolls back the
2daa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72   journal file, r
2dab0 65 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74  estoring all dat
2dac0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a  abase file and .
2dad0 2a 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72  **      in-memor
2dae0 79 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f  y cache pages to
2daf0 20 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20   the state they 
2db00 77 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65  were in when the
2db10 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
2db20 20 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c       was opened,
2db30 20 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20   and.**   2) It 
2db40 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
2db50 75 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74  urnal file, so t
2db60 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73  hat it is not us
2db70 65 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20  ed for hot.**   
2db80 20 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61     rollback at a
2db90 6e 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  ny point in the 
2dba0 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75  future..**.** su
2dbb0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c  bject to the fol
2dbc0 6c 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61  lowing qualifica
2dbd0 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49  tions:.**.** * I
2dbe0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
2dbf0 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
2dc00 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  en when this fun
2dc10 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
2dc20 0a 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20  .**   then only 
2dc30 28 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64  (2) is performed
2dc40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2dc50 68 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e  here is no journ
2dc60 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20  al file.**   to 
2dc70 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  roll back..**.**
2dc80 20 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f   * If in an erro
2dc90 72 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68  r state other th
2dca0 61 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  an SQLITE_FULL, 
2dcb0 74 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73  then task (1) is
2dcc0 20 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64   .**   performed
2dcd0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
2dce0 20 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72   task (2). Regar
2dcf0 64 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74  dless of the out
2dd00 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74  come.**   of eit
2dd10 68 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73  her, the error s
2dd20 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  tate error code 
2dd30 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
2dd40 68 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28  he caller.**   (
2dd50 69 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49  i.e. either SQLI
2dd60 54 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49  TE_IOERR or SQLI
2dd70 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
2dd80 2a 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65  ** * If the page
2dd90 72 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45  r is in PAGER_RE
2dda0 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
2ddb0 65 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20  en attempt (1). 
2ddc0 57 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20  Whether.**   or 
2ddd0 6e 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 75  not (1) is succu
2dde0 73 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65  ssful, also atte
2ddf0 6d 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63  mpt (2). If succ
2de00 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
2de10 2a 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f  *   SQLITE_OK. O
2de20 74 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20  therwise, enter 
2de30 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20  the error state 
2de40 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66  and return the f
2de50 69 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72  irst .**   error
2de60 20 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65   code encountere
2de70 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  d. .**.**   In t
2de80 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
2de90 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74  s no chance that
2dea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2deb0 73 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a  s written to. .*
2dec0 2a 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74  *   So is safe t
2ded0 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a  o finalize the j
2dee0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e  ournal file even
2def0 20 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b   if the playback
2df00 20 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f   .**   (operatio
2df10 6e 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77  n 1) failed. How
2df20 65 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d  ever the pager m
2df30 75 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72  ust enter the er
2df40 72 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61  ror state.**   a
2df50 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
2df60 66 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  f the in-memory 
2df70 63 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75  cache are now su
2df80 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46  spect..**.** * F
2df90 69 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41  inally, if in PA
2dfa0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74  GER_EXCLUSIVE st
2dfb0 61 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70  ate, then attemp
2dfc0 74 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20  t (1). Only.**  
2dfd0 20 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20   attempt (2) if 
2dfe0 28 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75  (1) is successfu
2dff0 6c 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  l. Return SQLITE
2e000 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
2e010 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73  l,.**   otherwis
2e020 65 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  e enter the erro
2e030 72 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75  r state and retu
2e040 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
2e050 65 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20  e from the .**  
2e060 20 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69   failing operati
2e070 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74  on..**.**   In t
2e080 68 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74  his case the dat
2e090 61 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68  abase file may h
2e0a0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
2e0b0 20 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a   to. So if the.*
2e0c0 2a 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65  *   playback ope
2e0d0 72 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73  ration did not s
2e0e0 75 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20  ucceed it would 
2e0f0 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66  not be safe to f
2e100 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65  inalize.**   the
2e110 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
2e120 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65  t needs to be le
2e130 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
2e140 79 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a  ystem so that.**
2e150 20 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72     some other pr
2e160 6f 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74  ocess can use it
2e170 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
2e180 64 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28  database state (
2e190 62 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72  by.**   hot-jour
2e1a0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a  nal rollback)..*
2e1b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2e1c0 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
2e1d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2e1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e200 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2e210 20 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45   */.  PAGERTRACE
2e220 28 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  (("ROLLBACK %d\n
2e230 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
2e240 72 29 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61  r)));.  if( !pPa
2e250 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2e260 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
2e270 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
2e280 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
2e290 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2e2a0 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
2e2b0 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
2e2c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
2e2d0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
2e2e0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
2e2f0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
2e300 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2e310 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
2e320 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
2e330 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
2e340 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
2e350 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
2e360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
2e370 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2e380 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2e390 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
2e3a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2e3b0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
2e3c0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
2e3d0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
2e3e0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
2e3f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
2e400 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
2e410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e420 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
2e430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2e440 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e450 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e460 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
2e470 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
2e480 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
2e490 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
2e4a0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
2e4b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2e4c0 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
2e4d0 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
2e4e0 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
2e4f0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
2e500 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
2e510 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
2e520 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
2e530 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
2e540 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
2e550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2e560 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
2e570 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
2e580 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2e590 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
2e5a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2e5b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
2e5c0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
2e5d0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
2e5e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
2e5f0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
2e600 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
2e610 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
2e620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2e630 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2e640 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
2e650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2e660 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
2e670 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2e680 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
2e690 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
2e6a0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e6b0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
2e6c0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
2e6d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e6f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e700 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e710 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
2e720 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2e730 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
2e740 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
2e750 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e760 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
2e770 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
2e780 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e790 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2e7a0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2e7b0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
2e7c0 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
2e7d0 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
2e7e0 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
2e7f0 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
2e800 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
2e810 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
2e820 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
2e830 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
2e840 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2e850 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
2e860 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
2e870 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
2e880 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
2e890 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
2e8a0 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
2e8b0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
2e8c0 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
2e8d0 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
2e8e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
2e8f0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
2e900 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
2e910 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
2e920 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
2e930 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
2e940 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
2e950 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
2e960 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
2e970 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
2e980 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
2e990 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
2e9a0 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn a;.}.#endif..
2e9b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2e9c0 65 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  e if this is an 
2e9d0 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e  in-memory pager.
2e9e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2e9f0 61 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65  agerIsMemdb(Page
2ea00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
2ea10 74 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f  turn MEMDB;.}../
2ea20 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20  *.** Check that 
2ea30 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
2ea40 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
2ea50 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49  vepoints open. I
2ea60 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63  f there are.** c
2ea70 75 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68  urrently less th
2ea80 61 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f  an nSavepoints o
2ea90 70 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f  pen, then open o
2eaa0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
2eab0 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65  oints.** to make
2eac0 20 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e   up the differen
2ead0 63 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65  ce. If the numbe
2eae0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
2eaf0 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71  is already.** eq
2eb00 75 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e  ual to nSavepoin
2eb10 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  t, then this fun
2eb20 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2eb30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
2eb40 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
2eb50 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
2eb60 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
2eb70 49 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  If an error .** 
2eb80 6f 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65  occurs while ope
2eb90 6e 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75  ning the sub-jou
2eba0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
2ebb0 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
2ebc0 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e   is.** returned.
2ebd0 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
2ebe0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TE_OK..*/.int sq
2ebf0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
2ec00 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
2ec10 50 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65  Pager, int nSave
2ec20 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
2ec30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
2ec40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec50 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2ec60 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72  de */.  int nCur
2ec70 72 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e  rent = pPager->n
2ec80 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20  Savepoint;      
2ec90 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d    /* Current num
2eca0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
2ecb0 73 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76  s */..  if( nSav
2ecc0 65 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20  epoint>nCurrent 
2ecd0 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
2ece0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  urnal ){.    int
2ecf0 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   ii;            
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed10 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2ed20 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2ed30 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
2ed40 2a 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *aNew;          
2ed50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
2ed60 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
2ed70 20 61 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20 2f   array */..    /
2ed80 2a 20 45 69 74 68 65 72 20 74 68 65 72 65 20 69  * Either there i
2ed90 73 20 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75 72  s no active jour
2eda0 6e 61 6c 20 6f 72 20 74 68 65 20 73 75 62 2d 6a  nal or the sub-j
2edb0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f  ournal is open o
2edc0 72 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f  r .    ** the jo
2edd0 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20  urnal is always 
2ede0 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79  stored in memory
2edf0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2ee00 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
2ee10 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e 28  nt==0 || isOpen(
2ee20 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c  pPager->sjfd) ||
2ee30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
2ee40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
2ee50 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
2ee60 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20  ODE_MEMORY );.. 
2ee70 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50     /* Grow the P
2ee80 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
2ee90 61 72 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c  array using real
2eea0 6c 6f 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51  loc(). Return SQ
2eeb0 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a  LITE_NOMEM.    *
2eec0 2a 20 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  * if the allocat
2eed0 69 6f 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72  ion fails. Other
2eee0 77 69 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e  wise, zero the n
2eef0 65 77 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61  ew portion in ca
2ef00 73 65 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c  se a .    ** mal
2ef10 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
2ef20 72 73 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74  rs while populat
2ef30 69 6e 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f  ing it in the fo
2ef40 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f  r(...) loop belo
2ef50 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e  w..    */.    aN
2ef60 65 77 20 3d 20 28 50 61 67 65 72 53 61 76 65 70  ew = (PagerSavep
2ef70 6f 69 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65  oint *)sqlite3Re
2ef80 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
2ef90 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2efa0 74 2c 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53  t, sizeof(PagerS
2efb0 61 76 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70  avepoint)*nSavep
2efc0 6f 69 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  oint.    );.    
2efd0 69 66 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20  if( !aNew ){.   
2efe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2eff0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2f000 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e    memset(&aNew[n
2f010 43 75 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53  Current], 0, (nS
2f020 61 76 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e  avepoint-nCurren
2f030 74 29 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65  t) * sizeof(Page
2f040 72 53 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20  rSavepoint));.  
2f050 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70    pPager->aSavep
2f060 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20  oint = aNew;.   
2f070 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
2f080 69 6e 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74  int = nSavepoint
2f090 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  ;..    /* Popula
2f0a0 74 65 20 74 68 65 20 50 61 67 65 72 53 61 76 65  te the PagerSave
2f0b0 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
2f0c0 20 6a 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e   just allocated.
2f0d0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e   */.    for(ii=n
2f0e0 43 75 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76  Current; ii<nSav
2f0f0 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
2f100 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
2f110 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
2f120 20 29 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69   );.      aNew[i
2f130 69 5d 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65  i].nOrig = pPage
2f140 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
2f150 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
2f160 65 72 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67  er->jfd) && pPag
2f170 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
2f180 20 29 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77   ){.        aNew
2f190 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70  [ii].iOffset = p
2f1a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2f1b0 66 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  f;.      }else{.
2f1c0 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d          aNew[ii]
2f1d0 2e 69 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e  .iOffset = JOURN
2f1e0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
2f1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f200 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65   aNew[ii].iSubRe
2f210 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62  c = pPager->nSub
2f220 52 65 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  Rec;.      aNew[
2f230 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
2f240 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
2f250 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64  Create(pPager->d
2f260 62 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  bSize);.      if
2f270 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
2f280 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
2f290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f2a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2f2b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
2f2c0 70 65 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  pen the sub-jour
2f2d0 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  nal, if it is no
2f2e0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  t already opened
2f2f0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70  . */.    rc = op
2f300 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
2f310 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ger);.  }..  ret
2f320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f330 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2f340 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c  s called to roll
2f350 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
2f360 28 63 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70  (commit) a savep
2f370 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76  oint..** The sav
2f380 65 70 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73  epoint to releas
2f390 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65  e or rollback ne
2f3a0 65 64 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f  ed not be the mo
2f3b0 73 74 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20  st recently .** 
2f3c0 63 72 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e  created savepoin
2f3d0 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  t..**.** Paramet
2f3e0 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
2f3f0 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
2f400 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
2f410 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
2f420 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
2f430 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
2f440 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
2f450 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
2f460 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
2f470 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
2f480 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
2f490 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
2f4a0 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
2f4b0 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
2f4c0 61 76 65 20 6f 63 63 75 72 72 65 64 20 73 69 6e  ave occurred sin
2f4d0 63 65 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ce the specified
2f4e0 20 73 61 76 65 70 6f 69 6e 74 20 77 61 73 20 63   savepoint was c
2f4f0 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reated..**.** Th
2f500 65 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72  e savepoint to r
2f510 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65 61  ollback or relea
2f520 73 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  se is identified
2f530 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a   by parameter .*
2f540 2a 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 41 20  * iSavepoint. A 
2f550 76 61 6c 75 65 20 6f 66 20 30 20 6d 65 61 6e 73  value of 0 means
2f560 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
2f570 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76  he outermost sav
2f580 65 70 6f 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66  epoint.** (the f
2f590 69 72 73 74 20 63 72 65 61 74 65 64 29 2e 20 41  irst created). A
2f5a0 20 76 61 6c 75 65 20 6f 66 20 28 50 61 67 65 72   value of (Pager
2f5b0 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d  .nSavepoint-1) m
2f5c0 65 61 6e 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20  eans operate.** 
2f5d0 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
2f5e0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 73 61 76  ntly created sav
2f5f0 65 70 6f 69 6e 74 2e 20 49 66 20 69 53 61 76 65  epoint. If iSave
2f600 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
2f610 20 74 68 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e   than.** (Pager.
2f620 6e 53 61 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74  nSavepoint-1), t
2f630 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2f640 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
2f650 0a 2a 2a 20 49 66 20 61 20 6e 65 67 61 74 69 76  .** If a negativ
2f660 65 20 76 61 6c 75 65 20 69 73 20 70 61 73 73 65  e value is passe
2f670 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
2f680 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  on, then the cur
2f690 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
2f6a0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
2f6b0 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
2f6c0 65 72 65 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67  erent to calling
2f6d0 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
2f6e0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 63 61  rRollback() beca
2f6f0 75 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  use this functio
2f700 6e 20 64 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69  n does not termi
2f710 6e 61 74 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e  nate.** the tran
2f720 73 61 63 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63  saction or unloc
2f730 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
2f740 69 74 20 6a 75 73 74 20 72 65 73 74 6f 72 65 73  it just restores
2f750 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
2f760 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2f770 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
2f780 6c 20 73 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20  l state. .**.** 
2f790 49 6e 20 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c  In any case, all
2f7a0 20 73 61 76 65 70 6f 69 6e 74 73 20 77 69 74 68   savepoints with
2f7b0 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
2f7c0 72 20 74 68 61 6e 20 69 53 61 76 65 70 6f 69 6e  r than iSavepoin
2f7d0 74 20 0a 2a 2a 20 61 72 65 20 64 65 73 74 72 6f  t .** are destro
2f7e0 79 65 64 2e 20 49 66 20 74 68 69 73 20 69 73 20  yed. If this is 
2f7f0 61 20 72 65 6c 65 61 73 65 20 6f 70 65 72 61 74  a release operat
2f800 69 6f 6e 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  ion (op==SAVEPOI
2f810 4e 54 5f 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20  NT_RELEASE),.** 
2f820 74 68 65 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  then savepoint i
2f830 53 61 76 65 70 6f 69 6e 74 20 69 73 20 61 6c 73  Savepoint is als
2f840 6f 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a  o destroyed..**.
2f850 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f860 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
2f870 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65  TE_NOMEM if a me
2f880 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
2f890 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20  fails,.** or an 
2f8a0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
2f8b0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
2f8c0 75 72 73 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  urs while rollin
2f8d0 67 20 62 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76  g back a .** sav
2f8e0 65 70 6f 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72  epoint. If no er
2f8f0 72 6f 72 73 20 6f 63 63 75 72 2c 20 53 51 4c 49  rors occur, SQLI
2f900 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2f910 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  d..*/ .int sqlit
2f920 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
2f930 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2f940 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
2f950 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
2f960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
2f970 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
2f980 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
2f990 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
2f9a0 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61  _ROLLBACK );.  a
2f9b0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
2f9c0 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  t>=0 || op==SAVE
2f9d0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
2f9e0 3b 0a 0a 20 20 69 66 28 20 69 53 61 76 65 70 6f  ;..  if( iSavepo
2f9f0 69 6e 74 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76  int<pPager->nSav
2fa00 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e  epoint ){.    in
2fa10 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2fa20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
2fa30 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  iable */.    int
2fa40 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
2fa50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d  /* Number of rem
2fa60 61 69 6e 69 6e 67 20 73 61 76 65 70 6f 69 6e 74  aining savepoint
2fa70 73 20 61 66 74 65 72 20 74 68 69 73 20 6f 70 2e  s after this op.
2fa80 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   */..    /* Figu
2fa90 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
2faa0 73 61 76 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20  savepoints will 
2fab0 73 74 69 6c 6c 20 62 65 20 61 63 74 69 76 65 20  still be active 
2fac0 61 66 74 65 72 20 74 68 69 73 0a 20 20 20 20 2a  after this.    *
2fad0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f  * operation. Sto
2fae0 72 65 20 74 68 69 73 20 76 61 6c 75 65 20 69 6e  re this value in
2faf0 20 6e 4e 65 77 2e 20 54 68 65 6e 20 66 72 65 65   nNew. Then free
2fb00 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63   resources assoc
2fb10 69 61 74 65 64 20 0a 20 20 20 20 2a 2a 20 77 69  iated .    ** wi
2fb20 74 68 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74  th any savepoint
2fb30 73 20 74 68 61 74 20 61 72 65 20 64 65 73 74 72  s that are destr
2fb40 6f 79 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  oyed by this ope
2fb50 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ration..    */. 
2fb60 20 20 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70     nNew = iSavep
2fb70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45  oint + (op==SAVE
2fb80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  POINT_ROLLBACK);
2fb90 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77  .    for(ii=nNew
2fba0 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
2fbb0 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
2fbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
2fbd0 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
2fbe0 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69  r->aSavepoint[ii
2fbf0 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b  ].pInSavepoint);
2fc00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
2fc10 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
2fc20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  nNew;..    /* If
2fc30 20 74 68 69 73 20 69 73 20 61 20 72 6f 6c 6c 62   this is a rollb
2fc40 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70  ack operation, p
2fc50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 70 65 63  layback the spec
2fc60 69 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  ified savepoint.
2fc70 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
2fc80 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20  is a temp-file, 
2fc90 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
2fca0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
2fcb0 66 69 6c 65 20 68 61 73 0a 20 20 20 20 2a 2a 20  file has.    ** 
2fcc0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2fcd0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
2fce0 65 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65  e there have bee
2fcf0 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a  n no changes to.
2fd00 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
2fd10 61 73 65 20 66 69 6c 65 2c 20 73 6f 20 74 68 65  ase file, so the
2fd20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61 74   playback operat
2fd30 69 6f 6e 20 63 61 6e 20 62 65 20 73 6b 69 70 70  ion can be skipp
2fd40 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2fd50 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  f( op==SAVEPOINT
2fd60 5f 52 4f 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f  _ROLLBACK && isO
2fd70 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
2fd80 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72 53   ){.      PagerS
2fd90 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
2fda0 6f 69 6e 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29  oint = (nNew==0)
2fdb0 3f 30 3a 26 70 50 61 67 65 72 2d 3e 61 53 61 76  ?0:&pPager->aSav
2fdc0 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a  epoint[nNew-1];.
2fdd0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
2fde0 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e  PlaybackSavepoin
2fdf0 74 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70  t(pPager, pSavep
2fe00 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 61 73 73  oint);.      ass
2fe10 65 72 74 28 72 63 21 3d 53 51 4c 49 54 45 5f 44  ert(rc!=SQLITE_D
2fe20 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ONE);.    }.  . 
2fe30 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2fe40 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
2fe50 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
2fe60 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
2fe70 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
2fe80 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
2fe90 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
2fea0 2f 0a 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d  /.    if( nNew==
2feb0 30 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 && op==SAVEPOI
2fec0 4e 54 5f 52 45 4c 45 41 53 45 20 26 26 20 69 73  NT_RELEASE && is
2fed0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
2fee0 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
2fef0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2ff00 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  K );.      rc = 
2ff10 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
2ff20 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
2ff30 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
2ff40 2d 3e 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20  ->nSubRec = 0;. 
2ff50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2ff60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2ff70 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
2ff80 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
2ff90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
2ffa0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
2ffb0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
2ffc0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
2ffd0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2ffe0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
2fff0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
30000 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
30010 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
30020 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
30030 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
30040 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
30050 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
30060 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
30070 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
30080 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
30090 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
300a0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
300b0 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
300c0 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
300d0 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
300e0 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
300f0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
30100 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
30110 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
30120 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
30130 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
30140 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
30150 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
30160 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
30170 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
30180 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
30190 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
301a0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
301b0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
301c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
301d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
301e0 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
301f0 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
30200 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
30210 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
30220 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
30230 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
30240 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
30250 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
30260 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
30270 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
30280 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
30290 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
302a0 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ODEC./*.** Set o
302b0 72 20 72 65 74 72 69 65 76 65 20 74 68 65 20 63  r retrieve the c
302c0 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
302d0 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ger.*/.static vo
302e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
302f0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
30300 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
30310 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
30320 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
30330 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  ),.  void (*xCod
30340 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69 64  ecSizeChng)(void
30350 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20 76 6f  *,int,int),.  vo
30360 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65 65 29  id (*xCodecFree)
30370 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 20  (void*),.  void 
30380 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69 66 28  *pCodec.){.  if(
30390 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 46   pPager->xCodecF
303a0 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e 78 43  ree ) pPager->xC
303b0 6f 64 65 63 46 72 65 65 28 70 50 61 67 65 72 2d  odecFree(pPager-
303c0 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50 61 67  >pCodec);.  pPag
303d0 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
303e0 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78  dec;.  pPager->x
303f0 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 20 3d 20  CodecSizeChng = 
30400 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 3b 0a  xCodecSizeChng;.
30410 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
30420 46 72 65 65 20 3d 20 78 43 6f 64 65 63 46 72 65  Free = xCodecFre
30430 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  e;.  pPager->pCo
30440 64 65 63 20 3d 20 70 43 6f 64 65 63 3b 0a 20 20  dec = pCodec;.  
30450 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
30460 70 50 61 67 65 72 29 3b 0a 7d 0a 73 74 61 74 69  pPager);.}.stati
30470 63 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  c void *sqlite3P
30480 61 67 65 72 47 65 74 43 6f 64 65 63 28 50 61 67  agerGetCodec(Pag
30490 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
304a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 43  eturn pPager->pC
304b0 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  odec;.}.#endif..
304c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
304d0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
304e0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
304f0 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
30500 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
30510 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
30520 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
30530 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
30540 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
30550 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
30560 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
30570 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
30580 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
30590 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
305a0 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
305b0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
305c0 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
305d0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
305e0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
305f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
30600 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
30610 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
30620 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
30630 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
30640 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
30650 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
30660 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
30670 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
30680 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
30690 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
306a0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
306b0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
306c0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
306d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
306e0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
306f0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
30700 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
30710 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30720 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
30730 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
30740 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
30750 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
30760 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
30770 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
30780 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
30790 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
307a0 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
307b0 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
307c0 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
307d0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
307e0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
307f0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
30800 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
30810 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
30820 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
30830 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
30840 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
30850 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
30860 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
30870 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
30880 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
30890 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
308a0 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
308b0 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
308c0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
308d0 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
308e0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
308f0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
30900 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
30910 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
30920 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
30930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
30940 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
30950 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65 72  or code if an er
30960 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 4f  ror.** occurs. O
30970 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 65 74  therwise, it ret
30980 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
30990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
309a0 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
309b0 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
309c0 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
309d0 6f 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29  o, int isCommit)
309e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  {.  PgHdr *pPgOl
309f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
30a00 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65 69   /* The page bei
30a10 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
30a20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  */.  Pgno needSy
30a30 6e 63 50 67 6e 6f 20 3d 20 30 3b 20 20 20 20 20  ncPgno = 0;     
30a40 20 20 2f 2a 20 4f 6c 64 20 76 61 6c 75 65 20 6f    /* Old value o
30a50 66 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 69 66 20  f pPg->pgno, if 
30a60 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
30a70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
30a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
30aa0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67  e */.  Pgno orig
30ab0 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
30ac0 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 69 67 69      /* The origi
30ad0 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
30ae0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
30af0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
30b00 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 62  /* If the page b
30b10 65 69 6e 67 20 6d 6f 76 65 64 20 69 73 20 64 69  eing moved is di
30b20 72 74 79 20 61 6e 64 20 68 61 73 20 6e 6f 74 20  rty and has not 
30b30 62 65 65 6e 20 73 61 76 65 64 20 62 79 20 74 68  been saved by th
30b40 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a 20 73 61  e latest.  ** sa
30b50 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e 20 73 61  vepoint, then sa
30b60 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  ve the current c
30b70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
30b80 61 67 65 20 69 6e 74 6f 20 74 68 65 20 0a 20 20  age into the .  
30b90 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6e  ** sub-journal n
30ba0 6f 77 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  ow. This is requ
30bb0 69 72 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74  ired to handle t
30bc0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
30bd0 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nario:.  **.  **
30be0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
30bf0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
30c00 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 20   X, then modify 
30c10 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e 0a 20 20  it in memory>.  
30c20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  **     SAVEPOINT
30c30 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20 20 20 20   one;.  **      
30c40 20 3c 4d 6f 76 65 20 70 61 67 65 20 58 20 74 6f   <Move page X to
30c50 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a 20 20 2a   location Y>.  *
30c60 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54  *     ROLLBACK T
30c70 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  O one;.  **.  **
30c80 20 49 66 20 70 61 67 65 20 58 20 77 65 72 65 20   If page X were 
30c90 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  not written to t
30ca0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 68  he sub-journal h
30cb0 65 72 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ere, it would no
30cc0 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73 73 69 62  t.  ** be possib
30cd0 6c 65 20 74 6f 20 72 65 73 74 6f 72 65 20 69 74  le to restore it
30ce0 73 20 63 6f 6e 74 65 6e 74 73 20 77 68 65 6e 20  s contents when 
30cf0 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
30d00 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74 61 74 65   one".  ** state
30d10 6d 65 6e 74 20 77 65 72 65 20 69 73 20 70 72 6f  ment were is pro
30d20 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  cessed..  **.  *
30d30 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  * subjournalPage
30d40 28 29 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 61  () may need to a
30d50 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 74 6f  llocate space to
30d60 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
30d70 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e 65 20 6f   into.  ** one o
30d80 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69 6e 74  r more savepoint
30d90 20 62 69 74 76 65 63 73 2e 20 54 68 69 73 20 69   bitvecs. This i
30da0 73 20 74 68 65 20 72 65 61 73 6f 6e 20 74 68 69  s the reason thi
30db0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
30dc0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
30dd0 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f 0a 20 20  E_NOMEM..  */.  
30de0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
30df0 47 48 44 52 5f 44 49 52 54 59 20 0a 20 20 20 26  GHDR_DIRTY .   &
30e00 26 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  & subjRequiresPa
30e10 67 65 28 70 50 67 29 0a 20 20 20 26 26 20 53 51  ge(pPg).   && SQ
30e20 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
30e30 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70 50  ubjournalPage(pP
30e40 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  g)).  ){.    ret
30e50 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 50  urn rc;.  }..  P
30e60 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f 56 45  AGERTRACE(("MOVE
30e70 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65   %d page %d (nee
30e80 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20  dSync=%d) moves 
30e90 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  to %d\n", .     
30ea0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
30eb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28 70 50  , pPg->pgno, (pP
30ec0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
30ed0 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c 20 70  EED_SYNC)?1:0, p
30ee0 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  gno));.  IOTRACE
30ef0 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64  (("MOVE %p %d %d
30f00 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
30f10 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a  ->pgno, pgno))..
30f20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
30f30 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
30f40 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
30f50 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
30f60 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
30f70 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
30f80 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
30f90 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
30fa0 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
30fb0 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
30fc0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
30fd0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
30fe0 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
30ff0 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
31000 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
31010 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
31020 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
31030 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
31040 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
31050 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
31060 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
31070 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
31080 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
31090 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
310a0 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
310b0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
310c0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
310d0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
310e0 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
310f0 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
31100 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72  gno>pPager->dbOr
31110 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  igSize );.    as
31120 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
31130 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
31140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31150 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
31160 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
31170 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
31180 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
31190 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
311a0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
311b0 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
311c0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
311d0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
311e0 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
311f0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
31200 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
31210 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
31220 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
31230 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
31240 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
31250 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
31260 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
31270 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
31280 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
31290 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
312a0 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
312b0 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
312c0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
312d0 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
312e0 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
312f0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
31300 5f 53 59 4e 43 29 3b 0a 20 20 20 20 73 71 6c 69  _SYNC);.    sqli
31310 74 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50  te3PcacheDrop(pP
31320 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 6f 72  gOld);.  }..  or
31330 69 67 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  igPgno = pPg->pg
31340 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  no;.  sqlite3Pca
31350 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e  cheMove(pPg, pgn
31360 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  o);.  sqlite3Pca
31370 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
31380 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  );.  pPager->dbM
31390 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
313a0 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
313b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
313c0 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
313d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
313e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
313f0 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
31400 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
31410 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
31420 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
31430 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
31440 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
31450 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
31460 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
31470 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
31480 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
31490 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
314a0 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
314b0 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
314c0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
314d0 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
314e0 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
314f0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
31500 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
31510 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
31520 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
31530 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31540 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
31550 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
31560 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
31570 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
31580 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
31590 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
315a0 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
315b0 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
315c0 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
315d0 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
315e0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
315f0 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
31600 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
31610 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
31620 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
31630 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
31640 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
31650 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
31660 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
31670 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
31680 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
31690 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
316a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
316b0 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
316c0 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
316d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
316e0 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
316f0 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
31700 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
31710 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
31720 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
31730 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
31740 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
31750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48  ..    */.    PgH
31760 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
31770 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
31780 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
31790 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
317a0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
317b0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
317c0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
317d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
317e0 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63      if( needSync
317f0 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  Pgno<=pPager->db
31800 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20  OrigSize ){.    
31810 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
31820 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30  er->pTmpSpace!=0
31830 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
31840 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
31850 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
31860 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  l, needSyncPgno,
31870 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
31880 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ce);.      }.   
31890 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
318a0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
318b0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
318c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
318d0 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21  ->noSync==0 && !
318e0 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67  MEMDB );.    pPg
318f0 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  Hdr->flags |= PG
31900 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
31910 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
31920 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  MakeDirty(pPgHdr
31930 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
31940 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
31950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
31960 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
31970 79 20 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65  y database, make
31980 20 73 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e   sure the origin
31990 61 6c 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65  al page continue
319a0 73 0a 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c  s.  ** to exist,
319b0 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
319c0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  nsaction needs t
319d0 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 57 65  o roll back.  We
319e0 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
319f0 68 65 20 70 61 67 65 20 6e 6f 77 2c 20 69 6e 73  he page now, ins
31a00 74 65 61 64 20 6f 66 20 61 74 20 72 6f 6c 6c 62  tead of at rollb
31a10 61 63 6b 2c 20 62 65 63 61 75 73 65 20 77 65 20  ack, because we 
31a20 63 61 6e 20 62 65 74 74 65 72 20 64 65 61 6c 0a  can better deal.
31a30 20 20 2a 2a 20 77 69 74 68 20 61 6e 20 6f 75 74    ** with an out
31a40 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72  -of-memory error
31a50 20 6e 6f 77 2e 20 20 54 69 63 6b 65 74 20 23 33   now.  Ticket #3
31a60 37 36 31 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  761..  */.  if( 
31a70 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 44 62 50  MEMDB ){.    DbP
31a80 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 72  age *pNew;.    r
31a90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31aa0 41 63 71 75 69 72 65 28 70 50 61 67 65 72 2c 20  Acquire(pPager, 
31ab0 6f 72 69 67 50 67 6e 6f 2c 20 26 70 4e 65 77 2c  origPgno, &pNew,
31ac0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   1);.    if( rc!
31ad0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31ae0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
31af0 65 4d 6f 76 65 28 70 50 67 2c 20 6f 72 69 67 50  eMove(pPg, origP
31b00 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  gno);.      retu
31b10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
31b20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
31b30 65 66 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20  ef(pNew);.  }.. 
31b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31b50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
31b60 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
31b70 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61 20  ter to the data 
31b80 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
31b90 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
31ba0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
31bb0 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50 67  Data(DbPage *pPg
31bc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  ){.  assert( pPg
31bd0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 50 67 2d  ->nRef>0 || pPg-
31be0 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
31bf0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  ;.  return pPg->
31c00 70 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pData;.}../*.** 
31c10 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
31c20 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
31c30 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
31c40 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
31c50 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
31c60 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
31c70 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
31c80 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
31c90 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
31ca0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
31cb0 67 2d 3e 70 45 78 74 72 61 3b 0a 7d 0a 0a 2f 2a  g->pExtra;.}../*
31cc0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
31cd0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
31ce0 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
31cf0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
31d00 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
31d10 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31d20 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
31d30 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
31d40 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
31d50 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
31d60 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
31d70 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
31d80 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
31d90 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
31da0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
31db0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
31dc0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
31dd0 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
31de0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31df0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
31e00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31e10 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
31e20 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
31e30 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
31e40 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
31e50 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
31e60 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
31e70 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
31e80 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
31e90 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
31ea0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
31eb0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
31ec0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
31ed0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
31ee0 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
31ef0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
31f00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31f10 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
31f20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
31f30 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
31f40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
31f50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31f60 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
31f70 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31f80 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
31f90 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
31fa0 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
31fb0 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
31fc0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
31fd0 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20   = (u8)eMode;.  
31fe0 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
31ff0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
32000 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eMode;.}../*.** 
32010 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72  Get/set the jour
32020 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  nal-mode for thi
32030 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
32040 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
32050 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20   one of:.**.**  
32060 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d    PAGER_JOURNALM
32070 4f 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20  ODE_QUERY.**    
32080 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32090 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50  E_DELETE.**    P
320a0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
320b0 5f 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20  _TRUNCATE.**    
320c0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
320d0 45 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20  E_PERSIST.**    
320e0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
320f0 45 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45  E_OFF.**    PAGE
32100 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
32110 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  MORY.**.** If th
32120 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
32130 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
32140 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  the journal_mode
32150 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
32160 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
32170 64 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20  d if the change 
32180 69 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65  is allowed.  The
32190 20 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c   change is disal
321a0 6c 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  lowed.** for the
321b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f   following reaso
321c0 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ns:.**.**   *  A
321d0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
321e0 62 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61  base can only ha
321f0 76 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d  ve its journal_m
32200 6f 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a  ode set to _OFF.
32210 2a 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f  **      or _MEMO
32220 52 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54  RY..**.**   *  T
32230 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  he journal mode 
32240 6d 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  may not be chang
32250 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73  ed while a trans
32260 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
32270 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
32280 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68  rned indicate th
32290 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
322a0 62 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75  bly updated) jou
322b0 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  rnal-mode..*/.in
322c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f  t sqlite3PagerJo
322d0 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20  urnalMode(Pager 
322e0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
322f0 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
32300 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
32310 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  NALMODE_QUERY.  
32320 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32330 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
32340 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20  LMODE_DELETE.   
32350 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32360 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32370 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
32380 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
32390 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
323a0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
323b0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
323c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
323d0 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20  LMODE_OFF .     
323e0 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
323f0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
32400 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61  DE_MEMORY );.  a
32410 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
32420 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
32430 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
32440 3d 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42  =0.   && (!MEMDB
32450 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
32460 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
32470 4f 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  ORY .           
32480 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
32490 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
324a0 46 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65  FF).   && !pPage
324b0 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20  r->dbModified.  
324c0 20 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61   && (!isOpen(pPa
324d0 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d  ger->jfd) || 0==
324e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
324f0 66 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ff).  ){.    if(
32500 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
32510 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71  jfd) ){.      sq
32520 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
32530 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
32540 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
32550 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65  rnalMode = (u8)e
32560 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
32570 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
32580 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a  journalMode;.}..
32590 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68  /*.** Get/set th
325a0 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65  e size-limit use
325b0 64 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  d for persistent
325c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
325d0 2a 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68  **.** Setting th
325e0 65 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20  e size limit to 
325f0 2d 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69  -1 means no limi
32600 74 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a  t is enforced..*
32610 2a 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  * An attempt to 
32620 73 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c  set a limit smal
32630 6c 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61  ler than -1 is a
32640 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73   no-op..*/.i64 s
32650 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
32660 61 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65  alSizeLimit(Page
32670 72 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69  r *pPager, i64 i
32680 4c 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c  Limit){.  if( iL
32690 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20  imit>=-1 ){.    
326a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
326b0 69 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  izeLimit = iLimi
326c0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
326d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
326e0 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  izeLimit;.}../*.
326f0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
32700 74 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65  ter to the pPage
32710 72 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61  r->pBackup varia
32720 62 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20  ble. The backup 
32730 6d 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63  module.** in bac
32740 6b 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20  kup.c maintains 
32750 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
32760 68 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68  his variable. Th
32770 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65  is module.** use
32780 73 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73  s it opaquely as
32790 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
327a0 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
327b0 74 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71  tart() and.** sq
327c0 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74  lite3BackupUpdat
327d0 65 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c  e() only..*/.sql
327e0 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71  ite3_backup **sq
327f0 6c 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70  lite3PagerBackup
32800 50 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Ptr(Pager *pPage
32810 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50  r){.  return &pP
32820 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d  ager->pBackup;.}
32830 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
32840 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
32850 2f 0a                                            /.