/ Hex Artifact Content
Login

Artifact c3f46fcb60a9049dd2f3039dfcde60fbbb83b41b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 30  : pager.c,v 1.50
0350: 33 20 32 30 30 38 2f 31 31 2f 31 33 20 31 34 3a  3 2008/11/13 14:
0360: 32 38 3a 32 39 20 64 61 6e 69 65 6c 6b 31 39 37  28:29 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 23 64   off.*/.#if 0.#d
03f0: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0400: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0410: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0420: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0440: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0450: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0460: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0470: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
0480: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
0490: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04a0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04b0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04c0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04d0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
04e0: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
04f0: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0500: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0510: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0520: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0540: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0550: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0560: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0570: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
0580: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
0590: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05a0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05b0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05d0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
05e0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
05f0: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0600: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0610: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0620: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0630: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0640: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0650: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0660: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0670: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
0680: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
0690: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06a0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06b0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06c0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06d0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
06e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
06f0: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0700: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0710: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0720: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0730: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0740: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0750: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0760: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0770: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
0780: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
0790: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07a0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07b0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
07e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
07f0: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0820: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0830: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0840: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0850: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0860: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0870: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
0880: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
0890: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08a0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08c0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08d0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
08e0: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0900: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0910: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0920: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0950: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0960: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0970: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
0980: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
0990: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09a0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09d0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
09e0: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
09f0: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a10: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a20: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a30: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a40: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a50: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a60: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a70: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0a80: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0aa0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ab0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ac0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0af0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b00: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b10: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b20: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b30: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b60: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b70: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0ba0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bb0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0bc0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bd0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0be0: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0bf0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c00: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c10: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c20: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c30: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c60: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c70: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0c80: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0ca0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cb0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0cc0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0cf0: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d00: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d10: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d20: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d30: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d40: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d50: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0d80: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0d90: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0da0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0db0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0dc0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0dd0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0de0: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0df0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e00: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e10: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e20: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e30: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e40: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e50: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e60: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e70: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0e80: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0e90: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ea0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0eb0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ec0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ed0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0ee0: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0ef0: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f00: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f10: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f20: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f30: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f40: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f50: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f60: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f70: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0f80: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0f90: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fa0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fb0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fc0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0fd0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
0fe0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0ff0: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1000: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1010: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1020: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1030: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1040: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1050: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1060: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1070: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
1080: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1090: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10a0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10b0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10c0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10d0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
10e0: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
10f0: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1100: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1110: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1120: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1130: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1140: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1150: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1160: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1170: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
1180: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1190: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11a0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11b0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11c0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11d0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
11e0: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
11f0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1200: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1210: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1220: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1230: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1240: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1250: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1260: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1270: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
1280: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
1290: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12a0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12b0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12c0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12d0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
12e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
12f0: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1300: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1310: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1320: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1330: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1340: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1350: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1360: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1370: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
1380: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
1390: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13a0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13b0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13c0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13d0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
13e0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
13f0: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1400: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1410: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1420: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1430: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1440: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1450: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1460: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1470: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
1480: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
1490: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14a0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14b0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14d0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
14e0: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
14f0: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1500: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1510: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1520: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1530: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1540: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1550: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1560: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1570: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
1580: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
1590: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15b0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15c0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f   (((X)+7)&~7)../
15d0: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
15e0: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
15f0: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1600: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1610: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1620: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1630: 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28  EC1(P,D,N,X) if(
1640: 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b   P->xCodec!=0 ){
1650: 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43   P->xCodec(P->pC
1660: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20  odecArg,D,N,X); 
1670: 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43  }.# define CODEC
1680: 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61  2(P,D,N,X) ((cha
1690: 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30  r*)(P->xCodec!=0
16a0: 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43  ?P->xCodec(P->pC
16b0: 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44  odecArg,D,N,X):D
16c0: 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  )).#else.# defin
16d0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
16e0: 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20  ) /* NO-OP */.# 
16f0: 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c  define CODEC2(P,
1700: 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44  D,N,X) ((char*)D
1710: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1720: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
1730: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
1740: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1750: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
1760: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
1770: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
1780: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
1790: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a  ITE_CORRUPT, or.
17a0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  ** or SQLITE_FUL
17b0: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
17c0: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
17d0: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
17e0: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64   persists.** and
17f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
1800: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
1810: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
1820: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
1830: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65  * SQLITE_FULL re
1840: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
1850: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
1860: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
1870: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  y until the.** n
1880: 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72  ext successful r
1890: 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f  ollback is perfo
18a0: 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  rmed on the page
18b0: 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a  r cache. Also,.*
18c0: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f  * SQLITE_FULL do
18d0: 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
18e0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
18f0: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
1900: 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  agerLookup().** 
1910: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
1920: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
1930: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74  cessfully..*/.st
1940: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
1950: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1960: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
1970: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
1980: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
1990: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
19a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
19b0: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
19c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
19d0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
19e0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
19f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1a00: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
1a10: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
1a20: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
1a30: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1a40: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
1a50: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
1a60: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
1a70: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
1a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1a90: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
1aa0: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
1ab0: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ad0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
1ae0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1af0: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
1b00: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
1b10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b20: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
1b30: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b40: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
1b50: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1b70: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
1b80: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
1b90: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
1ba0: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
1bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
1bc0: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
1bd0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
1be0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c00: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
1c10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c20: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
1c30: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
1c40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c50: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
1c60: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
1c70: 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  L */.  u8 state;
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
1ca0: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
1cb0: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
1cc0: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
1cf0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
1d00: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
1d30: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1d40: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1d50: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1d60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
1d70: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
1d80: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
1d90: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
1da0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
1db0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
1dc0: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
1dd0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
1de0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1df0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
1e00: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
1e10: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
1e20: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
1e50: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
1e60: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
1e70: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1e80: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
1e90: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
1ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
1eb0: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
1ec0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1ed0: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
1ee0: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
1ef0: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
1f00: 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69   */.  u8 exclusi
1f10: 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  veMode;         
1f20: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72    /* Boolean. Tr
1f30: 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ue if locking_mo
1f40: 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f  de==EXCLUSIVE */
1f50: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64  .  u8 journalMod
1f60: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1f70: 2a 20 4f 6e 20 6f 66 20 74 68 65 20 50 41 47 45  * On of the PAGE
1f80: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20  R_JOURNALMODE_* 
1f90: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 75 38 20 64  values */.  u8 d
1fa0: 62 4d 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20  bModified;      
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fc0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
1fd0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1fe0: 44 62 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67  Db */.  u8 chang
1ff0: 65 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20  eCountDone;     
2000: 20 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72      /* Set after
2010: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2020: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
2030: 20 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
2040: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2050: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
2060: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2070: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  () */.  int errC
2080: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2090: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
20a0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
20b0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rrors */.  int d
20c0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
20d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20e0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2100: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2110: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2120: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2130: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2140: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2160: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2170: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2180: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2190: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
21c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
21d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
21e0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
21f0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2200: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2210: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2220: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2230: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2240: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2250: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2260: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2270: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
22a0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
22b0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
22c0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22f0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2300: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2320: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2330: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2340: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2370: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2380: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2390: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
23c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
23d0: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
23e0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
23f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2400: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2420: 69 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ile */.  Bitvec 
2430: 2a 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *pInStmt;       
2440: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2450: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2460: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2470: 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61  .  Bitvec *pAlwa
2480: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f  ysRollback;    /
2490: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
24a0: 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  ch page marked a
24b0: 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a  lways-rollback *
24c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
24d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
24e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
24f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2500: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2520: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2540: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2560: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2570: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2580: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
2590: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
25a0: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
25b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
25c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
25d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
25e0: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
25f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2600: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2610: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2620: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
2630: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
2640: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
2650: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
2660: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34  Handler */.  i64
2670: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2690: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
26a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
26b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
26c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
26d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
26e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
26f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
2700: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
2710: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2720: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
2730: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
2740: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
2750: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
2760: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2770: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
2780: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
2790: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
27a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
27b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
27d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
27e0: 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65 3b   u32 sectorSize;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
2810: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
2820: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
2830: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
2840: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
2850: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
2860: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
2870: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
2880: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
2890: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
28a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
28b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
28c0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
28d0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
28e0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
28f0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
2900: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
2910: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
2920: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
2930: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2940: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2950: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2960: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2970: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2990: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
29a0: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
29b0: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
29c0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
29d0: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
29e0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
29f0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
2a00: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2a10: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
2a20: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
2a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
2a40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20  hanges */.  i64 
2a50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2a60: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
2a70: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
2a80: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
2a90: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
2aa0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
2ab0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ac0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
2ad0: 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ect */.};../*.**
2ae0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2af0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
2b00: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
2b10: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2b20: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
2b30: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
2b40: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
2b50: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
2b60: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
2b70: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
2b80: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
2b90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ba0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2bb0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
2bc0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
2bd0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
2be0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
2bf0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c00: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2c10: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
2c20: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
2c30: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
2c40: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c50: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2c60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
2c90: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
2ca0: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
2cb0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2cc0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
2cd0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
2cf0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
2d00: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
2d10: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
2d20: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2d30: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
2d40: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
2d50: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
2d60: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
2d70: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
2d80: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
2d90: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
2da0: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
2db0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
2dc0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
2dd0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
2de0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
2df0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
2e00: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
2e10: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
2e20: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
2e30: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
2e40: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
2e50: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
2e60: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
2e70: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
2e80: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
2e90: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
2ea0: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
2eb0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
2ec0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
2ed0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
2ee0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
2ef0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
2f00: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2f10: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
2f20: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
2f30: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
2f40: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
2f50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
2f60: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
2f70: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
2f80: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
2f90: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
2fa0: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
2fb0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2fc0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
2fd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2fe0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
2ff0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3000: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3010: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3020: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3030: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3040: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3050: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3060: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3070: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3080: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3090: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
30a0: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
30b0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
30c0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
30d0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
30e0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
30f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
3100: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
3110: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3120: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3130: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3140: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3150: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3160: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3170: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3180: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3190: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
31a0: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
31b0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
31c0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
31d0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
31e0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
31f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3200: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
3210: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3220: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3230: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3240: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3260: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3270: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3280: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3290: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
32a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
32b0: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
32c0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
32d0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
32e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
32f0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3300: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3310: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3320: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3330: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3340: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3350: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3360: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3370: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3380: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3390: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
33a0: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
33b0: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
33c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
33d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
33e0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
33f0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3400: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3410: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3420: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3430: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3440: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3450: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3460: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3470: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3480: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3490: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
34a0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
34b0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
34c0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
34d0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
34e0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
34f0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3500: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3510: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3520: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3540: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3550: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3560: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3570: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3580: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3590: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
35a0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
35b0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
35c0: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
35d0: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
35e0: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
35f0: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
3600: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
3610: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
3620: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3630: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
3640: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
3650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3660: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
3670: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
3680: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
3690: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
36a0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
36b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
36c0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
36d0: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
36e0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
36f0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3700: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
3710: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3720: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
3730: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
3740: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
3750: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
3760: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
3770: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
3780: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
3790: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
37a0: 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  7../*.** Return 
37b0: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
37c0: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
37d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
37e0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
37f0: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
3800: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
3810: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
3820: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
3830: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
3840: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
3850: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3860: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
3870: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3880: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3890: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
38a0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
38b0: 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  st(pPager->pInSt
38c0: 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
38d0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  }..static int pa
38e0: 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48 64  geInJournal(PgHd
38f0: 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  r *pPg){.  retur
3900: 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  n sqlite3BitvecT
3910: 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72 2d  est(pPg->pPager-
3920: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
3930: 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
3940: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
3950: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
3960: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3970: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
3980: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
3990: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
39a0: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
39b0: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
39c0: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
39d0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
39e0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
39f0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
3a00: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
3a10: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
3a20: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
3a30: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
3a40: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
3a50: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
3a60: 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  et, u32 *pRes){.
3a70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3a80: 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20  ac[4];.  int rc 
3a90: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
3aa0: 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61  fd, ac, sizeof(a
3ab0: 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  c), offset);.  i
3ac0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3ad0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
3ae0: 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
3af0: 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ac);.  }.  retur
3b00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
3b10: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
3b20: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
3b30: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
3b40: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
3b50: 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  der..*/.#define 
3b60: 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20  put32bits(A,B)  
3b70: 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28  sqlite3Put4byte(
3b80: 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a  (u8*)A,B)../*.**
3b90: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
3ba0: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
3bb0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
3bc0: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
3bd0: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
3be0: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
3bf0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
3c00: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
3c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3c20: 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69  write32bits(sqli
3c30: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
3c40: 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61  4 offset, u32 va
3c50: 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d  l){.  char ac[4]
3c60: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63  ;.  put32bits(ac
3c70: 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  , val);.  return
3c80: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
3c90: 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65  fd, ac, 4, offse
3ca0: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  t);.}../*.** If 
3cb0: 66 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e  file pFd is open
3cc0: 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73  , call sqlite3Os
3cd0: 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a  Unlock() on it..
3ce0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
3cf0: 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
3d00: 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c  ile *pFd, int eL
3d10: 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64  ock){.  if( !pFd
3d20: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
3d30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3d40: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
3d50: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3d60: 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a  (pFd, eLock);.}.
3d70: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3d80: 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20  tion determines 
3d90: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
3da0: 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20  he atomic-write 
3db0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20  optimization.** 
3dc0: 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68  can be used with
3dd0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65   this pager. The
3de0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
3df0: 6e 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a  n be used if:.**
3e00: 0a 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c  .**  (a) the val
3e10: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f  ue returned by O
3e20: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
3e30: 69 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74  istics() indicat
3e40: 65 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  es that.**      
3e50: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3e60: 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61  may be written a
3e70: 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a  tomically, and.*
3e80: 2a 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65  *  (b) the value
3e90: 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53   returned by OsS
3ea0: 65 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c  ectorSize() is l
3eb0: 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
3ec0: 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  l.**      to the
3ed0: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
3ee0: 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  * If the optimiz
3ef0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
3f00: 75 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72  used, 0 is retur
3f10: 6e 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62  ned. If it can b
3f20: 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  e used,.** then 
3f30: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3f40: 65 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ed is the size o
3f50: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3f60: 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f  le when it.** co
3f70: 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20  ntains rollback 
3f80: 64 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79  data for exactly
3f90: 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   one page..*/.#i
3fa0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
3fb0: 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
3fc0: 73 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42  static int jrnlB
3fd0: 75 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20  ufferSize(Pager 
3fe0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
3ff0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dc;           /*
4000: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
4010: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74  ristics */.  int
4020: 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f   nSector;      /
4030: 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f  * Sector size */
4040: 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 3b 20 20  .  int szPage;  
4050: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69        /* Page si
4060: 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ze */.  sqlite3_
4070: 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65  file *fd = pPage
4080: 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64  r->fd;..  if( fd
4090: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
40a0: 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    dc = sqlite3Os
40b0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
40c0: 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e  stics(fd);.    n
40d0: 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33  Sector = sqlite3
40e0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29  OsSectorSize(fd)
40f0: 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20 70  ;.    szPage = p
4100: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
4110: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 53  .  }..  assert(S
4120: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
4130: 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29  IC512==(512>>8))
4140: 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54  ;.  assert(SQLIT
4150: 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
4160: 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
4170: 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65 74  .  if( !fd->pMet
4180: 68 6f 64 73 20 7c 7c 20 0a 20 20 20 20 20 20 20  hods || .       
4190: 28 64 63 20 26 20 28 53 51 4c 49 54 45 5f 49 4f  (dc & (SQLITE_IO
41a0: 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73 7a 50 61  CAP_ATOMIC|(szPa
41b0: 67 65 3e 3e 38 29 29 20 26 26 20 6e 53 65 63 74  ge>>8)) && nSect
41c0: 6f 72 3c 3d 73 7a 50 61 67 65 29 20 29 7b 0a 20  or<=szPage) ){. 
41d0: 20 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41     return JOURNA
41e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
41f0: 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   + JOURNAL_PG_SZ
4200: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
4210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4220: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
4230: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4240: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4250: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4260: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4270: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
4280: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
4290: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
42a0: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
42b0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
42c0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
42d0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
42e0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
42f0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4300: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4310: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4320: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4330: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4340: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4350: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4360: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4370: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4380: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
4390: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
43a0: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
43b0: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
43c0: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
43d0: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
43e0: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
43f0: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
4400: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
4410: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
4420: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
4430: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
4440: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
4450: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
4460: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
4470: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
4480: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
4490: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
44a0: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
44b0: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
44c0: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
44d0: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
44e0: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
44f0: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
4500: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
4510: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
4520: 20 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74   occured, then t
4530: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
4540: 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20  nal may need.** 
4550: 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a  to be replayed..
4560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4570: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
4580: 72 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74  r *pPager);.stat
4590: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
45a0: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
45b0: 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74  , int rc){.  int
45c0: 20 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66   rc2 = rc & 0xff
45d0: 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  ;.  assert(.    
45e0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
45f0: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
4600: 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  ||.       pPager
4610: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4620: 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28  E_OK ||.       (
4630: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
4640: 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  & 0xff)==SQLITE_
4650: 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28  IOERR.  );.  if(
4660: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
4670: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32  _FULL ||.    rc2
4680: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c  ==SQLITE_IOERR |
4690: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
46a0: 45 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20  E_CORRUPT.  ){. 
46b0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
46c0: 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28  de = rc;.    if(
46d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
46e0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
46f0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
4700: 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
4710: 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
4720: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
4730: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
4740: 20 61 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65   already unlocke
4750: 64 2c 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e  d, call pager_un
4760: 6c 6f 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20  lock() now to.  
4770: 20 20 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65      ** clear the
4780: 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64   error state and
4790: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
47a0: 20 70 61 67 65 72 2d 63 61 63 68 65 20 69 73 20   pager-cache is 
47b0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65  .      ** comple
47c0: 74 65 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20  tely empty..    
47d0: 20 20 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72    */.      pager
47e0: 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
47f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4800: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4810: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
4820: 5f 50 41 47 45 53 20 69 73 20 64 65 66 69 6e 65  _PAGES is define
4830: 64 20 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d  d then we do som
4840: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4850: 67 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68  g.** on the cach
4860: 65 20 75 73 69 6e 67 20 61 20 68 61 73 68 20 66  e using a hash f
4870: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69  unction.  This i
4880: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
4890: 6e 67 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67  ng.** and debugg
48a0: 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66  ing only..*/.#if
48b0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
48c0: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
48d0: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
48e0: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
48f0: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
4900: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
4910: 72 5f 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e  r_datahash(int n
4920: 42 79 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Byte, unsigned c
4930: 68 61 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75  har *pData){.  u
4940: 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69  32 hash = 0;.  i
4950: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
4960: 20 69 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a   i<nByte; i++){.
4970: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
4980: 2a 31 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69  *1039) + pData[i
4990: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
49a0: 68 61 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75  hash;.}.static u
49b0: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
49c0: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
49d0: 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
49e0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e  datahash(pPage->
49f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
4a00: 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
4a10: 20 2a 29 70 50 61 67 65 2d 3e 70 44 61 74 61 29   *)pPage->pData)
4a20: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
4a30: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68 61  pager_set_pageha
4a40: 73 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29  sh(PgHdr *pPage)
4a50: 7b 0a 20 20 70 50 61 67 65 2d 3e 70 61 67 65 48  {.  pPage->pageH
4a60: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
4a70: 68 61 73 68 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  hash(pPage);.}..
4a80: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
4a90: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
4aa0: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
4ab0: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
4ac0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
4ad0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
4ae0: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
4af0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
4b00: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
4b10: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
4b20: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
4b30: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
4b40: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
4b50: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
4b60: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
4b70: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
4b80: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
4b90: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
4ba0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
4bb0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
4bc0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
4bd0: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
4be0: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
4bf0: 72 72 43 6f 64 65 0a 20 20 20 20 20 20 7c 7c 20  rrCode.      || 
4c00: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
4c10: 52 5f 44 49 52 54 59 29 20 7c 7c 20 70 50 67 2d  R_DIRTY) || pPg-
4c20: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
4c30: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
4c40: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
4c50: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
4c60: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
4c70: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
4c80: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
4c90: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
4ca0: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  dif  /* SQLITE_C
4cb0: 48 45 43 4b 5f 50 41 47 45 53 20 2a 2f 0a 0a 2f  HECK_PAGES */../
4cc0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
4cd0: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
4ce0: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
4cf0: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
4d00: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
4d10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
4d20: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
4d30: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
4d40: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
4d50: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
4d60: 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62  emory supplied b
4d70: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a  y the caller. .*
4d80: 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73  *.** zMaster mus
4d90: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
4da0: 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
4db0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c  nMaster bytes al
4dc0: 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
4dd0: 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73  e caller. This s
4de0: 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33  hould be sqlite3
4df0: 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b  _vfs.mxPathname+
4e00: 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65  1 (to ensure the
4e10: 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20  re is.** enough 
4e20: 73 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74  space to write t
4e30: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4e40: 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20  l name). If the 
4e50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
4e60: 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f  * name in the jo
4e70: 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20  urnal is longer 
4e80: 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74  than nMaster byt
4e90: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a  es (including a.
4ea0: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  ** nul-terminato
4eb0: 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  r), then this is
4ec0: 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e   handled as if n
4ed0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
4ee0: 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72   name.** were pr
4ef0: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75  esent in the jou
4f00: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  rnal..**.** If n
4f10: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
4f20: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72   file name is pr
4f30: 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d  esent zMaster[0]
4f40: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4f50: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
4f60: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
4f70: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
4f80: 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f  Journal(sqlite3_
4f90: 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  file *pJrnl, cha
4fa0: 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20  r *zMaster, int 
4fb0: 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  nMaster){.  int 
4fc0: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
4fd0: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
4fe0: 63 6b 73 75 6d 3b 0a 20 20 75 33 32 20 75 3b 20  cksum;.  u32 u; 
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5000: 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
5010: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
5020: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
5030: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
5040: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
5050: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
5060: 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  ..  zMaster[0] =
5070: 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73   '\0';..  rc = s
5080: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
5090: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
50a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
50b0: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
50c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
50d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
50e0: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
50f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5100: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5110: 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d  rc;..  if( len>=
5120: 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  nMaster ){.    r
5130: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
5140: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
5150: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
5160: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
5170: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5180: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5190: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51a0: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
51b0: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
51c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
51d0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
51e0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
51f0: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
5200: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
5210: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
5220: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
5230: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
5240: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5250: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
5260: 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  rc;.  }.  zMaste
5270: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a  r[len] = '\0';..
5280: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
5290: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
52a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
52b0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
52c0: 72 28 75 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b  r(u=0; u<len; u+
52d0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
52e0: 20 7a 4d 61 73 74 65 72 5b 75 5d 3b 0a 20 20 20   zMaster[u];.   
52f0: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
5300: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
5310: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
5320: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
5330: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
5340: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
5350: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
5360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
5370: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
5380: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
5390: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
53a0: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
53b0: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
53c0: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
53d0: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
53e0: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
53f0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
5400: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b   */.    zMaster[
5410: 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
5420: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
5430: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5440: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
5450: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5460: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
5470: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
5480: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
5490: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
54a0: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
54b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
54c0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
54d0: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
54e0: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
54f0: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
5500: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
5510: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
5520: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
5530: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
55f0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
5600: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5610: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
5620: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
5630: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
5640: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
5650: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
5660: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
5670: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5680: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
5690: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
56a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
56b0: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
56c0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
56d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
56e0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
56f0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
5700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5710: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
5720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
5730: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  fset;.}../*.** W
5740: 72 69 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20  rite zeros over 
5750: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
5760: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
5770: 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a   This has the.**
5780: 20 65 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c   effect of inval
5790: 69 64 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72  idating the jour
57a0: 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d  nal file and com
57b0: 6d 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74  mitting the.** t
57c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
57d0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
57e0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
57f0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
5800: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
5810: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5820: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
5830: 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 20 3d  ar zeroHdr[28] =
5840: 20 7b 30 7d 3b 0a 0a 20 20 69 66 28 20 70 50 61   {0};..  if( pPa
5850: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
5860: 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 69 6d 69  ){.    i64 iLimi
5870: 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t = pPager->jour
5880: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 0a 20  nalSizeLimit;.. 
5890: 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 5a 45     IOTRACE(("JZE
58a0: 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70 50 61  ROHDR %p\n", pPa
58b0: 67 65 72 29 29 0a 20 20 20 20 69 66 28 20 64 6f  ger)).    if( do
58c0: 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c 69 6d  Truncate || iLim
58d0: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
58e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
58f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
5900: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
5910: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5920: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
5930: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
5940: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
5950: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
5960: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5970: 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  OK && !pPager->n
5980: 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72  oSync ){.      r
5990: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
59a0: 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53  c(pPager->jfd, S
59b0: 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
59c0: 4e 4c 59 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63  NLY|pPager->sync
59d0: 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a  _flags);.    }..
59e0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
59f0: 6f 69 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  oint the transac
5a00: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
5a10: 64 20 62 75 74 20 74 68 65 20 77 72 69 74 65 20  d but the write 
5a20: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20  lock .    ** is 
5a30: 73 74 69 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68  still held on th
5a40: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65  e file. If there
5a50: 20 69 73 20 61 20 73 69 7a 65 20 6c 69 6d 69 74   is a size limit
5a60: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
5a70: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 65 72 73  .    ** the pers
5a80: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  istent journal a
5a90: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nd the journal f
5aa0: 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ile currently co
5ab0: 6e 73 75 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20  nsumes more.    
5ac0: 2a 2a 20 73 70 61 63 65 20 74 68 61 6e 20 74 68  ** space than th
5ad0: 61 74 20 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20  at limit allows 
5ae0: 66 6f 72 2c 20 74 72 75 6e 63 61 74 65 20 69 74  for, truncate it
5af0: 20 6e 6f 77 2e 20 54 68 65 72 65 20 69 73 20 6e   now. There is n
5b00: 6f 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  o need.    ** to
5b10: 20 73 79 6e 63 20 74 68 65 20 66 69 6c 65 20 66   sync the file f
5b20: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 70  ollowing this op
5b30: 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  eration..    */.
5b40: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5b50: 54 45 5f 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e  TE_OK && iLimit>
5b60: 30 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 73  0 ){.      i64 s
5b70: 7a 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  z;.      rc = sq
5b80: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5b90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
5ba0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
5bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a  =SQLITE_OK && sz
5bc0: 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  >iLimit ){.     
5bd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5be0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
5bf0: 2d 3e 6a 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a  ->jfd, iLimit);.
5c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5c10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5c20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
5c30: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
5c40: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
5c50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5c60: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
5c70: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
5c80: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
5c90: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
5ca0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5cb0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
5cc0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
5cd0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
5ce0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5cf0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
5d00: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
5d10: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
5d20: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
5d30: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5d40: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
5d50: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
5d60: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
5d70: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
5d80: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
5d90: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
5da0: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
5db0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
5dc0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
5dd0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
5de0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
5df0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
5e00: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
5e10: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34   journal..** - 4
5e20: 20 62 79 74 65 73 3a 20 44 61 74 61 62 61 73 65   bytes: Database
5e30: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a   page size..** .
5e40: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
5e50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
5e60: 20 32 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e   28) bytes of un
5e70: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
5e80: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
5e90: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5ea0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
5eb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5ec0: 20 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20    char *zHeader 
5ed0: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
5ee0: 61 63 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  ace;.  int nHead
5ef0: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  er = pPager->pag
5f00: 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72  eSize;.  int nWr
5f10: 69 74 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61  ite;..  if( nHea
5f20: 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  der>JOURNAL_HDR_
5f30: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
5f40: 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52    nHeader = JOUR
5f50: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5f60: 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  r);.  }..  if( p
5f70: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
5f80: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
5f90: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
5fa0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5fb0: 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b  Off;.  }..  seek
5fc0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5fd0: 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  r);.  pPager->jo
5fe0: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5ff0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
6000: 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72    memcpy(zHeader
6010: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6020: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6030: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a  Magic));..  /* .
6040: 20 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e    ** Write the n
6050: 52 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20  Rec Field - the 
6060: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
6070: 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c  ecords that foll
6080: 6f 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75  ow this.  ** jou
6090: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72  rnal header. Nor
60a0: 6d 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77  mally, zero is w
60b0: 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76  ritten to this v
60c0: 61 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d  alue at this tim
60d0: 65 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68  e..  ** After th
60e0: 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64  e records are ad
60f0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
6100: 61 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72  al (and the jour
6110: 6e 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a  nal synced, .  *
6120: 2a 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * if in full-syn
6130: 63 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72  c mode), the zer
6140: 6f 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  o is overwritten
6150: 20 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e   with the true n
6160: 75 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65  umber.  ** of re
6170: 63 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a  cords (see syncJ
6180: 6f 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a  ournal())..  **.
6190: 20 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c    ** A faster al
61a0: 74 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20  ternative is to 
61b0: 77 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46  write 0xFFFFFFFF
61c0: 20 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65   to the nRec fie
61d0: 6c 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65  ld. When.  ** re
61e0: 61 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ading the journa
61f0: 6c 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c  l this value tel
6200: 6c 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73  ls SQLite to ass
6210: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a  ume that the.  *
6220: 2a 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  * rest of the jo
6230: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
6240: 69 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72  ins valid page r
6250: 65 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73  ecords. This ass
6260: 75 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  umption.  ** is 
6270: 64 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66  dangerous, as if
6280: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72   a failure occur
6290: 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
62a0: 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
62b0: 0a 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61  .  ** file it ma
62c0: 79 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67  y contain some g
62d0: 61 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65  arbage data. The
62e0: 72 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61  re are two scena
62f0: 72 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20  rios.  ** where 
6300: 74 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65  this risk can be
6310: 20 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20   ignored:.  **. 
6320: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
6330: 20 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d   pager is in no-
6340: 73 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75  sync mode. Corru
6350: 70 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77  ption can follow
6360: 20 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65   a.  **     powe
6370: 72 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69  r failure in thi
6380: 73 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20  s case anyway.. 
6390: 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65   **.  **   * Whe
63a0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43  n the SQLITE_IOC
63b0: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66  AP_SAFE_APPEND f
63c0: 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73  lag is set. This
63d0: 20 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a   guarantees.  **
63e0: 20 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67       that garbag
63f0: 65 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20  e data is never 
6400: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
6410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
6420: 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  */.  assert(pPag
6430: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
6440: 7c 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ||pPager->noSync
6450: 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  );.  if( (pPager
6460: 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70 50  ->noSync) || (pP
6470: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
6480: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
6490: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20 20  MODE_MEMORY).   
64a0: 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65 76  || (sqlite3OsDev
64b0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
64c0: 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53  cs(pPager->fd)&S
64d0: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
64e0: 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20  _APPEND) .  ){. 
64f0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
6500: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6510: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78  urnalMagic)], 0x
6520: 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c  ffffffff);.  }el
6530: 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74  se{.    put32bit
6540: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6550: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6560: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ], 0);.  }..  /*
6570: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
6580: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
6590: 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  er */ .  sqlite3
65a0: 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
65b0: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
65c0: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
65d0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75  cksumInit);.  pu
65e0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
65f0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6600: 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65  Magic)+4], pPage
6610: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6620: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
6630: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
6640: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
6650: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
6660: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20  urnalMagic)+8], 
6670: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
6680: 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65  .  /* The assume
6690: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
66a0: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
66b0: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
66c0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
66d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d  ournalMagic)+12]
66e0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
66f0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
6700: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d  ger->journalHdr=
6710: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
6720: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
6730: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
6740: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
6750: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20  rnalMagic)+16], 
6760: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
6770: 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 6e 57  );.  }..  for(nW
6780: 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  rite=0; rc==SQLI
6790: 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c 4a 4f  TE_OK&&nWrite<JO
67a0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
67b0: 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d 6e 48  ger); nWrite+=nH
67c0: 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f 54 52  eader){.    IOTR
67d0: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
67e0: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
67f0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
6800: 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29 29 0a  lHdr, nHeader)).
6810: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6820: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6830: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 6e 48  jfd, zHeader, nH
6840: 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  eader, pPager->j
6850: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
6860: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6870: 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a 20  ff += nHeader;. 
6880: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
6890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
68a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
68b0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
68c0: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
68d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
68e0: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
68f0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
6900: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
6910: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
6920: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
6930: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
6940: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
6950: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
6960: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
6970: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
6980: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6990: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
69a0: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
69b0: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
69c0: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
69d0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
69e0: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
69f0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
6a00: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
6a10: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
6a20: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
6a30: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
6a40: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
6a50: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
6a60: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
6a70: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
6a80: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
6a90: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6aa0: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
6ab0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
6ac0: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
6ad0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
6ae0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6af0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
6b00: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
6b10: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
6b20: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
6b30: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
6b40: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
6b50: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6b60: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
6b70: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
6b80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
6b90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
6ba0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
6bb0: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
6bc0: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
6bd0: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
6be0: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
6bf0: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
6c00: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
6c10: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
6c20: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
6c30: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
6c40: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
6c50: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a  eader */.  i64 j
6c60: 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50  rnlOff;.  int iP
6c70: 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73 65 65 6b  ageSize;..  seek
6c80: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6c90: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
6ca0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6cb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6cc0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6cd0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6ce0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6cf0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
6d00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
6d10: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6d20: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6d30: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6d40: 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  of(aMagic), jrnl
6d50: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Off);.  if( rc )
6d60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72   return rc;.  jr
6d70: 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65 6f 66 28  nlOff += sizeof(
6d80: 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69 66 28 20  aMagic);..  if( 
6d90: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
6da0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6db0: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
6dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6dd0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6de0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6df0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6e00: 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65 63 29 3b  jrnlOff, pNRec);
6e10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6e20: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
6e30: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6e40: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34  ->jfd, jrnlOff+4
6e50: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6e60: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6e70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6e80: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6e90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
6ea0: 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69 7a 65 29  lOff+8, pDbSize)
6eb0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6ec0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6ed0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6ee0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
6ef0: 31 36 2c 20 28 75 33 32 20 2a 29 26 69 50 61 67  16, (u32 *)&iPag
6f00: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
6f10: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20  ==SQLITE_OK .   
6f20: 26 26 20 69 50 61 67 65 53 69 7a 65 3e 3d 35 31  && iPageSize>=51
6f30: 32 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69  2 .   && iPageSi
6f40: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
6f50: 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 26 26 20  AGE_SIZE .   && 
6f60: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
6f70: 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 0a 20 20  PageSize)==0 .  
6f80: 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65 73  ){.    u16 pages
6f90: 69 7a 65 20 3d 20 69 50 61 67 65 53 69 7a 65 3b  ize = iPageSize;
6fa0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
6fb0: 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
6fc0: 65 28 70 50 61 67 65 72 2c 20 26 70 61 67 65 73  e(pPager, &pages
6fd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
6fe0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6ff0: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
7000: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
7010: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
7020: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
7030: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
7040: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
7050: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
7060: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
7070: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
7080: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
7090: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
70a0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
70b0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
70c0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
70d0: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
70e0: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
70f0: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
7100: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
7110: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
7120: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
7130: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
7140: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
7150: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
7160: 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d 3e 73  f+12, &pPager->s
7170: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
7180: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
7190: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
71a0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 26 20 28 70  >sectorSize & (p
71b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
71c0: 65 2d 31 29 29 21 3d 30 0a 20 20 20 20 20 20 20  e-1))!=0.       
71d0: 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 63    || pPager->sec
71e0: 74 6f 72 53 69 7a 65 3e 30 78 31 30 30 30 30 30  torSize>0x100000
71f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7200: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
7210: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7220: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
7230: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7240: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7250: 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
7260: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
7270: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
7280: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
7290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
72a0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
72b0: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
72c0: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
72d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
72e0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
72f0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
7300: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
7310: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
7320: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
7330: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
7340: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
7350: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
7360: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
7370: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
7380: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
7390: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
73a0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
73b0: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
73c0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
73d0: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
73e0: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
73f0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
7400: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
7410: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
7420: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
7430: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
7440: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
7450: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
7460: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7470: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
7480: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
7490: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
74a0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
74b0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
74c0: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
74d0: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
74e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
74f0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
7500: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
7510: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
7520: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7530: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
7540: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
7550: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
7560: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
7570: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
7580: 69 3b 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66  i; .  i64 jrnlOf
7590: 66 3b 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a  f;.  i64 jrnlSiz
75a0: 65 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  e;.  u32 cksum =
75b0: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
75c0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
75d0: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
75e0: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
75f0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7600: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7610: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
7620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
7630: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
7640: 45 5f 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72  E_MEMORY ) retur
7650: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
7660: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
7670: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
7680: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
7690: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
76a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
76b0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
76c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
76d0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
76e0: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
76f0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
7700: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
7710: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
7720: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
7730: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
7740: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
7750: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
7760: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
7770: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
7780: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
7790: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
77a0: 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72   ){.    seekJour
77b0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
77c0: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
77d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
77e0: 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ff;.  pPager->jo
77f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
7800: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
7810: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
7820: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
7830: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
7840: 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63  ager));.  if( rc
7850: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7860: 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f  turn rc;.  jrnlO
7870: 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d  ff += 4;..  rc =
7880: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
7890: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
78a0: 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f  ster, len, jrnlO
78b0: 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ff);.  if( rc!=S
78c0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
78d0: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
78e0: 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32  += len;..  put32
78f0: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7900: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7910: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7920: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7930: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7940: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7950: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7960: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7970: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
7980: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
7990: 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f  nalMagic), jrnlO
79a0: 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b  ff);.  jrnlOff +
79b0: 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  = 8+sizeof(aJour
79c0: 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61  nalMagic);.  pPa
79d0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
79e0: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
79f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
7a00: 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74  ger is in perist
7a10: 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  ent-journal mode
7a20: 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69  , then the physi
7a30: 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  cal .  ** journa
7a40: 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e  l-file may exten
7a50: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  d past the end o
7a60: 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  f the master-jou
7a70: 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  rnal name.  ** a
7a80: 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61  nd 8 bytes of ma
7a90: 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72  gic data just wr
7aa0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c  itten to the fil
7ab0: 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a  e. This is .  **
7ac0: 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75   dangerous becau
7ad0: 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72  se the code to r
7ae0: 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ollback a hot-jo
7af0: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
7b00: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
7b10: 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73   to find the mas
7b20: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter-journal name
7b30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
7b40: 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e   ** whether or n
7b50: 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ot the journal i
7b60: 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a  s hot. .  **.  *
7b70: 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20  * Easiest thing 
7b80: 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63  to do in this sc
7b90: 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75  enario is to tru
7ba0: 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  ncate the journa
7bb0: 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20  l .  ** file to 
7bc0: 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a  the required siz
7bd0: 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28  e..  */ .  if( (
7be0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20  rc==SQLITE_OK). 
7bf0: 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
7c00: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7c10: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53  ger->jfd, &jrnlS
7c20: 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ize))==SQLITE_OK
7c30: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
7c40: 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20  jrnlOff.  ){.   
7c50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7c60: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7c70: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  jfd, jrnlOff);. 
7c80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7c90: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
7ca0: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
7cb0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
7cc0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
7cd0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
7ce0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
7cf0: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
7d00: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
7d10: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
7d20: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
7d30: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
7d40: 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69  PgHdr *p;.  sqli
7d50: 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
7d60: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
7d70: 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20  pgno, 0, &p);.  
7d80: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
7d90: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d  ** Clear the in-
7da0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
7db0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
7dc0: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
7dd0: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
7de0: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
7df0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
7e00: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
7e10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
7e20: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
7e30: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
7e40: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
7e50: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
7e60: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
7e70: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
7e80: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
7e90: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
7ea0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7eb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7ec0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
7ed0: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
7ee0: 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50  Clear(pPager->pP
7ef0: 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Cache);.}../*.**
7f00: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7f10: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
7f20: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
7f30: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
7f40: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
7f50: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
7f60: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
7f70: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
7f80: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
7f90: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
7fa0: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
7fb0: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
7fc0: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
7fd0: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
7fe0: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
7ff0: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
8000: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
8010: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
8020: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
8030: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
8040: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
8050: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
8060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8070: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8080: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
8090: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
80a0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
80b0: 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b  nt rc = osUnlock
80c0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
80d0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
80e0: 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c ) pPager->errC
80f0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
8100: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
8110: 31 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  1;.    IOTRACE((
8120: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
8130: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
8140: 41 6c 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65  Always close the
8150: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
8160: 65 6e 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20  en dropping the 
8170: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20  database lock.. 
8180: 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
8190: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
81a0: 69 6f 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c  ion with journal
81b0: 5f 6d 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67  _mode=delete mig
81c0: 68 74 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65  ht.    ** delete
81d0: 20 74 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72   the file out fr
81e0: 6f 6d 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20  om under us..   
81f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
8200: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8210: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8220: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
8230: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
8240: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8250: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
8260: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
8270: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
8280: 61 6c 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  al);.      pPage
8290: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
82a0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
82b0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
82c0: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
82d0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50  lback);.      pP
82e0: 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
82f0: 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  lback = 0;.    }
8300: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65  ..    /* If Page
8310: 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  r.errCode is set
8320: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
8330: 66 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  f the pager cach
8340: 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20  e cannot be.    
8350: 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20  ** trusted. Now 
8360: 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 66  that the pager f
8370: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c  ile is unlocked,
8380: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8390: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68   the.    ** cach
83a0: 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
83b0: 65 64 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ed and the error
83c0: 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65   code safely cle
83d0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
83e0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
83f0: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66  Code ){.      if
8400: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8410: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
8420: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
8430: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
8440: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
8450: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
8460: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
8470: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
8480: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
8490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
84a0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
84b0: 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
84c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e       pPager->pIn
84d0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
84e0: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
84f0: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
8500: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8510: 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20  InUse = 0;.     
8520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8530: 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Off = 0;.      p
8540: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
8550: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
8560: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
8570: 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  oopen = 0;.     
8580: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8590: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
85a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
85b0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
85c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
85d0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
85e0: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
85f0: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
8600: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
8610: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
8620: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
8630: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8640: 49 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  If the pager has
8650: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
8660: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
8670: 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74  , .** do not att
8680: 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63  empt the rollbac
8690: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
86a0: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
86b0: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
86c0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72  p){.  if( p->err
86d0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
86e0: 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  && p->state>=PAG
86f0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8700: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
8710: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
8720: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
8730: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20  ollback(p);.    
8740: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
8750: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
8760: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b  pager_unlock(p);
8770: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8780: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
8790: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
87a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
87b0: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
87c0: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
87d0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
87e0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
87f0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
8800: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
8810: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
8820: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
8830: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
8840: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
8850: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
8860: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
8870: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
8880: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
8890: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
88a0: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
88b0: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
88c0: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
88d0: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
88e0: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
88f0: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
8900: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
8910: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
8920: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
8930: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
8940: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
8950: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
8960: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
8970: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
8980: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
8990: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
89a0: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
89b0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
89c0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
89d0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
89e0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
89f0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
8a00: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
8a10: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
8a20: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
8a30: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
8a40: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
8a50: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
8a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8a70: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
8a80: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
8a90: 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
8aa0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
8ab0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
8ac0: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
8ad0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8ae0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
8af0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
8b00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8b10: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
8b20: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
8b30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
8b40: 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61  stmtOpen && !pPa
8b50: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
8b60: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
8b70: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
8b80: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
8b90: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
8ba0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
8bb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8bc0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
8bd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8be0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8bf0: 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
8c00: 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f    int isMemoryJo
8c10: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49  urnal = sqlite3I
8c20: 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sMemJournal(pPag
8c30: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
8c40: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
8c50: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
8c60: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8c70: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
8c80: 20 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a    if( !isMemoryJ
8c90: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
8ca0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8cb0: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
8cc0: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
8cd0: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
8ce0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
8cf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8d00: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8d10: 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
8d20: 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63  .         && (rc
8d30: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
8d40: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
8d50: 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , 0))==SQLITE_OK
8d60: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
8d70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8d80: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8d90: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8da0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
8db0: 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
8dc0: 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c  iveMode .     ||
8dd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8de0: 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
8df0: 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
8e00: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20      ){.      rc 
8e10: 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  = zeroJournalHdr
8e20: 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74  (pPager, hasMast
8e30: 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  er);.      pager
8e40: 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
8e50: 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  c);.      pPager
8e60: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8e70: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8e80: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8e90: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8ea0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8eb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
8ec0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
8ed0: 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63  ODE_DELETE || rc
8ee0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8ef0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
8f00: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
8f10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
8f20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
8f30: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8f40: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
8f50: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
8f60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
8f70: 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  te(pPager->pVfs,
8f80: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
8f90: 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
8fa0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8fb0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8fc0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
8fd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
8fe0: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8ff0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
9000: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
9010: 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  pAlwaysRollback)
9020: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
9030: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
9040: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
9050: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9060: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74   sqlite3PcacheIt
9070: 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65  erateDirty(pPage
9080: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
9090: 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b  r_set_pagehash);
90a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
90b0: 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
90c0: 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
90d0: 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  e);.    pPager->
90e0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
90f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
9100: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
9110: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9120: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
9130: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
9140: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
9150: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
9160: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
9170: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
9180: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
9190: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
91a0: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
91b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
91c0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
91d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
91e0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
91f0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
9200: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
9210: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
9220: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
9230: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
9240: 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c  c = 0;.  /* lruL
9250: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
9260: 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  d(pPager); */.  
9270: 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
9280: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
9290: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 70 50 61   = -1;.  }.  pPa
92a0: 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
92b0: 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  = 0;..  return (
92c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63  rc==SQLITE_OK?rc
92d0: 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  2:rc);.}../*.** 
92e0: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
92f0: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
9300: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
9310: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
9320: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
9330: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
9340: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
9350: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
9360: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
9370: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
9380: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
9390: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
93a0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
93b0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
93c0: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
93d0: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
93e0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
93f0: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
9400: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
9410: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
9420: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
9430: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
9440: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
9450: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
9460: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
9470: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
9480: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
9490: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
94a0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
94b0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
94c0: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
94d0: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
94e0: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
94f0: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
9500: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
9510: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
9520: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9530: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
9540: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
9550: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
9560: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
9570: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
9580: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
9590: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
95a0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
95b0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
95c0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
95d0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
95e0: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
95f0: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
9600: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
9610: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
9620: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
9630: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
9640: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
9650: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
9660: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
9670: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
9680: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
9690: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
96a0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
96b0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
96c0: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
96d0: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
96e0: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
96f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
9700: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
9710: 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74  , const u8 *aDat
9720: 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  a){.  u32 cksum 
9730: 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
9740: 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  nit;.  int i = p
9750: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d  Pager->pageSize-
9760: 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e  200;.  while( i>
9770: 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  0 ){.    cksum +
9780: 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20  = aData[i];.    
9790: 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20  i -= 200;.  }.  
97a0: 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a  return cksum;.}.
97b0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
97c0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
97d0: 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e  c void makeClean
97e0: 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (PgHdr*);../*.**
97f0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
9800: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
9810: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
9820: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
9830: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
9840: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
9850: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  age..**.** The i
9860: 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69  sMainJrnl flag i
9870: 73 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69  s true if this i
9880: 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  s the main rollb
9890: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a  ack journal and.
98a0: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65  ** false for the
98b0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
98c0: 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f  al.  The main ro
98d0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75  llback journal u
98e0: 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73  ses.** checksums
98f0: 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74   - the statement
9900: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
9910: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
9920: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
9930: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
9940: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
9950: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
9960: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
9970: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
9980: 65 20 2a 6a 66 64 2c 20 20 20 2f 2a 20 54 68 65  e *jfd,   /* The
9990: 20 66 69 6c 65 20 74 68 61 74 20 69 73 20 74 68   file that is th
99a0: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 69 6e 67 20  e journal being 
99b0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20  rolled back */. 
99c0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20 20   i64 offset,    
99d0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
99e0: 6f 66 20 74 68 65 20 70 61 67 65 20 77 69 74 68  of the page with
99f0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
9a00: 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a 72  /.  int isMainJr
9a10: 6e 6c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  nl       /* True
9a20: 20 66 6f 72 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   for main rollba
9a30: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 46 61 6c 73  ck journal. Fals
9a40: 65 20 66 6f 72 20 53 74 6d 74 20 6a 72 6e 6c 20  e for Stmt jrnl 
9a50: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
9a60: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
9a90: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9aa0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9ad0: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9ae0: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9af0: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b10: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9b20: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
9b30: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
9b40: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
9b50: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
9b60: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
9b70: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
9b80: 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 73   /* isMainJrnl s
9b90: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
9ba0: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
9bb0: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
9bc0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
9bd0: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
9be0: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
9bf0: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
9c00: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
9c10: 64 20 3d 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c  d == (isMainJrnl
9c20: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
9c30: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
9c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
9c50: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
9c60: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
9c70: 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  set, &pgno);.  i
9c80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9c90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9ca0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9cb0: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
9cc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
9cd0: 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66   offset+4);.  if
9ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9cf0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
9d00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9d10: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
9d20: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
9d30: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
9d40: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
9d50: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
9d60: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
9d70: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
9d80: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
9d90: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
9da0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
9db0: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
9dc0: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
9dd0: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
9de0: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
9df0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
9e00: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
9e10: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
9e20: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
9e30: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
9e40: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
9e50: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
9e60: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
9e70: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
9e80: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9e90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
9ea0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
9eb0: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
9ec0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
9ed0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9ee0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  _OK;.  }.  if( i
9ef0: 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20  sMainJrnl ){.   
9f00: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
9f10: 28 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61  (jfd, offset+pPa
9f20: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c  ger->pageSize+4,
9f30: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66   &cksum);.    if
9f40: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
9f50: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
9f60: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
9f70: 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73     if( pager_cks
9f80: 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  um(pPager, aData
9f90: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
9fa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9fb0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
9fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9fd0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
9fe0: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
9ff0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a000: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
a010: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
a020: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
a030: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
a040: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
a050: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
a060: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
a070: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
a080: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
a090: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
a0a0: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
a0b0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
a0c0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
a0d0: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
a0e0: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
a0f0: 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20  ** An exception 
a100: 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c  to the above rul
a110: 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e: If the databa
a120: 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63  se is in no-sync
a130: 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61   mode.  ** and a
a140: 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64   page is moved d
a150: 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65  uring an increme
a160: 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e  ntal vacuum then
a170: 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20   the page may.  
a180: 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  ** not be in the
a190: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61   pager cache. La
a1a0: 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63  ter: if a malloc
a1b0: 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f  () or IO error o
a1c0: 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e  ccurs.  ** durin
a1d0: 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63  g a Movepage() c
a1e0: 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61  all, then the pa
a1f0: 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ge may not be in
a200: 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20   the cache.  ** 
a210: 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63  either. So the c
a220: 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62  ondition describ
a230: 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  ed in the above 
a240: 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74  paragraph is not
a250: 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62  .  ** assert()ab
a260: 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
a270: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
a280: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
a290: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
a2a0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
a2b0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
a2c0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
a2d0: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
a2e0: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
a2f0: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
a300: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
a310: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
a320: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
a330: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
a340: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
a350: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
a360: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
a370: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
a380: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
a390: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
a3a0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
a3b0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
a3c0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
a3d0: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
a3e0: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
a3f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
a400: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
a410: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
a420: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
a430: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
a440: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
a450: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
a460: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
a470: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
a480: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
a490: 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20  synced into the 
a4a0: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
a4b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
a4c0: 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20  erwise, a power 
a4d0: 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65  loss might leave
a4e0: 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69   modified data i
a4f0: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
a500: 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74  ase file without
a510: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
a520: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
a530: 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20  l that can.  ** 
a540: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
a550: 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67  base to its orig
a560: 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20  inal form.  Two 
a570: 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20  conditions must 
a580: 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f  be.  ** met befo
a590: 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  re writing to th
a5a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  e database files
a5b0: 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61  . (1) the databa
a5c0: 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  se must be.  ** 
a5d0: 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20  locked.  (2) we 
a5e0: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72  know that the or
a5f0: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
a600: 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e  ent is fully syn
a610: 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ced.  ** in the 
a620: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
a630: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
a640: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
a650: 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a  ache or else.  *
a660: 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61  * the page is ma
a670: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
a680: 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32  ==0..  **.  ** 2
a690: 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e  008-04-14:  When
a6a0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76   attempting to v
a6b0: 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20  acuum a corrupt 
a6c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
a6d0: 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
a6e0: 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61  le to fail a sta
a6f0: 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61  tement on a data
a700: 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e  base that does n
a710: 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20  ot yet exist..  
a720: 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70  ** Do not attemp
a730: 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61  t to write if da
a740: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
a750: 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65  never been opene
a760: 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  d..  */.  pPg = 
a770: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
a780: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41  ger, pgno);.  PA
a790: 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42  GERTRACE4("PLAYB
a7a0: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68  ACK %d page %d h
a7b0: 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
a7d0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
a7e0: 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61  no, pager_dataha
a7f0: 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  sh(pPager->pageS
a800: 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20  ize, aData));.  
a810: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
a820: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
a830: 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d  IVE).   && (pPg=
a840: 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
a850: 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
a860: 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28 70 50  SYNC)).   && (pP
a870: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
a880: 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  ds).  ){.    i64
a890: 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31 29   ofst = (pgno-1)
a8a0: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
a8b0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  geSize;.    rc =
a8c0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
a8d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
a8e0: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
a8f0: 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 7d 0a  ize, ofst);.  }.
a900: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
a910: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
a920: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
a930: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
a940: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
a950: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
a960: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
a970: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
a980: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
a990: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
a9a0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
a9b0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
a9c0: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
a9d0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
a9e0: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
a9f0: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
aa00: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
aa10: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
aa20: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
aa30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
aa40: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
aa50: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
aa60: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
aa70: 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
aa80: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
aa90: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
aaa0: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
aab0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
aac0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
aad0: 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b 0a  xReiniter(pPg);.
aae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73      }.    if( is
aaf0: 4d 61 69 6e 4a 72 6e 6c 20 29 20 6d 61 6b 65 43  MainJrnl ) makeC
ab00: 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65  lean(pPg);.#ifde
ab10: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ab20: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
ab30: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
ab40: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
ab50: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
ab60: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
ab70: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
ab80: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
ab90: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
aba0: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
abb0: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
abc0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
abd0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
abe0: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
abf0: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
ac00: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
ac10: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
ac20: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
ac30: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
ac40: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
ac50: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
ac60: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
ac70: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
ac80: 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   3);.    sqlite3
ac90: 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70 50  PcacheRelease(pP
aca0: 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
acb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
acc0: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
acd0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
ace0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
acf0: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
ad00: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
ad10: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
ad20: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
ad30: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
ad40: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
ad50: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
ad60: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
ad70: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
ad80: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
ad90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
ada0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
adb0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72   it is..**.** Ar
adc0: 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d  gument zMaster m
add0: 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61 67 65  ay point to Page
ade0: 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53 6f 20  r.pTmpSpace. So 
adf0: 74 68 61 74 20 62 75 66 66 65 72 20 69 73 20 6e  that buffer is n
ae00: 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ot .** available
ae10: 20 66 6f 72 20 75 73 65 20 77 69 74 68 69 6e 20   for use within 
ae20: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
ae30: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  *.**.** The mast
ae40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
ae50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
ae60: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
ae70: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
ae80: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
ae90: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
aea0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
aeb0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
aec0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
aed0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
aee0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
aef0: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
af00: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
af10: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
af20: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
af30: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
af40: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
af50: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
af60: 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70  lmaster(Pager *p
af70: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
af80: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73  r *zMaster){.  s
af90: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
afa0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
afb0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
afc0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
afd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
afe0: 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c   *pMaster;.  sql
aff0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72  ite3_file *pJour
b000: 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  nal;.  char *zMa
b010: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
b020: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
b030: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b040: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
b050: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
b060: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
b070: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b080: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
b090: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b0a0: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
b0b0: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
b0c0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
b0d0: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
b0e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
b0f0: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
b100: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
b110: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
b120: 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74  pMaster = (sqlit
b130: 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65  e3_file *)sqlite
b140: 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a  3Malloc(pVfs->sz
b150: 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70  OsFile * 2);.  p
b160: 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74  Journal = (sqlit
b170: 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75 38 20  e3_file *)(((u8 
b180: 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70 56 66  *)pMaster) + pVf
b190: 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20  s->szOsFile);.  
b1a0: 69 66 28 20 21 70 4d 61 73 74 65 72 20 29 7b 0a  if( !pMaster ){.
b1b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b1c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
b1d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
b1e0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
b1f0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
b200: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
b210: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
b220: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
b230: 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72  zMaster, pMaster
b240: 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d  , flags, 0);.  }
b250: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b260: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
b270: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
b280: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20  ter_open = 1;.. 
b290: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b2a0: 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65 72 2c  ileSize(pMaster,
b2b0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
b2c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b2d0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
b2e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
b2f0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
b300: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
b310: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
b320: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
b330: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
b340: 61 73 74 65 72 50 74 72 20 3d 20 70 50 61 67 65  asterPtr = pPage
b350: 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
b360: 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c  ame+1;..    /* L
b370: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
b380: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b390: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
b3a0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
b3b0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
b3c0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
b3d0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
b3e0: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
b3f0: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
b400: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
b410: 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  e3Malloc(nMaster
b420: 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73 74 65  Journal + nMaste
b430: 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28 20 21  rPtr);.    if( !
b440: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
b450: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
b460: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
b470: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
b480: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  out;.    }.    z
b490: 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61  MasterPtr = &zMa
b4a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73  sterJournal[nMas
b4b0: 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20  terJournal];.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
b4d0: 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d 61  ead(pMaster, zMa
b4e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
b4f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  sterJournal, 0);
b500: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b510: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
b520: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
b530: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
b540: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
b550: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
b560: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
b570: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
b580: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78   ){.      int ex
b590: 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d  ists;.      rc =
b5a0: 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
b5b0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
b5c0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
b5d0: 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b  XISTS, &exists);
b5e0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
b5f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b600: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
b610: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  er_out;.      }.
b620: 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74 73        if( exists
b630: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
b640: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
b650: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
b660: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b670: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
b680: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
b690: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
b6a0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
b6b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
b6c0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
b6d0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
b6e0: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
b6f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
b700: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b710: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
b720: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
b730: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
b740: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
b750: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
b760: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
b770: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
b780: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
b790: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
b7a0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
b7b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b7c0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
b7d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
b7e0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
b7f0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
b800: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
b810: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
b820: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
b830: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
b840: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
b850: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b860: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
b870: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b880: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
b890: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
b8a0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
b8b0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
b8c0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
b8d0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
b8e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
b8f0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
b900: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
b910: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b920: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
b930: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
b940: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
b950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
b960: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
b970: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
b980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
b990: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
b9a0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
b9b0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
b9c0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
b9d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
b9e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
b9f0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
ba00: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
ba10: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
ba20: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
ba30: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
ba40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
ba50: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
ba60: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
ba70: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
ba80: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
ba90: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
baa0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
bab0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
bac0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
bad0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
bae0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
baf0: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
bb00: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
bb10: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
bb20: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
bb30: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
bb40: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
bb50: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
bb60: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
bb70: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
bb80: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
bb90: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
bba0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
bbb0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
bbc0: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
bbd0: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
bbe0: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
bbf0: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
bc00: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
bc10: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
bc20: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
bc30: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
bc40: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
bc50: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
bc60: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
bc70: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
bc80: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
bc90: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
bca0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
bcb0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
bcc0: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
bcd0: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
bce0: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
bcf0: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
bd00: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
bd10: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
bd20: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
bd30: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
bd40: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
bd50: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
bd60: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bd70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
bd80: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
bd90: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
bda0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
bdb0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
bdc0: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
bdd0: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
bde0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
bdf0: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
be00: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
be10: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
be20: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
be30: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
be40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
be50: 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
be60: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
be70: 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
be80: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
be90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bea0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
beb0: 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
bec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
bee0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
bef0: 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
bf00: 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
bf10: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
bf20: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bf30: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bf40: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
bf50: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
bf60: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
bf70: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
bf80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
bf90: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
bfa0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
bfb0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
bfc0: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
bfd0: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
bfe0: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
bff0: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
c000: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
c010: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
c020: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
c030: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
c040: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
c050: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
c060: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
c070: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
c080: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
c090: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
c0a0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
c0b0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
c0c0: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
c0d0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
c0e0: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
c0f0: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
c100: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
c110: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
c120: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
c130: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
c140: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
c150: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
c160: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c170: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
c180: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
c190: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
c1a0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c1b0: 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
c1c0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
c1d0: 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
c1e0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
c1f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
c200: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
c210: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
c220: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
c230: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
c240: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
c250: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
c260: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
c270: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
c280: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
c290: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
c2a0: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
c2b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
c2c0: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
c2d0: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c2e0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
c2f0: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
c300: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
c310: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
c320: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
c330: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
c340: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
c350: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
c360: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
c370: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
c380: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
c390: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
c3a0: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
c3b0: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
c3c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
c3d0: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
c3e0: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
c3f0: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
c400: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c410: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
c420: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
c430: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
c440: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
c450: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
c460: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
c470: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
c480: 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
c490: 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
c4a0: 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
c4b0: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
c4c0: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
c4d0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
c4e0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
c4f0: 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
c500: 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
c510: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
c520: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c530: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
c540: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
c550: 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
c560: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
c570: 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
c580: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
c590: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
c5a0: 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
c5b0: 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
c5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c5d0: 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
c5e0: 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
c5f0: 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
c600: 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
c610: 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
c620: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
c630: 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
c640: 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
c650: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
c660: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
c670: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
c680: 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
c690: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
c6a0: 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
c6b0: 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
c6c0: 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
c6d0: 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
c6e0: 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
c6f0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
c700: 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
c710: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
c720: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
c730: 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
c740: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
c750: 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
c760: 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
c770: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
c780: 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
c790: 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
c7a0: 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
c7b0: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
c7c0: 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
c7d0: 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
c7e0: 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
c7f0: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
c800: 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
c810: 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
c820: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
c830: 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
c840: 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
c850: 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
c860: 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
c870: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
c880: 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
c890: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
c8a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
c8b0: 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
c8c0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
c8d0: 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
c8e0: 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
c8f0: 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
c900: 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
c910: 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
c920: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c930: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
c940: 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
c950: 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
c960: 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
c970: 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
c980: 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
c990: 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
c9a0: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
c9b0: 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
c9c0: 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
c9d0: 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
c9e0: 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
c9f0: 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
ca00: 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
ca10: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
ca20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
ca30: 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
ca40: 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
ca50: 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
ca60: 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
ca70: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
ca80: 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
ca90: 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
caa0: 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
cab0: 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
cac0: 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
cad0: 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
cae0: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
caf0: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
cb00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
cb10: 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
cb20: 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
cb30: 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
cb40: 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
cb50: 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
cb60: 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
cb70: 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
cb80: 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
cb90: 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
cba0: 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
cbb0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
cbc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
cbd0: 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
cbe0: 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
cbf0: 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
cc00: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
cc10: 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
cc20: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
cc30: 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
cc40: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
cc50: 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
cc60: 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
cc70: 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
cc80: 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
cc90: 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
cca0: 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
ccb0: 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
ccc0: 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
ccd0: 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
cce0: 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
ccf0: 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
cd00: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
cd10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
cd20: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
cd30: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
cd40: 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
cd50: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
cd60: 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
cd70: 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
cda0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
cdb0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
cdc0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
cdd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
cde0: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
cdf0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
ce00: 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
ce10: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
ce20: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
ce30: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
ce40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
ce50: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
ce60: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
ce70: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
cea0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
ceb0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
cec0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
ced0: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
cee0: 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
cef0: 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
cf00: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
cf10: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
cf20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
cf30: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
cf40: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
cf50: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
cf60: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
cf70: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
cf80: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
cf90: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
cfa0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
cfb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
cfc0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
cfd0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
cfe0: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
cff0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d000: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
d010: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
d020: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
d030: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
d040: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
d050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
d060: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
d070: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
d080: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
d090: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
d0a0: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
d0b0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
d0c0: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
d0d0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
d0e0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
d0f0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
d100: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
d110: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74  ck..  */.  zMast
d120: 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d  er = pPager->pTm
d130: 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 72  pSpace;.  rc = r
d140: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
d150: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
d160: 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70  aster, pPager->p
d170: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
d180: 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  1);.  if( rc==SQ
d190: 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74  LITE_OK && zMast
d1a0: 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63 20  er[0] ){.    rc 
d1b0: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
d1c0: 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  s(pVfs, zMaster,
d1d0: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
d1e0: 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20  XISTS, &res);.  
d1f0: 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b  }.  zMaster = 0;
d200: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d210: 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a  E_OK || !res ){.
d220: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
d230: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61  yback;.  }.  pPa
d240: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d250: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
d260: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
d270: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
d280: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
d290: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
d2a0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
d2b0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
d2c0: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
d2d0: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
d2e0: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
d2f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
d300: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d310: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
d320: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
d330: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
d340: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d350: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
d360: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
d370: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
d380: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
d390: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
d3a0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
d3b0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
d3c0: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
d3d0: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
d3e0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
d3f0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
d400: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
d410: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
d420: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
d430: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d440: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
d450: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
d460: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
d470: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
d480: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
d490: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
d4a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
d4b0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
d4c0: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
d4d0: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
d4e0: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
d4f0: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
d500: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
d510: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
d520: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
d530: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
d540: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
d550: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
d560: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
d570: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
d580: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
d590: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
d5a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
d5b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
d5c0: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
d5d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d5e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d5f0: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
d600: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
d610: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
d620: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
d630: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
d640: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
d650: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d660: 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64  If nRec is 0 and
d670: 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69   this rollback i
d680: 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  s of a transacti
d690: 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74 68  on created by th
d6a0: 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  is.    ** proces
d6b0: 73 20 61 6e 64 20 69 66 20 74 68 69 73 20 69 73  s and if this is
d6c0: 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65   the final heade
d6d0: 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r in the journal
d6e0: 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a  , then it means.
d6f0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73      ** that this
d700: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75   part of the jou
d710: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66  rnal was being f
d720: 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f  illed but has no
d730: 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a  t yet been.    *
d740: 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  * synced to disk
d750: 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e  .  Compute the n
d760: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 62  umber of pages b
d770: 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61  ased on the rema
d780: 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a  ining.    ** siz
d790: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20  e of the file.. 
d7a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
d7b0: 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74   third term of t
d7c0: 68 65 20 74 65 73 74 20 77 61 73 20 61 64 64 65  he test was adde
d7d0: 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20  d to fix ticket 
d7e0: 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20  #2565..    */.  
d7f0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
d800: 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
d810: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d820: 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
d830: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
d840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d850: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
d860: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d870: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
d880: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
d890: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
d8a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
d8b0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
d8c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
d8d0: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
d8e0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
d8f0: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
d900: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
d910: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
d920: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d930: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
d940: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
d950: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
d960: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d970: 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
d980: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d990: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d9a0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
d9b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d9c0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
d9d0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
d9e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
d9f0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
da00: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
da10: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b   */.    for(u=0;
da20: 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20   u<nRec; u++){. 
da30: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
da40: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
da50: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
da60: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
da70: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
da80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
da90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
daa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dab0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
dac0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
dad0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
dae0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
daf0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
db00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
db10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
db20: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e   /* If we are un
db30: 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
db40: 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
db50: 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79 0a  ase is probably.
db60: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67 6f 69            ** goi
db70: 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62 65 69  ng to end up bei
db80: 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49 74 20  ng corrupt.  It 
db90: 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20 75 73  is corrupt to us
dba0: 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20  , anyhow..      
dbb0: 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74      ** Perhaps t
dbc0: 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73 73 20  he next process 
dbd0: 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61  to come along ca
dbe0: 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20  n fix it.....   
dbf0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
dc00: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
dc10: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
dc20: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
dc30: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
dc40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
dc50: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
dc60: 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74  ACHED*/.  assert
dc70: 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ( 0 );..end_play
dc80: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
dc90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dca0: 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
dcb0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
dcc0: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
dcd0: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
dce0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
dcf0: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
dd00: 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a  athname+1);.  }.
dd10: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dd20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
dd30: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
dd40: 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a 4d  ction(pPager, zM
dd50: 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29 3b  aster[0]!='\0');
dd60: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
dd70: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
dd80: 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
dd90: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
dda0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
ddb0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
ddc0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
ddd0: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
dde0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
ddf0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
de00: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
de10: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
de20: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
de30: 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
de40: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
de50: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
de60: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
de70: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
de80: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
de90: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
dea0: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
deb0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
dec0: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
ded0: 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
dee0: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
def0: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
df00: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
df10: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
df20: 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
df30: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
df40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
df50: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
df60: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
df70: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
df80: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
df90: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dfa0: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
dfb0: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
dfc0: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
dfd0: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
dfe0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
dff0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
e000: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
e010: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
e020: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
e030: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
e040: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
e050: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
e060: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
e070: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
e080: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
e090: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
e0a0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e0b0: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
e0c0: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
e0d0: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
e0e0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e0f0: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
e100: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
e110: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
e120: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
e130: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
e140: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
e150: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e170: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
e180: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
e190: 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20    i64 hdrOff;.  
e1a0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
e1b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e1c0: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
e1d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
e1f0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
e200: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20   int rc;..  szJ 
e210: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
e220: 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  lOff;..  /* Set 
e230: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
e240: 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
e250: 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
e260: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
e270: 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
e280: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
e290: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
e2a0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
e2b0: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
e2c0: 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
e2d0: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
e2e0: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
e2f0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
e300: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
e310: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
e320: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
e330: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
e340: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
e350: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
e360: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
e370: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
e380: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
e390: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
e3a0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
e3b0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
e3c0: 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
e3d0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
e3e0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
e3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e400: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
e410: 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f  R_SHARED );..  /
e420: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e430: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
e440: 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  e in the stateme
e450: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  nt journal..  */
e460: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e470: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
e480: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e490: 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20  pen );.  nRec = 
e4a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
e4b0: 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  ;.  .  /* Copy o
e4c0: 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75  riginal pages ou
e4d0: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
e4e0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  nt journal and b
e4f0: 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  ack into the.  *
e500: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
e510: 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
e520: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e530: 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d  l omits checksum
e540: 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68  s from.  ** each
e550: 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f   record since po
e560: 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f  wer-failure reco
e570: 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f  very is not impo
e580: 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65  rtant to stateme
e590: 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73  nt.  ** journals
e5a0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
e5b0: 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a  ; i<nRec; i++){.
e5c0: 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
e5d0: 20 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61   i*(4+pPager->pa
e5e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20  geSize);.    rc 
e5f0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
e600: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
e610: 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
e620: 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20 20 20 20  offset, 0);.    
e630: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e640: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
e650: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e660: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
e670: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
e680: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
e690: 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
e6a0: 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
e6b0: 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
e6c0: 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
e6d0: 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
e6e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
e6f0: 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
e700: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
e710: 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
e720: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
e730: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
e740: 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
e750: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
e760: 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
e770: 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
e780: 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
e790: 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
e7a0: 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
e7b0: 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
e7c0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
e7d0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
e7e0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
e7f0: 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
e800: 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
e810: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e820: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  */.  pPager->jou
e830: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
e840: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
e850: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e860: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
e870: 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
e880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e890: 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
e8a0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
e8b0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
e8c0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
e8d0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
e8e0: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
e8f0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e900: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
e910: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e920: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
e930: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
e940: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
e950: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
e960: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
e970: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
e980: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
e990: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
e9a0: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
e9b0: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
e9c0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
e9d0: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
e9e0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
e9f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ea00: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ea10: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
ea20: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
ea30: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
ea40: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
ea50: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
ea60: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
ea70: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
ea80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
ea90: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
eaa0: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
eab0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
eac0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
ead0: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
eae0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
eaf0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
eb00: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
eb10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
eb20: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
eb30: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
eb40: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
eb50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
eb60: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
eb70: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
eb80: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
eb90: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
eba0: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
ebb0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
ebc0: 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20  QLITE_OK) {.    
ebd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ebe0: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a  ff = szJ;.    /*
ebf0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
ec00: 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a  che(pPager); */.
ec10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ec20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
ec30: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
ec40: 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
ec50: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
ec60: 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
ec70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
ec80: 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
ec90: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
eca0: 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
ecb0: 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
ecc0: 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
ecd0: 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
ece0: 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
ecf0: 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
ed00: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
ed10: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
ed20: 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
ed30: 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
ed40: 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
ed50: 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
ed60: 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
ed70: 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
ed80: 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
ed90: 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
eda0: 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
edb0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
edc0: 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
edd0: 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
ede0: 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
edf0: 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
ee00: 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
ee10: 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
ee20: 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
ee30: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
ee40: 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
ee50: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
ee60: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
ee70: 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
ee80: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
ee90: 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
eea0: 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
eeb0: 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
eec0: 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
eed0: 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
eee0: 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
ef00: 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
ef10: 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
ef20: 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
ef30: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
ef40: 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
ef50: 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
ef60: 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
ef70: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
ef80: 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
ef90: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
efa0: 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
efb0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
efc0: 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
efd0: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
efe0: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
eff0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
f000: 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
f010: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f020: 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
f030: 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
f040: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
f050: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
f060: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
f070: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
f080: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f090: 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
f0a0: 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
f0b0: 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
f0c0: 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
f0d0: 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
f0e0: 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
f0f0: 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
f100: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
f110: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
f120: 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
f130: 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
f140: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
f150: 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
f160: 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
f170: 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
f180: 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
f190: 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
f1a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f1b0: 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
f1c0: 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
f1d0: 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
f1e0: 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
f1f0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
f200: 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
f210: 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
f220: 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
f230: 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
f240: 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
f250: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
f260: 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20  ync =  level==1 
f270: 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
f280: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
f290: 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d  ullSync = level=
f2a0: 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =3 && !pPager->t
f2b0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
f2c0: 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
f2d0: 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49  (bFullFsync?SQLI
f2e0: 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c  TE_SYNC_FULL:SQL
f2f0: 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
f300: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f310: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
f320: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
f330: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f340: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
f350: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
f360: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
f370: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
f380: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
f390: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
f3a0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
f3b0: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
f3c0: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
f3d0: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
f3e0: 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
f3f0: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
f400: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
f410: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
f420: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
f430: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
f440: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
f450: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f460: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
f470: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
f480: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
f490: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
f4a0: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
f4b0: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
f4c0: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
f4d0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a   the temporary.*
f4e0: 2a 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  * file when it i
f4f0: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  s closed..*/.sta
f500: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50  tic int sqlite3P
f510: 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20  agerOpentemp(.  
f520: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
f530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
f540: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73  er object */.  s
f550: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
f560: 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68  le,  /* Write th
f570: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
f580: 72 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  r here */.  int 
f590: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
f5a0: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
f5b0: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
f5c0: 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
f5d0: 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
f5e0: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
f5f0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
f600: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
f610: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
f620: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
f630: 65 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67  endif..  vfsFlag
f640: 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45  s |=  SQLITE_OPE
f650: 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
f660: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
f670: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   |.            S
f680: 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
f690: 53 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  SIVE | SQLITE_OP
f6a0: 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
f6b0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
f6c0: 4f 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70  OsOpen(pPager->p
f6d0: 56 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76  Vfs, 0, pFile, v
f6e0: 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61  fsFlags, 0);.  a
f6f0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
f700: 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  E_OK || pFile->p
f710: 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74  Methods );.  ret
f720: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69  urn rc;.}..stati
f730: 63 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73  c int pagerStres
f740: 73 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a  s(void *,PgHdr *
f750: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  );../*.** Create
f760: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
f770: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
f780: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
f790: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
f7a0: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
f7b0: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
f7c0: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
f7d0: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
f7e0: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
f7f0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
f800: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
f810: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
f820: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
f830: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
f840: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
f850: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
f860: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
f870: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
f880: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
f890: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
f8a0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
f8b0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
f8c0: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
f8d0: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
f8e0: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
f8f0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
f900: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
f910: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
f920: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
f930: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
f940: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
f950: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
f960: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
f970: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
f980: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
f990: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
f9a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f9b0: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
f9c0: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
f9d0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
f9e0: 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
f9f0: 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
fa00: 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
fa10: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
fa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
fa30: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
fa40: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
fa50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
fa60: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
fa70: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
fa80: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
fa90: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fab0: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
fac0: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
fad0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
fae0: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
faf0: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
fb00: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
fb10: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
fb20: 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
fb30: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61       /* flags pa
fb40: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
fb50: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
fb60: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  n() */.){.  u8 *
fb70: 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70  pPtr;.  Pager *p
fb80: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  Pager = 0;.  int
fb90: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
fba0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
fbb0: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
fbc0: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
fbd0: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
fbe0: 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
fbf0: 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
fc00: 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
fc10: 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
fc20: 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
fc30: 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
fc40: 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20  LOCK)!=0;.  int 
fc50: 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b  journalFileSize;
fc60: 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
fc70: 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
fc80: 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73  eSize();.  int s
fc90: 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
fca0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
fcb0: 53 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50  SIZE;.  char *zP
fcc0: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
fcd0: 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30  nt nPathname = 0
fce0: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
fcf0: 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
fd00: 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72  )>sqlite3MemJour
fd10: 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20  nalSize() ){.   
fd20: 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
fd30: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
fd40: 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d  lSize(pVfs);.  }
fd50: 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  else{.    journa
fd60: 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
fd70: 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
fd80: 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  e();.  }..  /* T
fd90: 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
fda0: 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
fdb0: 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
fdc0: 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
fdd0: 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74  pute and store t
fde0: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
fdf0: 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64   in an allocated
fe00: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a   buffer pointed.
fe10: 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68    ** to by zPath
fe20: 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61  name, length nPa
fe30: 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74  thname. Or, if t
fe40: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
fe50: 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65  ry file,.  ** le
fe60: 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61  ave both nPathna
fe70: 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65  me and zPathname
fe80: 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a   set to 0..  */.
fe90: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
fea0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
feb0: 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65  ){.    nPathname
fec0: 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
fed0: 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68  ame+1;.    zPath
fee0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
fef0: 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
ff00: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
ff10: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  name==0 ){.     
ff20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
ff30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  OMEM;.    }.#ifn
ff40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ff50: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
ff60: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
ff70: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
ff80: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
ff90: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68  = 1;.      zPath
ffa0: 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  name[0] = 0;.   
ffb0: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
ffc0: 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73    {.      rc = s
ffd0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ffe0: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
fff0: 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c  name, nPathname,
10000 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   zPathname);.   
10010 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
10020 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10030 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10040 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
10050 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10060 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  }.    nPathname 
10070 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61  = strlen(zPathna
10080 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
10090 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
100a0 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
100b0 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
100c0 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
100d0 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
100e0 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
100f0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
10100 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
10110 20 20 70 63 61 63 68 65 53 69 7a 65 20 20 20 20    pcacheSize    
10120 20 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a    +           /*
10130 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 2a   PCache object *
10140 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
10150 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20 20 20  eSize +         
10160 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
10170 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
10180 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a  */ .    pVfs->sz
10190 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20 20 20  OsFile  +       
101a0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
101b0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 6a  db file */.    j
101c0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2a  ournalFileSize *
101d0 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20 54 68   2 +       /* Th
101e0 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69  e two journal fi
101f0 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e 50  les */ .    3*nP
10200 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20 20 20  athname + 40    
10210 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
10220 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72 79  name, zDirectory
10230 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  , zJournal */.  
10240 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
10250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
10260 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
10270 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10280 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
10290 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 20  pPager->pPCache 
102a0 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70 50 61  = (PCache *)&pPa
102b0 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72 20 3d  ger[1];.  pPtr =
102c0 20 28 28 75 38 20 2a 29 26 70 50 61 67 65 72 5b   ((u8 *)&pPager[
102d0 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69 7a 65  1]) + pcacheSize
102e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46  ;.  pPager->vfsF
102f0 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67 73 3b  lags = vfsFlags;
10300 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
10310 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
10320 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
10330 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67 65 72  ile*0];.  pPager
10340 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c 69 74 65  ->stfd = (sqlite
10350 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
10360 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b 0a 20  fs->szOsFile];. 
10370 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28   pPager->jfd = (
10380 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
10390 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
103a0 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  le+journalFileSi
103b0 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  ze];.  pPager->z
103c0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
103d0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
103e0 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e 61 6c  OsFile+2*journal
103f0 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
10400 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
10410 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
10420 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
10430 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
10440 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
10450 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
10460 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
10470 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  er->pVfs = pVfs;
10480 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d 65  .  if( zPathname
10490 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   ){.    memcpy(p
104a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
104b0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
104c0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20 73  thname+1);.    s
104d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
104e0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
104f0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
10500 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
10510 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
10520 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
10530 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28  memDb ){.    if(
10540 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73   nPathname>(pVfs
10550 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73  ->mxPathname - s
10560 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22  izeof("-journal"
10570 29 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  )) ){.      rc =
10580 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
10590 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
105a0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
105b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
105c0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
105d0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
105e0 65 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20  e, pPager->fd,. 
105f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10600 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10610 76 66 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29  vfsFlags, &fout)
10620 3b 0a 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79  ;.      readOnly
10630 20 3d 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f   = (fout&SQLITE_
10640 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
10650 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10660 20 66 69 6c 65 20 77 61 73 20 73 75 63 63 65 73   file was succes
10670 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  sfully opened fo
10680 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63  r read/write acc
10690 65 73 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68  ess,.      ** ch
106a0 6f 6f 73 65 20 61 20 64 65 66 61 75 6c 74 20 70  oose a default p
106b0 61 67 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65  age size in case
106c0 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
106d0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
106e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54  database file. T
106f0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 20  he default page 
10700 73 69 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69  size is the maxi
10710 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a  mum of:.      **
10720 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  .      **    + S
10730 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
10740 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a  GE_SIZE,.      *
10750 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
10760 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
10770 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
10780 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b  ().      **    +
10790 20 54 68 65 20 6c 61 72 67 65 73 74 20 70 61 67   The largest pag
107a0 65 20 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20  e size that can 
107b0 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
107c0 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  cally..      */.
107d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
107e0 4c 49 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64  LITE_OK && !read
107f0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
10800 69 6e 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20  int iSectorSize 
10810 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
10820 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
10830 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
10840 7a 50 61 67 65 44 66 6c 74 3c 69 53 65 63 74 6f  zPageDflt<iSecto
10850 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
10860 20 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20     szPageDflt = 
10870 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  iSectorSize;.   
10880 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
10890 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
108a0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
108b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
108c0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
108d0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
108e0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
108f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
10900 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
10910 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
10920 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
10930 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
10940 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
10950 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
10960 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
10970 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
10980 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
10990 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
109a0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
109b0 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
109c0 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
109d0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
109e0 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
109f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
10a00 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  Dc&(SQLITE_IOCAP
10a10 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29  _ATOMIC|(ii>>8))
10a20 20 29 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20   ) szPageDflt = 
10a30 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
10a40 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
10a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50  .        if( szP
10a60 61 67 65 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d  ageDflt>SQLITE_M
10a70 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
10a80 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
10a90 20 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53    szPageDflt = S
10aa0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
10ab0 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20  T_PAGE_SIZE;.   
10ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
10ad0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
10ae0 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f 72    /* If a tempor
10af0 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71 75  ary file is requ
10b00 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ested, it is not
10b10 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61 74   opened immediat
10b20 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ely..    ** In t
10b30 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63 65  his case we acce
10b40 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  pt the default p
10b50 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65 6c  age size and del
10b60 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20 20  ay actually.    
10b70 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 66  ** opening the f
10b80 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66 69  ile until the fi
10b90 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72  rst call to OsWr
10ba0 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ite()..    **.  
10bb0 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e 63 68    ** This branch
10bc0 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72   is also run for
10bd0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
10be0 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65  tabase. An in-me
10bf0 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61 74 61  mory.    ** data
10c00 62 61 73 65 20 69 73 20 74 68 65 20 73 61 6d 65  base is the same
10c10 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   as a temp-file 
10c20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20 77 72  that is never wr
10c30 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20  itten out to.   
10c40 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75 73 65   ** disk and use
10c50 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72  s an in-memory r
10c60 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
10c70 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d  .    */ .    tem
10c80 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70  pFile = 1;.    p
10c90 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
10ca0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
10cb0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
10cc0 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r && rc==SQLITE_
10cd0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
10ce0 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71  ->pTmpSpace = sq
10cf0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
10d00 73 7a 50 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d  szPageDflt);.  }
10d10 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
10d20 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69  or occured in ei
10d30 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63  ther of the bloc
10d40 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46  ks above..  ** F
10d50 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ree the Pager st
10d60 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73  ructure and clos
10d70 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  e the file..  **
10d80 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72   Since the pager
10d90 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   is not allocate
10da0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  d there is no ne
10db0 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20  ed to set .  ** 
10dc0 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73  any Pager.errMas
10dd0 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  k variables..  *
10de0 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20  /.  if( !pPager 
10df0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  || !pPager->pTmp
10e00 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c  Space ){.    sql
10e10 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
10e20 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
10e30 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
10e40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
10e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
10e60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
10e70 0a 20 20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20  .  }.  nExtra = 
10e80 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
10e90 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
10ea0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
10eb0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
10ec0 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
10ee0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
10ef0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
10f00 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
10f10 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
10f20 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
10f30 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
10f40 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
10f50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
10f60 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50  ;.  IOTRACE(("OP
10f70 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61  EN %p %s\n", pPa
10f80 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  ger, pPager->zFi
10f90 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46  lename))..  /* F
10fa0 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69  ill in Pager.zDi
10fb0 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d  rectory[] */.  m
10fc0 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44  emcpy(pPager->zD
10fd0 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72  irectory, pPager
10fe0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  ->zFilename, nPa
10ff0 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72  thname+1);.  for
11000 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72  (i=strlen(pPager
11010 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69  ->zDirectory); i
11020 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
11030 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
11040 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
11050 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
11060 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
11070 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   0;..  /* Fill i
11080 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c  n Pager.zJournal
11090 5b 5d 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74  [] */.  if( zPat
110a0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d  hname ){.    mem
110b0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
110c0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46  rnal, pPager->zF
110d0 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
110e0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
110f0 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
11100 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
11110 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20  journal", 9);.  
11120 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
11130 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  r->zJournal = 0;
11140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65  .  }..  /* pPage
11150 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
11160 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11170 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
11180 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
11190 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
111a0 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
111b0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
111c0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
111d0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
111e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
111f0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
11200 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
11210 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
11220 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
11230 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
11240 20 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f   szPageDflt;.  /
11250 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  * pPager->stmtSi
11260 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ze = 0; */.  /* 
11270 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
11280 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
11290 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
112a0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
112b0 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70  xPage = 100;.  p
112c0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
112d0 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
112e0 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67  COUNT;.  /* pPag
112f0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
11300 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61  R_UNLOCK; */.  a
11310 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
11320 74 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c  tate == (tempFil
11330 65 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e ? PAGER_EXCLUS
11340 49 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f  IVE : PAGER_UNLO
11350 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  CK) );.  /* pPag
11360 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
11370 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65   */.  pPager->te
11380 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c  mpFile = tempFil
11390 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d  e;.  assert( tem
113a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
113b0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
113c0 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65  .          || te
113d0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
113e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
113f0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
11400 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
11410 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20  DE_EXCLUSIVE==1 
11420 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  );.  pPager->exc
11430 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d  lusiveMode = tem
11440 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72  pFile; .  pPager
11450 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
11460 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
11470 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
11480 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65    /* pPager->nee
11490 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20  dSync = 0; */.  
114a0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
114b0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
114c0 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
114d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
114e0 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
114f0 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
11500 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
11510 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  s = SQLITE_SYNC_
11520 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61  NORMAL;.  /* pPa
11530 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
11540 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11550 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
11560 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
11570 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
11580 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
11590 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50  a = nExtra;.  pP
115a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
115b0 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f  eLimit = SQLITE_
115c0 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f  DEFAULT_JOURNAL_
115d0 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73  SIZE_LIMIT;.  as
115e0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
115f0 3e 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d 70 46  >pMethods||tempF
11600 69 6c 65 29 3b 0a 20 20 73 65 74 53 65 63 74 6f  ile);.  setSecto
11610 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
11620 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20   if( memDb ){.  
11630 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11640 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f  lMode = PAGER_JO
11650 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
11660 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65  ;.  }.  /* pPage
11670 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
11680 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
11690 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
116a0 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
116b0 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
116c0 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
116d0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
116e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
116f0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
11700 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
11710 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
11720 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
11730 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
11740 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
11750 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
11760 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
11770 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
11780 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
11790 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61  Set the reinitia
117a0 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70  lizer for this p
117b0 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
117c0 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61  LL, the reinitia
117d0 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c  lizer.** is call
117e0 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74  ed when the cont
117f0 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ent of a page in
11800 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72   cache is restor
11810 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
11820 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61  al.** value as a
11830 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c   result of a rol
11840 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c  lback.  The call
11850 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65  back gives highe
11860 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20  r-level code.** 
11870 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
11880 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
11890 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61  TRA section to a
118a0 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65  gree with the re
118b0 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64  stored.** page d
118c0 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ata..*/.void sql
118d0 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e  ite3PagerSetRein
118e0 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
118f0 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
11900 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20  it)(DbPage*)){. 
11910 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
11920 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a  er = xReinit;.}.
11930 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
11940 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61  age size to *pPa
11950 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73  geSize. If the s
11960 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 20  uggest new page 
11970 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70  size is.** inapp
11980 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
11990 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
119a0 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20 74  ge size is set t
119b0 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20  o that.** value 
119c0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
119d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
119e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
119f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11a00 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b  u16 *pPageSize){
11a10 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
11a20 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 69  er->errCode;.  i
11a30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11a40 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67 65   ){.    u16 page
11a50 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a  Size = *pPageSiz
11a60 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
11a70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70  ageSize==0 || (p
11a80 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
11a90 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
11aa0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29 20  _MAX_PAGE_SIZE) 
11ab0 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 53  );.    if( pageS
11ac0 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65 21  ize && pageSize!
11ad0 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  =pPager->pageSiz
11ae0 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  e .     && (pPag
11af0 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c 20  er->memDb==0 || 
11b00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
11b10 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  0).     && sqlit
11b20 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
11b30 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
11b40 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )==0 .    ){.   
11b50 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d 20     char *pNew = 
11b60 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 50  (char *)sqlite3P
11b70 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53 69  ageMalloc(pageSi
11b80 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ze);.      if( !
11b90 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20  pNew ){.        
11ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11bb0 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
11bc0 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
11bd0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
11be0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67       pPager->pag
11bf0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
11c00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
11c10 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20 73  Pager->memDb ) s
11c20 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11c30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ger);.        sq
11c40 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
11c50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
11c60 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
11c70 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70 4e  ->pTmpSpace = pN
11c80 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ew;.        sqli
11c90 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67 65  te3PcacheSetPage
11ca0 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  Size(pPager->pPC
11cb0 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29 3b  ache, pageSize);
11cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11cd0 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20     *pPageSize = 
11ce0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
11cf0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
11d00 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11d10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11d20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
11d30 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
11d40 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
11d50 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
11d60 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
11d70 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
11d80 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
11d90 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
11da0 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
11db0 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
11dc0 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
11dd0 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
11de0 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
11df0 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
11e00 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
11e10 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
11e20 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
11e30 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
11e40 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
11e50 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
11e60 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
11e70 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
11e80 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
11e90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
11ea0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
11eb0 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
11ec0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
11ed0 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
11ee0 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
11ef0 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
11f00 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
11f10 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
11f20 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
11f30 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
11f40 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
11f50 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
11f60 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
11f70 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
11f80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
11f90 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
11fa0 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
11fb0 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
11fc0 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
11fd0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
11fe0 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
11ff0 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
12000 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
12010 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
12020 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
12030 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
12040 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
12050 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
12060 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
12070 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
12080 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12090 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
120a0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
120b0 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
120c0 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
120d0 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
120e0 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
120f0 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
12100 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
12110 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
12120 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
12130 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
12140 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
12150 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
12160 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
12170 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
12180 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
12190 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
121a0 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
121b0 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
121c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
121d0 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
121e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
121f0 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
12200 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
12210 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
12220 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12230 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
12240 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
12250 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
12260 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
12270 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
12280 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
12290 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
122a0 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
122b0 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
122c0 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
122d0 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
122e0 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
122f0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12300 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
12310 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
12320 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
12330 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
12340 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
12350 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
12360 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
12370 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
12380 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
12390 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20  s to. .**.** No 
123a0 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69  error checking i
123b0 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69  s done. The rati
123c0 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73  onal for this is
123d0 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
123e0 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63  ion .** may be c
123f0 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68  alled even if th
12400 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
12410 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
12420 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a   a header. In .*
12430 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71  * these cases sq
12440 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69  lite3OsRead() wi
12450 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ll return an err
12460 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65  or, to which the
12470 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73   correct .** res
12480 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f  ponse is to zero
12490 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70   the memory at p
124a0 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  Dest and continu
124b0 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72  e.  A real IO er
124c0 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65  ror .** will pre
124d0 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e  sumably recur an
124e0 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c  d be picked up l
124f0 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e  ater (Todo: Thin
12500 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a  k about this)..*
12510 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12520 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
12530 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
12540 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
12550 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
12560 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12570 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
12580 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
12590 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
125a0 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
125b0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
125c0 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
125d0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
125e0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
125f0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
12600 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
12610 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
12620 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
12630 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
12640 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
12650 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
12660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12670 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
12680 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12690 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
126a0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
126b0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
126c0 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
126d0 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
126e0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
126f0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
12700 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
12710 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
12720 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
12730 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
12740 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
12750 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
12760 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
12770 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
12780 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
12790 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
127a0 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
127b0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
127c0 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
127d0 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
127e0 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
127f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12800 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
12810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12820 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 36  t *pnPage){.  i6
12830 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 n = 0;.  int r
12840 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
12850 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
12860 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12870 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
12880 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
12890 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
128a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
128b0 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e  Size>=0 ){.    n
128c0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
128d0 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
128e0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
128f0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
12900 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
12910 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65  ;.    if( (pPage
12920 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 29  r->fd->pMethods)
12930 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73  .     && (rc = s
12940 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
12950 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
12960 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
12970 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
12980 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
12990 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
129a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e      }.    if( n>
129b0 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70  0 && n<pPager->p
129c0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
129d0 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73   n = 1;.    }els
129e0 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50  e{.      n /= pP
129f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
12a00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12a10 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
12a20 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
12a30 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
12a40 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = n;.    }.  }
12a50 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
12a60 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
12a70 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
12a80 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
12a90 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n>pPager->mxPgno
12aa0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
12ab0 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a  mxPgno = n;.  }.
12ac0 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b 0a    if( pnPage ){.
12ad0 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 3b      *pnPage = n;
12ae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
12af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12b00 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
12b10 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
12b20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
12b30 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  Pager*);../*.** 
12b40 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
12b50 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
12b60 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
12b70 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
12b80 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
12b90 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
12ba0 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
12bb0 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
12bc0 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
12bd0 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
12be0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
12bf0 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
12c00 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
12c10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
12c20 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
12c30 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
12c40 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
12c50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
12c60 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
12c70 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
12c80 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
12c90 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
12ca0 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
12cb0 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
12cc0 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
12cd0 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
12ce0 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
12cf0 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
12d00 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
12d10 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
12d20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12d30 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
12d40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12d50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
12d60 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
12d70 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65 72  >pPCache, pPager
12d80 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  ->dbSize);.}../*
12d90 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
12da0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
12db0 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
12dc0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
12dd0 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
12de0 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
12df0 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
12e00 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
12e10 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
12e20 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
12e30 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
12e40 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
12e50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
12e60 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
12e70 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
12e80 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
12e90 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
12ea0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
12eb0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
12ec0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
12ed0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
12ee0 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
12ef0 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
12f00 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
12f10 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
12f20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
12f30 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
12f40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
12f50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12f60 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
12f70 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
12f80 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
12f90 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
12fa0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
12fb0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
12fc0 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
12fd0 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
12fe0 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
12ff0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
13000 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
13010 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
13020 72 2d 3e 64 62 53 69 7a 65 3c 30 20 29 3b 0a 0a  r->dbSize<0 );..
13030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
13040 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
13050 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13060 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
13070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
13080 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61  usyHandler ) pPa
13090 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
130a0 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  r->nBusy = 0;.  
130b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
130c0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
130d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
130e0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
130f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
13100 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
13110 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
13120 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
13130 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
13140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13150 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13160 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
13170 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
13180 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
13190 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
131a0 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
131b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
131c0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
131d0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
131e0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
131f0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
13200 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
13210 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
13220 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
13230 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13240 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
13250 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
13260 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
13270 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
13280 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
13290 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
132a0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
132b0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
132c0 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Code;.  }else if
132d0 28 20 6e 50 61 67 65 3c 28 75 6e 73 69 67 6e 65  ( nPage<(unsigne
132e0 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
132f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   ){.    rc = syn
13300 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
13310 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13330 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
13340 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
13350 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
13360 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
13370 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13380 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
13390 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
133a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LOCK);.    }.   
133b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
133c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
133d0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
133e0 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
133f0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
13400 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13410 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
13420 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
13430 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
13440 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
13450 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
13460 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
13470 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
13480 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
13490 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
134a0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
134b0 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
134c0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
134d0 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
134e0 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
134f0 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
13500 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
13510 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
13520 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
13530 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
13540 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
13550 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
13560 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
13570 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
13580 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13590 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
135a0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
135b0 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
135c0 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
135d0 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
135e0 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
135f0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
13600 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
13610 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
13620 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
13630 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
13640 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
13650 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
13660 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
13670 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
13680 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
13690 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
136a0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
136b0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
136c0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
136d0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
136e0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
136f0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
13700 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
13710 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
13720 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
13730 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
13740 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
13750 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
13760 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
13770 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
13780 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50  ignMalloc();.  P
13790 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53  AGERTRACE2("CLOS
137a0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
137b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
137c0 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
137d0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69  n", pPager)).  i
137e0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
137f0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
13800 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
13810 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
13820 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
13830 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
13840 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c  nJournal);.  sql
13850 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
13860 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
13870 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 69 66  sRollback);.  if
13880 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
13890 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
138a0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
138b0 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >stfd);.  }.  sq
138c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
138d0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
138e0 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
138f0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
13900 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
13910 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
13920 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
13930 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
13940 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
13950 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
13960 2f 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  /..  sqlite3Page
13970 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
13980 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74  pSpace);.  sqlit
13990 65 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50  e3PcacheClose(pP
139a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
139b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
139c0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
139d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
139e0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
139f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
13a00 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
13a10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
13a20 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
13a30 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
13a40 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
13a50 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
13a60 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72  (DbPage *p){.  r
13a70 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
13a80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
13a90 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ncrement the ref
13aa0 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
13ab0 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e   a page.  The in
13ac0 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a  put pointer is.*
13ad0 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  * a reference to
13ae0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a   the page data..
13af0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
13b00 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70  gerRef(DbPage *p
13b10 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63  Pg){.  sqlite3Pc
13b20 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20 20  acheRef(pPg);.  
13b30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13b40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
13b50 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13b60 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
13b70 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
13b80 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
13b90 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
13ba0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
13bb0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
13bc0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
13bd0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
13be0 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
13bf0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
13c00 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
13c10 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
13c20 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
13c30 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
13c40 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
13c50 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
13c60 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
13c70 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
13c80 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
13c90 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
13ca0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
13cb0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
13cc0 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
13cd0 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
13ce0 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
13cf0 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
13d00 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
13d10 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
13d20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
13d30 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
13d40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
13d50 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
13d60 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
13d70 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
13d80 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
13d90 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
13da0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
13db0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
13dc0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
13dd0 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
13de0 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
13df0 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
13e00 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
13e10 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
13e20 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
13e30 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
13e40 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
13e50 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
13e60 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
13e70 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
13e80 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
13e90 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
13ea0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
13eb0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
13ec0 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e  er failure, so n
13ed0 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
13ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41  *.** If the IOCA
13ef0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61  P_SEQUENTIAL fla
13f00 67 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65  g is set for the
13f10 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
13f20 61 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68  a on which.** th
13f30 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74  e database is st
13f40 6f 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e  ored, then OsSyn
13f50 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
13f60 6c 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  led on the journ
13f70 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74  al.** file. In t
13f80 68 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61  his case all tha
13f90 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73  t is required is
13fa0 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e   to update the n
13fb0 52 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20  Rec field in.** 
13fc0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
13fd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
13fe0 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68  outine clears th
13ff0 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64  e needSync field
14000 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63   of every page c
14010 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a  urrent held in.*
14020 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  * memory..*/.sta
14030 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
14040 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
14050 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
14060 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
14070 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
14080 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
14090 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
140a0 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
140b0 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
140c0 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
140d0 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
140e0 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
140f0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
14100 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
14110 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
14120 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14130 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
14140 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
14150 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
14160 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
14170 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
14180 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
14190 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73  ->fd);.      ass
141a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
141b0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20  rnalOpen );..   
141c0 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
141d0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
141e0 5f 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20  _APPEND) ){.    
141f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
14200 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
14210 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
14220 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
14230 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
14240 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
14250 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
14260 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
14270 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
14280 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
14290 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
142a0 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
142b0 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
142c0 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
142d0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
142e0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
142f0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
14300 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
14310 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
14320 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
14330 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
14340 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
14350 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
14360 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
14370 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
14380 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
14390 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
143a0 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
143b0 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
143c0 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
143d0 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
143e0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
143f0 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
14400 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
14410 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
14420 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
14430 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
14440 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
14450 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a  */.        i64 j
14460 72 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  rnlOff;.        
14470 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
14480 53 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26  Sync && 0==(iDc&
14490 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
144a0 55 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20  UENTIAL) ){.    
144b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
144c0 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
144d0 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
144e0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
144f0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14500 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
14510 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
14520 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14530 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14540 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
14550 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  gs);.          i
14560 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
14570 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
14580 0a 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66  .        jrnlOff
14590 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
145a0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
145b0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
145c0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
145d0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
145e0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e  \n", pPager, jrn
145f0 6c 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20  lOff, 4));.     
14600 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
14610 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
14620 20 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72   jrnlOff, pPager
14630 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
14640 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14650 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
14660 20 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53     if( 0==(iDc&S
14670 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
14680 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
14690 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
146a0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
146b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
146c0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
146d0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
146e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
146f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14700 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
14710 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14720 3e 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20  >sync_flags| .  
14730 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
14740 3e 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c  >sync_flags==SQL
14750 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51  ITE_SYNC_FULL?SQ
14760 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
14770 4c 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b  LY:0).        );
14780 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
14790 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
147a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
147b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
147c0 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rted = 1;.    }.
147d0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
147e0 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
147f0 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64  * Erase the need
14800 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65  Sync flag from e
14810 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a  very page..    *
14820 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  /.    sqlite3Pca
14830 63 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67  cheClearSyncFlag
14840 73 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  s(pPager->pPCach
14850 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
14860 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
14870 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
14880 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
14890 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
148a0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
148b0 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
148c0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
148d0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
148e0 73 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c  se file. No call
148f0 73 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f  s are made.** to
14900 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
14910 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
14920 73 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20 69  s as clean. It i
14930 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14940 6c 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63  lity.** of the c
14950 61 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63 61  aller to use Pca
14960 63 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72  cheCleanAll() or
14970 20 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e   PcacheMakeClean
14980 28 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68  () to mark.** th
14990 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e  e pages as clean
149a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
149b0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
149c0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
149d0 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
149e0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
149f0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
14a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14a10 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
14a20 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
14a30 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
14a40 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
14a50 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
14a60 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
14a70 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
14a80 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
14a90 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
14aa0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
14ab0 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
14ac0 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
14ad0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
14ae0 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
14af0 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
14b00 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
14b10 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
14b20 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
14b30 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
14b40 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
14b50 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
14b60 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
14b70 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
14b80 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
14b90 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
14ba0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
14bb0 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
14bc0 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
14bd0 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
14be0 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
14bf0 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
14c00 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
14c10 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
14c20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
14c30 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
14c40 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
14c50 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
14c60 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
14c70 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
14c80 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
14c90 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
14ca0 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
14cb0 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
14cc0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
14cd0 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
14ce0 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
14cf0 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
14d00 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
14d10 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
14d20 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
14d30 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
14d40 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
14d50 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
14d60 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
14d70 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
14d80 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
14d90 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
14da0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
14db0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
14dc0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
14dd0 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
14de0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14df0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
14e00 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
14e10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
14e20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74  file has not yet
14e30 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70   been opened, op
14e40 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20  en it now. */.  
14e50 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66    if( !pPager->f
14e60 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
14e70 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
14e80 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
14e90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14ea0 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70  3PagerOpentemp(p
14eb0 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66  Pager, pPager->f
14ec0 64 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c  d, pPager->vfsFl
14ed0 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ags);.      if( 
14ee0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
14ef0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14f00 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79   there are dirty
14f10 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61   pages in the pa
14f20 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61  ge cache with pa
14f30 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74  ge numbers great
14f40 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50  er.    ** than P
14f50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69  ager.dbSize, thi
14f60 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50  s means sqlite3P
14f70 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77  agerTruncate() w
14f80 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20  as called to.   
14f90 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c   ** make the fil
14fa0 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75  e smaller (presu
14fb0 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61  mably by auto-va
14fc0 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e  cuum code). Do n
14fd0 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20  ot write.    ** 
14fe0 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74  any such pages t
14ff0 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  o the file..    
15000 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  */.    if( pList
15010 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
15020 64 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c  dbSize && 0==(pL
15030 69 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  ist->flags&PGHDR
15040 5f 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a  _DONT_WRITE) ){.
15050 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
15060 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
15070 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15080 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
15090 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
150a0 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69  DEC2(pPager, pLi
150b0 73 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73 74  st->pData, pList
150c0 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
150d0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
150e0 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
150f0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
15120 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
15130 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
15140 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
15150 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
15160 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15170 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
15180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15190 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
151a0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
151b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
151c0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47  fset);.      PAG
151d0 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
151e0 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
151f0 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
15200 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
15210 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66  Write);.      if
15220 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
15230 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
15240 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
15250 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
15260 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
15270 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
15280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15290 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
152a0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41    else{.      PA
152b0 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f  GERTRACE3("NOSTO
152c0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
152d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
152e0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
152f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15300 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15310 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  n rc;.#ifdef SQL
15320 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
15330 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
15340 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
15350 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
15360 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
15370 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
15380 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
15390 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
153a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
153b0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
153c0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
153d0 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
153e0 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
153f0 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
15400 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
15410 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67 65  inter to a purge
15420 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20 6f  able Pager .** o
15430 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e 63  bject. This func
15440 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
15450 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20 64   make a single d
15460 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20 68  irty page that h
15470 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e  as no.** outstan
15480 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15490 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 20  (if one exists) 
154a0 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69 74  clean so that it
154b0 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
154c0 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61 63   .** by the pcac
154d0 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  he layer..*/.sta
154e0 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
154f0 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
15500 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
15510 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
15520 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
15530 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
15540 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
15550 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 65  otSync ){.    re
15560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15570 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
15580 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
15590 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20 70  DIRTY );.  if( p
155a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
155b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
155c0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
155d0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
155e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
155f0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
15600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
15610 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
15620 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
15630 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
15640 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
15650 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
15660 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
15670 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
15680 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
15690 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
156a0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
156b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
156c0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
156d0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
156e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
156f0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
15700 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
15710 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
15720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15730 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
15740 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
15750 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
15760 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
15770 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15790 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
157a0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
157b0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
157c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
157d0 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
157e0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
157f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15800 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
15810 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
15820 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
15830 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
15840 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
15850 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
15860 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
15870 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
15880 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
15890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
158a0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
158b0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
158c0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
158d0 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
158e0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
158f0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
15900 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
15910 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
15920 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
15930 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  urnal..**.** Ret
15940 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
15950 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  unable to determ
15960 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20 6f  ine the status o
15970 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
15980 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15990 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20  e does not open 
159a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
159b0 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a   to examine its.
159c0 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e  ** content.  Hen
159d0 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ce, the journal 
159e0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68  might contain th
159f0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
15a00 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
15a10 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
15a20 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65   deleted, and he
15a30 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20  nce not be hot. 
15a40 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   Or.** the heade
15a50 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
15a60 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64   might be zeroed
15a70 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74   out.  This rout
15a80 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ine.** does not 
15a90 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20 63  discover these c
15aa0 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f  ases of a non-ho
15ab0 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74  t journal - if t
15ac0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
15ad0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
15ae0 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20   not empty this 
15af0 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
15b00 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54  it.** is hot.  T
15b10 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
15b20 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
15b30 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
15b40 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
15b50 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
15b60 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f   hot and will no
15b70 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
15b80 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
15b90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15ba0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
15bb0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
15bc0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
15bd0 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
15be0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
15bf0 78 69 73 74 73 3b 0a 20 20 69 6e 74 20 6c 6f 63  xists;.  int loc
15c00 6b 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ked;.  assert( p
15c10 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
15c20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
15c30 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
15c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 64  sert( pPager->fd
15c50 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
15c60 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  *pExists = 0;.  
15c70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
15c80 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
15c90 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
15ca0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
15cb0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 69  S, &exists);.  i
15cc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15cd0 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a 20 20   && exists ){.  
15ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15cf0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15d00 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c  k(pPager->fd, &l
15d10 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66  ocked);.  }.  if
15d20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
15d30 26 26 20 65 78 69 73 74 73 20 26 26 20 21 6c 6f  && exists && !lo
15d40 63 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  cked ){.    int 
15d50 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20  nPage;.    rc = 
15d60 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15d70 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
15d80 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
15d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15da0 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
15db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
15dc0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
15dd0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
15de0 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
15df0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
15e00 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
15e10 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15e20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15e30 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
15e40 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67  tent of page pPg
15e50 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
15e60 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
15e70 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50  atic int readDbP
15e80 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
15e90 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50  r, PgHdr *pPg, P
15ea0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
15eb0 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73 65   rc;.  i64 offse
15ec0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  t;.  assert( MEM
15ed0 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  DB==0 );.  asser
15ee0 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
15ef0 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
15f00 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
15f10 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
15f20 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65  ethods ){.    re
15f30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15f40 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
15f50 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70 67  }.  offset = (pg
15f60 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
15f70 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 72  r->pageSize;.  r
15f80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
15f90 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  d(pPager->fd, pP
15fa0 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67 65 72  g->pData, pPager
15fb0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
15fc0 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  et);.  PAGER_INC
15fd0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
15fe0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
15ff0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
16000 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
16010 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
16020 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16030 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e  gno));.  if( pgn
16040 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  o==1 ){.    memc
16050 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
16060 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
16070 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 2c 0a  Pg->pData)[24],.
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
160b0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
160c0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20  ileVers));.  }. 
160d0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
160e0 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d  pPg->pData, pPg-
160f0 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47  >pgno, 3);.  PAG
16100 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20  ERTRACE4("FETCH 
16110 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
16120 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
16130 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
16140 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
16150 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
16160 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74  ash(pPg));.  ret
16170 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16180 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16190 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
161a0 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
161b0 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
161c0 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
161d0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
161e0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
161f0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16200 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
16210 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
16220 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16230 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
16240 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
16250 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
16260 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
16270 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
16280 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
16290 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
162a0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
162b0 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
162c0 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
162d0 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
162e0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
162f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16300 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
16310 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16320 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16330 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f 72 52  ;.  int isErrorR
16340 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  eset = 0;..  /* 
16350 49 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65  If this database
16360 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72 20 65   is opened for e
16370 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 2c  xclusive access,
16380 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64   has no outstand
16390 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65 20 72  ing .  ** page r
163a0 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20 69 73  eferences and is
163b0 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73 74 61   in an error-sta
163c0 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65 20 63  te, now is the c
163d0 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
163e0 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
163f0 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
16400 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
16410 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65 61 74  -cache and treat
16420 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a   any.  ** open j
16430 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73 20 61  ournal file as a
16440 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20   hot-journal..  
16450 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  */.  if( !MEMDB 
16460 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
16470 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
16480 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
16490 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
164a0 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61  Cache)==0 && pPa
164b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20  ger->errCode .  
164c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
164d0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
164e0 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
164f0 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
16500 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
16510 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
16520 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
16530 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
16540 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
16550 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
16560 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
16570 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
16580 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
16590 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
165a0 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
165b0 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
165c0 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
165d0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
165e0 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
165f0 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
16600 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
16610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16620 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
16630 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
16640 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
16650 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
16660 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
16670 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
16680 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
16690 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
166a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
166b0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
166c0 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
166d0 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 61 73  tJournal;.    as
166e0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
166f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
16700 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
16710 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
16720 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  e)==0 );.    if(
16730 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
16740 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63  lock ){.      rc
16750 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
16760 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48  _lock(pPager, SH
16770 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
16780 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16790 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
167a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
167b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
167c0 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  CK );.        re
167d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
167e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
167f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
16800 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16810 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
16820 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16830 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
16840 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
16850 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
16860 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
16870 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
16880 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
16890 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
168a0 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
168b0 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  eleted..    */. 
168c0 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72 52     if( !isErrorR
168d0 65 73 65 74 20 29 7b 0a 20 20 20 20 20 20 72 63  eset ){.      rc
168e0 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c   = hasHotJournal
168f0 28 70 50 61 67 65 72 2c 20 26 69 73 48 6f 74 4a  (pPager, &isHotJ
16900 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69  ournal);.      i
16910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16920 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
16930 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
16940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
16950 73 45 72 72 6f 72 52 65 73 65 74 20 7c 7c 20 69  sErrorReset || i
16960 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sHotJournal ){. 
16970 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
16980 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
16990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
169a0 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
169b0 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 2a 2a  t it is.      **
169c0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
169d0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
169e0 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
169f0 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
16a00 65 0a 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55  e.      ** EXCLU
16a10 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74  SIVE lock. If it
16a20 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70   were, another p
16a30 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65  rocess might ope
16a40 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
16a50 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
16a60 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
16a70 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
16a80 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
16a90 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
16aa0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
16ab0 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
16ac0 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
16ad0 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  ing it .      **
16ae0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
16af0 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
16b00 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
16b10 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
16b20 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
16b30 64 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  d, the.      ** 
16b40 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
16b50 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
16b60 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
16b70 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
16b80 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
16b90 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
16ba0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16bb0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
16bc0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
16bd0 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c  ager->state<EXCL
16be0 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
16bf0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16c00 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16c10 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
16c20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
16c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
16c50 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  = pager_error(pP
16c60 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16c70 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
16c80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16c90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
16ca0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
16cb0 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20  IVE;.      }. . 
16cc0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65       /* Open the
16cd0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61   journal for rea
16ce0 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20  d/write access. 
16cf0 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
16d00 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 63  in .      ** exc
16d10 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
16d20 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  de the file desc
16d30 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b  riptor will be k
16d40 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20  ept open and.   
16d50 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
16d60 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
16d70 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
16d80 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
16d90 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73   the.      ** Os
16da0 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
16db0 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
16dc0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
16dd0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
16de0 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
16df0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
16e00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16e10 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20  ( !isErrorReset 
16e20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
16e30 61 6c 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  alOpen==0 ){.   
16e40 20 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20       int res;.  
16e50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16e60 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
16e70 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
16e80 2c 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  ,SQLITE_ACCESS_E
16e90 58 49 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20  XISTS,&res);.   
16ea0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16eb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ec0 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
16ed0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
16ee0 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
16ef0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
16f00 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16f10 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
16f20 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
16f30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16f40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16f50 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16f70 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
16f80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
16f90 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
16fa0 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
16fb0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
16fc0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
16fd0 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
16fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
16ff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17000 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54 45 5f   && fout&SQLITE_
17010 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b  OPEN_READONLY ){
17020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
17030 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
17040 50 45 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  PEN;.           
17050 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
17060 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
17070 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
17080 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
170a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65   the journal doe
170b0 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 61  s not exist, tha
170c0 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68  t means some oth
170d0 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20  er process.     
170e0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61 6c         ** has al
170f0 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74 20  ready rolled it 
17100 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  back */.        
17110 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17120 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
17130 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
17140 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
17150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17160 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
17170 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
17180 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
17190 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  lOpen = 1;.     
171a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
171b0 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
171c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
171d0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
171e0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
171f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  er = 0;.      pP
17200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
17210 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a   = 0;. .      /*
17220 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
17230 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
17240 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
17250 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
17260 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61   ** lock and rea
17270 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
17280 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lock..      */. 
17290 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
172a0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
172b0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
172c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
172d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
172e0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
172f0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f   rc);.        go
17300 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
17310 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
17320 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17330 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
17340 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
17350 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
17360 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
17370 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
17380 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
17390 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
173a0 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70  cachePagecount(p
173b0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
173c0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
173d0 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61  e shared-lock ha
173e0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75  s just been acqu
173f0 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ired on the data
17400 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20  base file.      
17410 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
17420 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
17430 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
17440 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
17450 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72     ** read or wr
17460 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ite transaction)
17470 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  .  Check to see 
17480 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  if the database.
17490 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65        ** has bee
174a0 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20  n modified.  If 
174b0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
174c0 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20   changed, flush 
174d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63  the.      ** cac
174e0 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  he..      **.   
174f0 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
17500 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
17510 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
17520 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
17530 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ing.      ** at 
17540 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74  offset 24 into t
17550 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69  he file.  The fi
17560 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31  rst 4 of these 1
17570 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  6 bytes are.    
17580 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f    ** a 32-bit co
17590 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e  unter that is in
175a0 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
175b0 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65  ach change.  The
175c0 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  .      ** other 
175d0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
175e0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
175f0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
17600 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65  .      ** a code
17610 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20  c is in use..   
17620 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
17630 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73  There is a vanis
17640 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61  hingly small cha
17650 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67  nce that a chang
17660 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20  e will not be . 
17670 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
17680 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
17690 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
176a0 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
176b0 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  l that.      ** 
176c0 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
176d0 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
176e0 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56      char dbFileV
176f0 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65  ers[sizeof(pPage
17700 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b  r->dbFileVers)];
17710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
17720 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
17730 67 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  ger, 0);..      
17740 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
17750 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ode ){.        r
17760 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
17770 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ode;.        got
17780 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
17790 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  }..      if( pPa
177a0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b  ger->dbSize>0 ){
177b0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
177c0 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c  (("CKVERS %p %d\
177d0 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65  n", pPager, size
177e0 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29  of(dbFileVers)))
177f0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
17800 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
17810 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
17820 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
17830 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
17840 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17860 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
17870 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
17880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17890 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
178a0 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
178b0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
178c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
178d0 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64  memcmp(pPager->d
178e0 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c  bFileVers, dbFil
178f0 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
17900 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b  FileVers))!=0 ){
17910 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
17920 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
17930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17940 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17950 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
17960 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
17970 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
17980 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17990 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
179a0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
179b0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
179c0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
179d0 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20  .  }.. failed:. 
179e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
179f0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  OK ){.    /* pag
17a00 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61  er_unlock() is a
17a10 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75   no-op for exclu
17a20 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e  sive mode and in
17a30 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17a40 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f  s. */.    pager_
17a50 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
17a60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
17a70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
17a80 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20  ure we have the 
17a90 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61  content for a pa
17aa0 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ge.  If the page
17ab0 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73   was.** previous
17ac0 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
17ad0 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
17ae0 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hen the content 
17af0 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74  was.** just init
17b00 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73  ialized to zeros
17b10 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e   instead of bein
17b20 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  g read from disk
17b30 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20  ..** But now we 
17b40 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61  need the real da
17b50 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20  ta off of disk. 
17b60 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65   So make sure we
17b70 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65  .** have it.  Re
17b80 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64  ad it in if we d
17b90 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c  o not have it al
17ba0 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ready..*/.static
17bb0 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63   int pager_get_c
17bc0 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50  ontent(PgHdr *pP
17bd0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66  g){.  if( pPg->f
17be0 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
17bf0 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  READ ){.    int 
17c00 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
17c10 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
17c20 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
17c30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
17c50 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44  ->flags &= ~PGHD
17c60 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20  R_NEED_READ;.   
17c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
17c80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
17c90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
17ca0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
17cb0 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
17cc0 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68   count has reach
17cd0 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68 65  ed zero, and the
17ce0 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
17cf0 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f   the.** middle o
17d00 66 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  f a write transa
17d10 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64 20  ction or opened 
17d20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
17d30 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f  e, unlock it..*/
17d40 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
17d50 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
17d60 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
17d70 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
17d80 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
17d90 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
17da0 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70 50 61  =0).    && (!pPa
17db0 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
17dc0 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
17dd0 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29  urnalOff>0) .  )
17de0 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
17df0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
17e00 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
17e10 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66  ** Drop a page f
17e20 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73  rom the cache us
17e30 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68  ing sqlite3Pcach
17e40 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eDrop()..**.** I
17e50 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65  f this means the
17e60 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61  re are now no pa
17e70 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e  ges with referen
17e80 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72  ces to them, a r
17e90 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72  ollback.** occur
17ea0 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  s and the lock o
17eb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
17ec0 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74  s removed..*/.st
17ed0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44  atic void pagerD
17ee0 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a  ropPage(DbPage *
17ef0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
17f00 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
17f10 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ger;.  sqlite3Pc
17f20 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20  acheDrop(pPg);. 
17f30 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
17f40 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a  used(pPager);.}.
17f50 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
17f60 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
17f70 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
17f80 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
17f90 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
17fa0 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
17fb0 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
17fc0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
17fd0 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
17fe0 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
17ff0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  sed..**.** This 
18000 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f  routine works fo
18010 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
18020 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
18030 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
18040 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
18050 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
18060 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
18070 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
18080 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
18090 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
180a0 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
180b0 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
180c0 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
180d0 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
180e0 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
180f0 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
18100 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
18110 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
18120 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
18130 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
18140 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
18150 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
18160 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
18170 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
18180 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
18190 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
181a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
181b0 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
181c0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
181d0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
181e0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
181f0 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
18200 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75  outine and Looku
18210 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
18220 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
18230 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
18240 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
18250 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
18260 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
18270 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
18280 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
18290 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
182a0 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a  ereas Lookup().*
182b0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
182c0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
182d0 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
182e0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
182f0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
18300 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
18310 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
18320 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
18330 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
18340 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75  ..** Since Looku
18350 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74  p() never goes t
18360 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72  o disk, it never
18370 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74   has to deal wit
18380 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f  h locks.** or jo
18390 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  urnal files..**.
183a0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
183b0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
183c0 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
183d0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
183e0 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e  om disk..** If n
183f0 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65  oContent is true
18400 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
18410 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
18420 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
18430 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  s.** of the page
18440 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73   at this time, s
18450 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69  o do not do a di
18460 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66  sk read.  Just f
18470 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61  ill in the.** pa
18480 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  ge content with 
18490 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b  zeros.  But mark
184a0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77   the fact that w
184b0 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20  e have not read 
184c0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62  the.** content b
184d0 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  y setting the Pg
184e0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
184f0 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66  g.  Later on, if
18500 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65   .** sqlite3Page
18510 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
18520 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20  ed on this page 
18530 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
18540 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20  ne is.** called 
18550 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e  again with noCon
18560 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tent==0, that me
18570 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ans that the con
18580 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a  tent is needed.*
18590 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72  * and the disk r
185a0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
185b0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
185c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
185d0 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61  gerAcquire(.  Pa
185e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
185f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f    /* The pager o
18600 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
18610 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
18620 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
18630 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
18640 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44   to fetch */.  D
18650 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  bPage **ppPage, 
18660 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f     /* Write a po
18670 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
18680 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
18690 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
186a0 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72  /* Do not bother
186b0 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74   reading content
186c0 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72   from disk if tr
186d0 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72  ue */.){.  PgHdr
186e0 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74   *pPg = 0;.  int
186f0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18700 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18710 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20  AGER_UNLOCK .   
18720 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63      || sqlite3Pc
18730 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
18740 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20  ger->pPCache)>0 
18750 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d  .       || pgno=
18760 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  =1.  );..  /* Th
18770 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
18780 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
18790 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
187a0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
187b0 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
187c0 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
187d0 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
187e0 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
187f0 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
18800 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c  GNO || pgno==0 |
18810 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
18820 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
18830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18840 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18850 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
18860 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
18870 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
18880 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
18890 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
188a0 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
188b0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74   = 0;..  /* If t
188c0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
188d0 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
188e0 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
188f0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
18900 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18910 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
18920 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
18930 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
18940 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
18950 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
18960 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
18970 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
18980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18990 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
189a0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
189b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
189c0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
189d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
189e0 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
189f0 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
18a00 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69  o, 1, &pPg);.  i
18a10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18a20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18a30 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  c;.  }.  if( pPg
18a40 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20  ->pPager==0 ){. 
18a50 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
18a60 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
18a70 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
18a80 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
18a90 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
18aa0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a  itialized..    *
18ab0 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
18ac0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
18ad0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20  Pager->nMiss);. 
18ae0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d     pPg->pPager =
18af0 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d 65 6d   pPager;.    mem
18b00 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61 2c  set(pPg->pExtra,
18b10 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74   0, pPager->nExt
18b20 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  ra);..    rc = s
18b30 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18b40 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d  ount(pPager, &nM
18b50 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ax);.    if( rc!
18b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18b70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18b80 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
18b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18ba0 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61 78   }..    if( nMax
18bb0 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45  <(int)pgno || ME
18bc0 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74  MDB || noContent
18bd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
18be0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
18bf0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
18c00 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
18c10 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
18c20 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
18c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
18c40 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61  emset(pPg->pData
18c50 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
18c60 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
18c70 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  ( noContent ){. 
18c80 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
18c90 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
18ca0 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  READ;.      }.  
18cb0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
18cc0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
18cd0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
18ce0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18cf0 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50   = readDbPage(pP
18d00 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29  ager, pPg, pgno)
18d10 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18d20 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
18d30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
18d40 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
18d50 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50 61      /* sqlite3Pa
18d60 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20 2a  gerUnref(pPg); *
18d70 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 44  /.        pagerD
18d80 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20 20  ropPage(pPg);.  
18d90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
18db0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
18dc0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
18dd0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
18de0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
18df0 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
18e00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
18e10 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
18e20 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
18e30 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
18e40 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
18e50 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
18e60 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e 6f  Cache)>0 || pgno
18e70 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
18e80 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
18e90 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
18ea0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
18eb0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
18ec0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
18ed0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
18ee0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18ef0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
18f00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18f10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18f20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70  }..  *ppPage = p
18f30 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
18f40 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18f50 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
18f60 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
18f70 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
18f80 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
18f90 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
18fa0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
18fb0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
18fc0 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
18fd0 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
18fe0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
18ff0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
19000 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19010 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
19020 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
19030 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
19040 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
19050 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
19060 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
19070 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
19080 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
19090 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
190a0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
190b0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
190c0 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
190d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
190e0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
190f0 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
19100 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
19110 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
19120 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
19130 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
19140 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
19150 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
19160 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
19170 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
19180 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19190 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
191a0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
191b0 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67  OCK).   && (pPag
191c0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
191d0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
191e0 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
191f0 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20  E_FULL).  ){.   
19200 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46 65   sqlite3PcacheFe
19210 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61  tch(pPager->pPCa
19220 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70  che, pgno, 0, &p
19230 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  Pg);.  }..  retu
19240 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
19250 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
19260 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
19270 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
19280 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
19290 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
192a0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
192b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
192c0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
192d0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
192e0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
192f0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
19300 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
19310 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
19320 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
19330 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
19340 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19350 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
19360 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
19370 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
19380 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
19390 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52    sqlite3PcacheR
193a0 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20  elease(pPg);.   
193b0 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e   pagerUnlockIfUn
193c0 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  used(pPager);.  
193d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
193e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
193f0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
19400 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
19410 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
19420 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
19430 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
19440 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
19450 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
19460 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
19470 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
19480 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
19490 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
194a0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
194b0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
194c0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
194d0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
194e0 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
194f0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
19500 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
19510 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19520 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
19530 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
19540 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
19550 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
19560 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
19570 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
19580 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
19590 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  );..  int rc;.  
195a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
195b0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
195c0 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
195d0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
195e0 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
195f0 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
19600 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71  urnal==0 );.  sq
19610 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19620 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
19630 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
19640 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
19650 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
19660 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66  r->dbSize);.  if
19670 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
19680 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
19690 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
196a0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
196b0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
196c0 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
196d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
196e0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  n==0 ){.    if( 
196f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
19700 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
19710 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
19720 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51  DELETEONCLOSE|SQ
19730 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
19740 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c  OURNAL);.    }el
19750 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  se{.      flags 
19760 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  |= (SQLITE_OPEN_
19770 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
19780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
19790 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
197a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
197b0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20  ODE_MEMORY ){.  
197c0 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f      sqlite3MemJo
197d0 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  urnalOpen(pPager
197e0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 72 63  ->jfd);.      rc
197f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19800 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20    }else{.#ifdef 
19810 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
19820 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
19830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
19840 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20  rnalOpen(.      
19850 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72      pVfs, pPager
19860 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
19870 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20  er->jfd, flags, 
19880 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70  jrnlBufferSize(p
19890 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a  Pager).      );.
198a0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
198b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
198c0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
198d0 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
198e0 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
198f0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
19900 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19910 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19920 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
19930 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
19940 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
19950 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
19960 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ter = 0;.    pPa
19970 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
19980 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21  = 0;.    if( rc!
19990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
199a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
199b0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
199c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
199d0 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72  ete(pVfs, pPager
199e0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a  ->zJournal, 0);.
199f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
19a00 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
19a10 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d  n_journal;.    }
19a20 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
19a30 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
19a40 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
19a50 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
19a60 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
19a70 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19a80 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
19a90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
19aa0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
19ab0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
19ac0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19ad0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19ae0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
19af0 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
19b00 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d  >dbSize;..  rc =
19b10 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
19b20 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28  (pPager);..  if(
19b30 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
19b40 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c  oopen && rc==SQL
19b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19b70 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29  tmtBegin(pPager)
19b80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19b90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
19ba0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26  =SQLITE_NOMEM &&
19bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
19bc0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72  R_NOMEM ){.    r
19bd0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
19be0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
19bf0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
19c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19c10 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
19c20 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
19c30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
19c40 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
19c50 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 33  urnal:.  sqlite3
19c60 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
19c70 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19c80 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  );.  pPager->pIn
19c90 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
19ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19cb0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
19cc0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
19cd0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
19ce0 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
19cf0 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
19d00 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
19d10 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
19d20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
19d30 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
19d40 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
19d50 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
19d60 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
19d70 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
19d80 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
19d90 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
19da0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
19db0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
19dc0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
19dd0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
19de0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
19df0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
19e00 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
19e10 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
19e20 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
19e30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19e40 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
19e50 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
19e60 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
19e70 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
19e80 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
19e90 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
19ea0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
19eb0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
19ec0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
19ed0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19ee0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
19ef0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
19f00 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
19f10 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
19f20 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
19f30 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
19f40 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
19f50 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
19f60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
19f70 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
19f80 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
19f90 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
19fa0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
19fb0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
19fc0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
19fd0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
19fe0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
19ff0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1a000 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1a010 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1a020 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1a030 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1a040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1a050 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1a060 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1a070 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1a080 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1a090 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1a0a0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1a0b0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1a0c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1a0d0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1a0e0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1a0f0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1a100 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1a110 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1a120 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1a130 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1a140 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1a150 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1a160 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1a170 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1a180 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1a190 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1a1a0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1a1b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a1c0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1a1d0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1a1e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1a1f0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1a200 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a210 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1a220 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1a230 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  t( pPager->pInJo
1a240 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1a250 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1a260 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1a270 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1a280 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
1a290 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  CK);.    if( rc=
1a2a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a2b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1a2c0 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
1a2d0 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 65 78  ED;.      if( ex
1a2e0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1a2f0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1a300 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1a310 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1a320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a330 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a350 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a360 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1a370 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 50  Cache = 0;.    P
1a380 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1a390 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1a3a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a3b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a3c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1a3d0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
1a3f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1a400 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1a410 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1a420 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1a430 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1a440 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
1a450 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1a460 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1a470 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1a480 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1a490 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1a4a0 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1a4b0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a4c0 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74 0a 20   mode the last. 
1a4d0 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
1a4e0 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
1a4f0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
1a500 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
1a510 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
1a520 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
1a530 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
1a540 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
1a550 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
1a560 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
1a570 20 65 69 74 68 65 72 20 77 61 73 20 74 72 75 6e   either was trun
1a580 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1a590 20 6f 72 20 69 74 73 20 68 65 61 64 65 72 20 77   or its header w
1a5a0 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 77 72  as.    ** overwr
1a5b0 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72 6f 73  itten with zeros
1a5c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1a5d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1a5e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1a5f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1a600 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1a610 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a620 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
1a630 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1a640 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1a650 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50 61 67  er, 0);.    pPag
1a660 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
1a670 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
1a680 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
1a690 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1a6a0 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  !pPager->pInJour
1a6b0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1a6c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1a6d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a6e0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1a6f0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a700 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1a710 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1a720 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1a730 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1a740 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a750 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1a760 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1a770 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1a780 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a790 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1a7a0 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1a7b0 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1a7c0 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1a7d0 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1a7e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a7f0 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1a800 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65   *pPg){.  sqlite
1a810 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
1a820 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
1a830 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61  Make a page clea
1a840 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64 69  n.  Clear its di
1a850 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f  rty bit and remo
1a860 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a  ve it from the.*
1a870 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69 73  * dirty page lis
1a880 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1a890 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
1a8a0 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  r *pPg){.  sqlit
1a8b0 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1a8c0 6e 28 70 50 67 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n(pPg);.}.../*.*
1a8d0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
1a8e0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
1a8f0 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
1a900 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
1a910 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
1a920 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
1a930 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
1a940 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
1a950 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
1a960 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
1a970 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
1a980 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
1a990 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a9a0 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
1a9b0 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
1a9c0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
1a9d0 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
1a9e0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1a9f0 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
1aa00 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
1aa10 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
1aa20 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
1aa30 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1aa40 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
1aa50 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
1aa60 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
1aa70 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
1aa80 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
1aa90 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
1aaa0 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
1aab0 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
1aac0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
1aad0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
1aae0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
1aaf0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
1ab00 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
1ab10 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
1ab20 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1ab30 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
1ab40 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
1ab50 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
1ab60 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
1ab70 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
1ab80 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
1ab90 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1aba0 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
1abb0 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
1abc0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29  te3PagerCommit()
1abd0 20 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72   or sqlite3Pager
1abe0 52 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a  Rollback() to.**
1abf0 20 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69   reset..*/.stati
1ac00 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
1ac10 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
1ac20 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
1ac30 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
1ac40 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ac50 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1ac60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ac70 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1ac80 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1ac90 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1aca0 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1acb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1acc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1acd0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1ace0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1acf0 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1ad00 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1ad10 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1ad20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1ad30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1ad40 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  age was previous
1ad50 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68  ly acquired with
1ad60 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74   noContent==1, t
1ad70 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77  hat means.  ** w
1ad80 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20  e didn't really 
1ad90 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74  read in the cont
1ada0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1adb0 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65    This can happe
1adc0 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d  n.  ** (for exam
1add0 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61  ple) when the pa
1ade0 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65  ge is being move
1adf0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1ae00 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77  t.  But.  ** now
1ae10 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73   we are (perhaps
1ae20 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67  ) moving the pag
1ae30 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65  e off of the fre
1ae40 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72  elist for.  ** r
1ae50 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64  euse and we need
1ae60 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69   to know its ori
1ae70 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f  ginal content so
1ae80 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20   that content.  
1ae90 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  ** can be stored
1aea0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1aeb0 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f   journal.  So do
1aec0 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69   the read at thi
1aed0 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a  s.  ** time..  *
1aee0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67  /.  rc = pager_g
1aef0 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
1af00 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1af10 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1af20 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
1af30 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
1af40 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
1af50 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1af60 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1af70 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
1af80 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
1af90 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61   away..  */.  ma
1afa0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
1afb0 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  if( pageInJourna
1afc0 6c 28 70 50 67 29 20 26 26 20 28 70 61 67 65 49  l(pPg) && (pageI
1afd0 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
1afe0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
1aff0 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
1b000 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1b010 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  he = 1;.    pPag
1b020 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
1b030 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
1b040 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
1b050 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
1b060 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
1b070 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
1b080 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
1b090 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1b0a0 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
1b0b0 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
1b0c0 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
1b0d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
1b0e0 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
1b0f0 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
1b100 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
1b110 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
1b120 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
1b130 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
1b140 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b150 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1b160 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
1b170 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b180 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
1b190 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b1b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b1c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b1d0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1b1e0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
1b1f0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1b200 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1b210 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
1b220 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
1b230 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1b240 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
1b250 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
1b260 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1b270 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1b280 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b2a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b2b0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b2c0 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
1b2d0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
1b2e0 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
1b2f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1b300 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
1b310 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
1b320 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
1b330 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1b340 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
1b350 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b360 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
1b370 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
1b380 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
1b390 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
1b3a0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
1b3b0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
1b3c0 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72   if( !pageInJour
1b3d0 6e 61 6c 28 70 50 67 29 20 26 26 20 70 50 61 67  nal(pPg) && pPag
1b3e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1b3f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
1b400 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1b410 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b420 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  e ){.        u32
1b430 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
1b440 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1b450 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1b460 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1b470 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1b480 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1b490 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e  t.        ** con
1b4a0 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61  tains the databa
1b4b0 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66  se locks.  The f
1b4c0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
1b4d0 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20  verifies.       
1b4e0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1b4f0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ot. */.        a
1b500 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f  ssert( pPg->pgno
1b510 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  !=PAGER_MJ_PGNO(
1b520 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
1b530 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45     pData2 = CODE
1b540 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1b550 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1b560 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d  .        cksum =
1b570 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1b580 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1b590 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1b5a0 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
1b5b0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b5c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67  >journalOff, pPg
1b5d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1b5e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b5f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b600 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
1b610 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
1b620 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1b630 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20  >pageSize,.     
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1b660 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29  >journalOff + 4)
1b670 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1b680 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1b690 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1b6a0 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ze+4;.        }.
1b6b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1b6c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b6d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
1b6e0 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
1b6f0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
1b700 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29 3b  rnalOff, cksum);
1b710 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1b720 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
1b730 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
1b740 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1b750 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20  JOUT %p %d %lld 
1b760 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1b770 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20  Pg->pgno, .     
1b780 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1b790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1b7a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b7b0 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
1b7c0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1b7d0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1b7e0 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  t);.        PAGE
1b7f0 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c  RTRACE5("JOURNAL
1b800 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1b810 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38  Sync=%d hash(%08
1b820 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
1b830 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1b840 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1b850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28  .             ((
1b860 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1b870 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29  _NEED_SYNC)?1:0)
1b880 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
1b890 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20  (pPg));..       
1b8a0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
1b8b0 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
1b8c0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1b8d0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
1b8e0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1b8f0 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64  n will be rolled
1b900 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79   back by the lay
1b910 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  er above..      
1b920 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1b930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b940 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1b950 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1b960 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ..        pPager
1b970 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  ->nRec++;.      
1b980 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b990 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
1b9a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b9b0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1b9c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
1b9d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1b9e0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1b9f0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1ba00 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
1ba10 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
1ba20 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  NC;.        }.  
1ba30 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1ba40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1ba50 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ba60 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1ba70 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
1ba80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d  pgno);.        }
1ba90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1baa0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1bab0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1bac0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1bad0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1bae0 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1baf0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
1bb00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1bb10 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1bb20 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1bb30 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1bb40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bb50 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1bb60 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1bb80 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1bb90 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
1bba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bbb0 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1bbc0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1bbd0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1bbe0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1bbf0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bc00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1bc10 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1bc20 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1bc30 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1bc40 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1bc50 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1bc60 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1bc70 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1bc80 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1bc90 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1bca0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1bcb0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1bcc0 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1bcd0 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1bce0 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1bcf0 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1bd00 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1bd10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1bd20 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1bd30 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
1bd40 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1bd50 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
1bd60 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1bd70 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
1bd80 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
1bd90 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  t = pPager->stmt
1bda0 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e  NRec*(4+pPager->
1bdb0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
1bdc0 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20   char *pData2 = 
1bdd0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1bde0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1bdf0 20 37 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   7);.      asser
1be00 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
1be10 28 70 50 67 29 20 7c 7c 20 28 69 6e 74 29 70 50  (pPg) || (int)pP
1be20 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1be30 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1be40 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1be50 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66  bits(pPager->stf
1be60 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e  d, offset, pPg->
1be70 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1be80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1be90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1bea0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1beb0 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74  ager->stfd, pDat
1bec0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1bed0 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1bee0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
1bef0 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1bf00 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1bf10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1bf20 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1bf30 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
1bf40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bf50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1bf60 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1bf70 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
1bf80 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  c++;.      asser
1bf90 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
1bfa0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  mt!=0 );.      s
1bfb0 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
1bfc0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c  pPager->pInStmt,
1bfd0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1bfe0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
1bff0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
1c000 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
1c010 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c020 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1c030 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
1c040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
1c050 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
1c060 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
1c070 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
1c080 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70  >pgno;.    if( p
1c090 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1c0a0 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1c0b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1c0c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1c0d0 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1c0e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c0f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1c100 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1c110 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1c120 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1c130 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1c140 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1c150 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1c160 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1c170 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1c180 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1c190 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1c1a0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1c1b0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1c1c0 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1c1d0 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1c1e0 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1c1f0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1c200 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1c210 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1c220 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1c230 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1c240 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1c250 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1c260 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1c270 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1c280 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1c290 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1c2a0 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1c2b0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1c2c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1c2d0 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1c2e0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1c2f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1c300 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1c310 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1c320 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1c330 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1c340 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1c350 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1c360 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c370 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50 65 72  ..  if( nPagePer
1c380 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
1c390 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
1c3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1c3b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1c3c0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
1c3d0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
1c3e0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
1c3f0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1c400 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1c410 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1c420 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
1c430 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1c440 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c450 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
1c460 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
1c470 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
1c480 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79  ;.    int needSy
1c490 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
1c4a0 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e  Set the doNotSyn
1c4b0 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69  c flag to 1. Thi
1c4c0 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20  s is because we 
1c4d0 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a  cannot allow a j
1c4e0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65  ournal.    ** he
1c4f0 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74  ader to be writt
1c500 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  en between the p
1c510 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62  ages journaled b
1c520 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1c530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c540 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
1c550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c560 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
1c570 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1c580 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
1c590 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
1c5a0 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
1c5b0 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
1c5c0 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
1c5d0 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
1c5e0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
1c5f0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
1c600 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
1c610 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
1c620 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
1c630 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1c640 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1c650 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
1c660 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
1c670 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
1c680 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
1c690 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1c6a0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1c6b0 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43  , (int *)&nPageC
1c6c0 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ount);.    if( p
1c6d0 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1c6e0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1c6f0 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1c700 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1c710 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1c720 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1c730 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1c740 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1c750 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1c760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1c770 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1c780 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1c790 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1c7a0 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1c7b0 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1c7c0 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1c7d0 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1c7e0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1c7f0 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1c800 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1c810 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1c820 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50   pg1+ii;.      P
1c830 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
1c840 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e     if( pg==pPg->
1c850 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33  pgno || !sqlite3
1c860 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1c870 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
1c880 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  g) ){.        if
1c890 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  ( pg!=PAGER_MJ_P
1c8a0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
1c8b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c8c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1c8d0 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
1c8e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1c8f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c900 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1c910 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1c920 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1c930 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
1c940 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1c950 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
1c960 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
1c970 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
1c980 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1c990 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1c9a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1c9b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1c9c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50     }else if( (pP
1c9d0 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
1c9e0 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29 21  up(pPager, pg))!
1c9f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1ca00 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50  ( pPage->flags&P
1ca10 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1ca20 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
1ca30 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1ca40 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
1ca50 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1ca60 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1ca70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1ca80 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1ca90 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  c flag is set fo
1caa0 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61  r any of the nPa
1cab0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
1cac0 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
1cad0 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20  , then it needs 
1cae0 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c  to be set for al
1caf0 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75  l of them. Becau
1cb00 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e  se.    ** writin
1cb10 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73  g to any of thes
1cb20 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61  e nPage pages ma
1cb30 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68  y damage the oth
1cb40 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20  ers, the.    ** 
1cb50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
1cb60 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29  t contain sync()
1cb70 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c  ed copies of all
1cb80 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20   of them.    ** 
1cb90 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68  before any of th
1cba0 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  em can be writte
1cbb0 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  n out to the dat
1cbc0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
1cbd0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53  */.    if( needS
1cbe0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
1cbf0 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70  ert( !MEMDB && p
1cc00 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30  Pager->noSync==0
1cc10 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69   );.      for(ii
1cc20 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
1cc30 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b  needSync; ii++){
1cc40 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
1cc50 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
1cc60 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31  okup(pPager, pg1
1cc70 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66  +ii);.        if
1cc80 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d  ( pPage ) pPage-
1cc90 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
1cca0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
1ccb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ccc0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1ccd0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
1cce0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
1ccf0 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
1cd00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1cd10 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1cd20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1cd30 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1cd40 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1cd50 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1cd60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1cd70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1cd80 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1cd90 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1cda0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1cdb0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1cdc0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1cdd0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1cde0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1cdf0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1ce00 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1ce10 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1ce20 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1ce30 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1ce40 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1ce50 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1ce60 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1ce70 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1ce80 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66  _DIRTY;.}.#endif
1ce90 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1cea0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1ceb0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1cec0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
1ced0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
1cee0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
1cef0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ion on page pPg 
1cf00 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
1cf10 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
1cf20 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
1cf30 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
1cf40 72 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65  rty.  This happe
1cf50 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
1cf60 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67   when.** the pag
1cf70 65 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64  e has been added
1cf80 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68   as a leaf of th
1cf90 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73  e freelist and s
1cfa0 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o its.** content
1cfb0 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65   no longer matte
1cfc0 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76  rs..**.** The ov
1cfd0 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65  erlying software
1cfe0 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69   layer calls thi
1cff0 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61  s routine when a
1d000 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a  ll of the data.*
1d010 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  * on the given p
1d020 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20  age is unused.  
1d030 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20  The pager marks 
1d040 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d050 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  n so.** that it 
1d060 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69  does not get wri
1d070 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tten to disk..**
1d080 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74  .** Tests show t
1d090 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  hat this optimiz
1d0a0 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20  ation, together 
1d0b0 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  with the.** sqli
1d0c0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1d0d0 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f  back() below, mo
1d0e0 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74  re than double t
1d0f0 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c  he speed.** of l
1d100 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72  arge INSERT oper
1d110 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72  ations and quadr
1d120 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f  uple the speed o
1d130 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e  f large DELETEs.
1d140 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1d150 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d160 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61  ed, set the alwa
1d170 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20  ysRollback flag 
1d180 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73  to true..** Subs
1d190 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
1d1a0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d1b0 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  Rollback() for t
1d1c0 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20  he same page.** 
1d1d0 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20  will thereafter 
1d1e0 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  be ignored.  Thi
1d1f0 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  s is necessary t
1d200 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65  o avoid a proble
1d210 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67  m.** where a pag
1d220 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61  e with data is a
1d230 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1d240 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20  list during one 
1d250 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61  part of.** a tra
1d260 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65  nsaction then re
1d270 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66  moved from the f
1d280 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61  reelist during a
1d290 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f   later part.** o
1d2a0 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  f the same trans
1d2b0 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65  action and reuse
1d2c0 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  d for some other
1d2d0 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20   purpose.  When 
1d2e0 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61  it.** is first a
1d2f0 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  dded to the free
1d300 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  list, this routi
1d310 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57  ne is called.  W
1d320 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74  hen reused,.** t
1d330 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  he sqlite3PagerD
1d340 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  ontRollback() ro
1d350 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1d360 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1d370 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69  e.** page contai
1d380 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ns critical data
1d390 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1d3a0 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1d3b0 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ts.** rolled bac
1d3c0 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68  k in spite of th
1d3d0 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  e sqlite3PagerDo
1d3e0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c  ntRollback() cal
1d3f0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1d400 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1d410 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29  DbPage *pDbPage)
1d420 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
1d430 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1d440 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d450 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1d460 63 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  c;..  if( pPg->p
1d470 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1d480 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  DbSize ){.    re
1d490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d4a0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d4b0 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d4c0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  k==0 ){.    asse
1d4d0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1d4e0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
1d4f0 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c  ager->pAlwaysRol
1d500 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65 33 42  lback = sqlite3B
1d510 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
1d520 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b  er->origDbSize);
1d530 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1d540 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d550 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  k ){.      retur
1d560 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1d570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
1d580 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
1d590 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  t(pPager->pAlway
1d5a0 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67 2d 3e  sRollback, pPg->
1d5b0 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 72 63  pgno);..  if( rc
1d5c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1d5d0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1d5e0 5f 44 49 52 54 59 29 20 26 26 20 21 70 50 61 67  _DIRTY) && !pPag
1d5f0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1d600 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d610 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d620 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1d630 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1d640 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
1d650 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
1d660 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
1d670 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
1d680 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1d690 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
1d6a0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
1d6b0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
1d6c0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
1d6d0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
1d6e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1d6f0 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
1d700 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1d710 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
1d720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d730 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
1d740 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
1d750 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
1d760 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
1d770 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
1d780 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
1d790 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
1d7a0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1d7b0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
1d7c0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
1d7d0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
1d7e0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1d7f0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
1d800 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
1d810 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
1d820 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
1d830 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
1d840 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
1d850 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
1d860 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1d870 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
1d880 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1d890 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1d8a0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1d8b0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1d8c0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1d8d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
1d8e0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
1d8f0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1d900 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1d910 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
1d920 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
1d930 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1d940 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1d950 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1d960 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1d970 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  if.    }.  }.  r
1d980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d990 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1d9a0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1d9b0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1d9c0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1d9d0 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1d9e0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1d9f0 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1da00 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1da10 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1da20 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1da30 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1da40 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1da50 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1da60 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1da70 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
1da80 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
1da90 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
1daa0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
1dab0 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
1dac0 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1dad0 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
1dae0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
1daf0 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
1db00 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
1db10 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
1db20 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
1db30 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1db40 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
1db50 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
1db60 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
1db70 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
1db80 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1db90 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
1dba0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1dbb0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1dbc0 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ager;..  assert(
1dbd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1dbe0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1dbf0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
1dc00 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1dc10 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
1dc20 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
1dc30 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
1dc40 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
1dc50 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
1dc60 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1dc70 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
1dc80 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
1dc90 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1dca0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1dcb0 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20  rnalOpen==0 .   
1dcc0 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
1dcd0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c  Test(pPager->pAl
1dce0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50  waysRollback, pP
1dcf0 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70  g->pgno).   || p
1dd00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1dd10 3e 6f 72 69 67 44 62 53 69 7a 65 0a 20 20 29 7b  >origDbSize.  ){
1dd20 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1dd30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1dd40 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1dd50 69 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 20  if( (pPg->flags 
1dd60 26 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e  & PGHDR_IN_JOURN
1dd70 41 4c 29 21 3d 30 20 7c 7c 20 28 69 6e 74 29 70  AL)!=0 || (int)p
1dd80 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1dd90 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1dda0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
1ddb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53  endif..  /* If S
1ddc0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20  ECURE_DELETE is 
1ddd0 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
1dde0 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
1ddf0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f  hat this.  ** ro
1de00 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1de10 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f  led on a page fo
1de20 72 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50  r which sqlite3P
1de30 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a  agerDontWrite().
1de40 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
1de50 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c  n previously cal
1de60 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73  led during the s
1de70 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ame transaction.
1de80 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e  .  ** And if Don
1de90 74 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65  tWrite() has pre
1dea0 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c  viously been cal
1deb0 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  led, the followi
1dec0 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  ng.  ** conditio
1ded0 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a  ns must be met..
1dee0 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72    **.  ** (Later
1def0 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49  :)  Not true.  I
1df00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1df10 73 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 68  s corrupted by h
1df20 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a  aving duplicate.
1df30 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68    ** pages on th
1df40 65 20 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20  e freelist (ex: 
1df50 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29 20 74  corrupt9.test) t
1df60 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hen the followin
1df70 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65  g is not.  ** ne
1df80 63 65 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a  cessarily true:.
1df90 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74    */.  /* assert
1dfa0 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1dfb0 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1dfc0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1dfd0 72 69 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a  rigDbSize ); */.
1dfe0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1dff0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1e000 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74   );.  sqlite3Bit
1e010 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1e020 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
1e030 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66 6c  pgno);.  pPg->fl
1e040 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45  ags &= ~PGHDR_NE
1e050 45 44 5f 52 45 41 44 3b 0a 20 20 69 66 28 20 70  ED_READ;.  if( p
1e060 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1e070 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e080 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1e090 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   >= pPager->orig
1e0a0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 71  DbSize );.    sq
1e0b0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
1e0c0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20  Pager->pInStmt, 
1e0d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  pPg->pgno);.  }.
1e0e0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1e0f0 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67  ONT_ROLLBACK pag
1e100 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1e110 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1e120 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f  D(pPager));.  IO
1e130 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
1e140 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1e150 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 7d 0a  , pPg->pgno)).}.
1e160 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e170 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1e180 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1e190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1e1a0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1e1b0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1e1c0 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1e1d0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1e1e0 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1e1f0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1e200 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
1e210 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
1e220 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1e230 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1e240 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1e250 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64 65 66  ITE_OK;..#ifndef
1e260 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1e270 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 61 73  TOMIC_WRITE.  as
1e280 73 65 72 74 28 20 69 73 44 69 72 65 63 74 3d 3d  sert( isDirect==
1e290 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72 65 63  0 );  /* isDirec
1e2a0 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65 20 66  t is only true f
1e2b0 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74 65 73  or atomic writes
1e2c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   */.#endif.  if(
1e2d0 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65   !pPager->change
1e2e0 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20  CountDone ){.   
1e2f0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
1e300 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
1e310 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  writing. */.    
1e320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e330 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  rGet(pPager, 1, 
1e340 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
1e350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e360 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
1e370 20 20 69 66 28 20 21 69 73 44 69 72 65 63 74 20    if( !isDirect 
1e380 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1e390 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e3a0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69  pPgHdr);.      i
1e3b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e3d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1e3e0 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72  gHdr);.        r
1e3f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1e400 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1e410 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1e420 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1e430 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1e440 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1e450 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1e460 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62  r = sqlite3Get4b
1e470 79 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d  yte((u8*)pPager-
1e480 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20  >dbFileVers);.  
1e490 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1e4a0 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74  ++;.    put32bit
1e4b0 73 28 28 28 63 68 61 72 2a 29 70 50 67 48 64 72  s(((char*)pPgHdr
1e4c0 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63 68 61  ->pData)+24, cha
1e4d0 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 23  nge_counter);..#
1e4e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1e4f0 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1e500 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
1e510 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
1e520 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1e530 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
1e540 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44  Buf = pPgHdr->pD
1e550 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ata;.      rc = 
1e560 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1e570 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
1e580 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e590 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  e, 0);.    }.#en
1e5a0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65  dif..    /* Rele
1e5b0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1e5c0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
1e5d0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e5e0 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
1e5f0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1e600 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
1e610 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e620 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70 61  *.** Sync the pa
1e630 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73 6b  ger file to disk
1e640 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e650 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72 20  PagerSync(Pager 
1e660 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1e670 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  rc;.  if( MEMDB 
1e680 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1e690 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
1e6a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6b0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1e6c0 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f  d, pPager->sync_
1e6d0 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20 72 65  flags);.  }.  re
1e6e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e6f0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1e700 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1e710 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1e720 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1e730 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1e740 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1e750 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1e760 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1e770 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1e780 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1e790 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1e7a0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1e7b0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1e7c0 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1e7d0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1e7e0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1e7f0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1e800 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1e810 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1e820 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1e830 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1e840 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1e850 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1e860 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e870 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1e880 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1e890 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1e8a0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1e8b0 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1e8c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1e8d0 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1e8e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1e8f0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1e900 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1e910 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1e920 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1e930 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1e940 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1e950 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1e960 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1e970 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1e980 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1e990 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1e9a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1e9b0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1e9c0 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1e9d0 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1e9e0 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1e9f0 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a   databases)..**.
1ea00 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20  ** If the final 
1ea10 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79  parameter - noSy
1ea20 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68  nc - is true, th
1ea30 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  en the database 
1ea40 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69  file itself.** i
1ea50 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68  s not synced. Th
1ea60 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61  e caller must ca
1ea70 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  ll sqlite3PagerS
1ea80 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74  ync() directly t
1ea90 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61  o.** sync the da
1eaa0 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f  tabase file befo
1eab0 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69  re calling Commi
1eac0 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64  tPhaseTwo() to d
1ead0 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75  elete the.** jou
1eae0 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69  rnal file in thi
1eaf0 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s case..*/.int s
1eb00 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1eb10 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67  tPhaseOne(.  Pag
1eb20 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63  er *pPager, .  c
1eb30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1eb40 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75  er, .  Pgno nTru
1eb50 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63  nc,.  int noSync
1eb60 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
1eb70 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1eb80 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1eb90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1eba0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1ebb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20    }..  /* If no 
1ebc0 63 68 61 6e 67 65 73 20 68 61 76 65 20 62 65 65  changes have bee
1ebd0 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e 20 6c  n made, we can l
1ebe0 65 61 76 65 20 74 68 65 20 74 72 61 6e 73 61 63  eave the transac
1ebf0 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2f  tion early..  */
1ec00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1ec10 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a  bModified==0 &&.
1ec20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
1ec30 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
1ec40 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1ec50 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20  DELETE ||.      
1ec60 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
1ec70 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b  usiveMode!=0) ){
1ec80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1ec90 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
1eca0 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 || pPager->jo
1ecb0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1ecc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ecd0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47  E_OK;.  }..  PAG
1ece0 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
1ecf0 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
1ed00 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
1ed10 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
1ed20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
1ed30 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
1ed40 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
1ed50 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
1ed60 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
1ed70 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
1ed80 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
1ed90 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
1eda0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1edb0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
1edc0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1edd0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1ede0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
1edf0 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
1ee00 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
1ee10 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1ee20 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1ee30 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1ee40 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
1ee50 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1ee60 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1ee70 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
1ee80 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
1ee90 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
1eea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1eeb0 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
1eec0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
1eed0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
1eee0 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
1eef0 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
1ef00 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
1ef10 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
1ef20 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
1ef30 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
1ef40 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
1ef50 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
1ef60 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
1ef70 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
1ef80 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
1ef90 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
1efa0 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
1efb0 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
1efc0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
1efd0 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
1efe0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
1eff0 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
1f000 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
1f010 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1f020 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
1f030 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20 20 20  AtomicWrite;.   
1f040 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63   pPg = sqlite3Pc
1f050 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70 50  acheDirtyList(pP
1f060 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1f070 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57 72 69      useAtomicWri
1f080 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21  te = (.        !
1f090 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20  zMaster && .    
1f0a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1f0b0 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20 20  nalOpen &&.     
1f0c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1f0d0 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66 65  alOff==jrnlBuffe
1f0e0 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26 26  rSize(pPager) &&
1f0f0 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e 63   .        nTrunc
1f100 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 20  ==0 && .        
1f110 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
1f120 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20 20 29  pDirty==0).    )
1f130 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1f140 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f150 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
1f160 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
1f170 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1f180 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74  );.    if( useAt
1f190 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20  omicWrite ){.   
1f1a0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1f1b0 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
1f1c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1f1d0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66   */.      int of
1f1e0 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a  fset = pPager->j
1f1f0 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65  ournalHdr + size
1f200 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1f210 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f220 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29  pPager->nRec==1)
1f230 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1f240 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1f250 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50  >jfd, offset, pP
1f260 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20  ager->nRec);..  
1f270 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1f280 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65  e db file change
1f290 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f   counter. The fo
1f2a0 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c  llowing call wil
1f2b0 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a  l modify.      *
1f2c0 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  * the in-memory 
1f2d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1f2e0 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c  f page 1 to incl
1f2f0 75 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a  ude the updated.
1f300 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20        ** change 
1f310 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e  counter and then
1f320 20 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69   write page 1 di
1f330 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61  rectly to the da
1f340 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1f350 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
1f360 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
1f370 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68  e property of th
1f380 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74  e host file-syst
1f390 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68  em, .      ** th
1f3a0 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20  is is safe..    
1f3b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72    */.      if( r
1f3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f3d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1f3e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
1f3f0 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29  unter(pPager, 1)
1f400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
1f410 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f420 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72  sqlite3JournalCr
1f430 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  eate(pPager->jfd
1f440 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
1f450 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74  ( !useAtomicWrit
1f460 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1f470 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20  OK ).#endif..   
1f480 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   /* If a master 
1f490 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
1f4a0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1f4b0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1f4c0 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  e.    ** journal
1f4d0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73   file, then no s
1f4e0 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e  ync is required.
1f4f0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
1f500 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  en it is.    ** 
1f510 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68  written, then th
1f520 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20  e process fails 
1f530 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20  to upgrade from 
1f540 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e  a RESERVED to an
1f550 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1f560 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74  E lock. The next
1f570 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73   time the proces
1f580 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69  s tries to commi
1f590 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1f5a0 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a  nsaction the m-j
1f5b0 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20   name will have 
1f5c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1f5d0 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
1f5e0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65   if( !pPager->se
1f5f0 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20  tMaster ){.     
1f600 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
1f610 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
1f620 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
1f630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f640 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1f650 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xit;.      if( p
1f660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1f670 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1f680 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23 69 66  LMODE_OFF ){.#if
1f690 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f6a0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1f6b0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1f6c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
1f6d0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1f6e0 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1f6f0 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1f700 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1f710 67 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ges.          **
1f720 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
1f730 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
1f740 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
1f750 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1f760 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  l.          ** f
1f770 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ile..          *
1f780 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  /.          Pgno
1f790 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
1f7a0 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1f7b0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1f7c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 20  .          for( 
1f7d0 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1f7e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1f7f0 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1f800 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
1f810 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1f820 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1f830 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
1f840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1f850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f860 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
1f870 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20   &pPg);.        
1f880 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f890 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f8a0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1f8b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f8c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f8d0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1f8e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1f8f0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1f900 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f920 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f930 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f940 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 20 20       } .        
1f950 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
1f960 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1f970 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1f980 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1f990 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f9a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f9b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 72  _exit;.        r
1f9c0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1f9d0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1f9e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1f9f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fa00 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
1fa10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fa20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1fa30 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1fa40 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fa50 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
1fa60 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
1fa70 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
1fa80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fa90 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1faa0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1fab0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
1fac0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
1fad0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1fae0 2f 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  /.    pPg = sqli
1faf0 74 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69  te3PcacheDirtyLi
1fb00 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  st(pPager->pPCac
1fb10 68 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  he);.    rc = pa
1fb20 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1fb30 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1fb40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1fb60 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1fb70 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20  _BLOCKED );.    
1fb80 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 6d    /* The error m
1fb90 69 67 68 74 20 68 61 76 65 20 6c 65 66 74 20 74  ight have left t
1fba0 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 61 6c  he dirty list al
1fbb0 6c 20 66 6f 75 6c 65 64 20 75 70 20 68 65 72 65  l fouled up here
1fbc0 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75 74 20 74  ,.      ** but t
1fbd0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  hat does not mat
1fbe0 74 65 72 20 62 65 63 61 75 73 65 20 69 66 20 74  ter because if t
1fbf0 68 65 20 69 66 20 74 68 65 20 64 69 72 74 79 20  he if the dirty 
1fc00 6c 69 73 74 20 64 69 64 0a 20 20 20 20 20 20 2a  list did.      *
1fc10 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 2c  * get corrupted,
1fc20 20 74 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   then the transa
1fc30 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20  ction will roll 
1fc40 62 61 63 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a  back and.      *
1fc50 2a 20 64 69 73 63 61 72 64 20 74 68 65 20 64 69  * discard the di
1fc60 72 74 79 20 6c 69 73 74 2e 20 20 54 68 65 72 65  rty list.  There
1fc70 20 69 73 20 61 6e 20 61 73 73 65 72 74 20 69 6e   is an assert in
1fc80 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f  .      ** pager_
1fc90 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1fca0 67 65 73 28 29 20 74 68 61 74 20 76 65 72 69 66  ges() that verif
1fcb0 69 65 73 20 74 68 61 74 20 6e 6f 20 61 74 74 65  ies that no atte
1fcc0 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  mpt.      ** is 
1fcd0 6d 61 64 65 20 74 6f 20 75 73 65 20 61 6e 20 69  made to use an i
1fce0 6e 76 61 6c 69 64 20 64 69 72 74 79 20 6c 69 73  nvalid dirty lis
1fcf0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1fd00 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74    goto sync_exit
1fd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1fd20 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  te3PcacheCleanAl
1fd30 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  l(pPager->pPCach
1fd40 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  e);..    /* Sync
1fd50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd60 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1fd70 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26  pPager->noSync &
1fd80 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  & !noSync ){.   
1fd90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1fda0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
1fdb0 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
1fdc0 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lags);.    }.   
1fdd0 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
1fde0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1fdf0 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
1fe00 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
1fe10 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
1fe20 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
1fe30 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
1fe40 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1fe50 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1fe60 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
1fe70 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
1fe80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
1fe90 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
1fea0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1feb0 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
1fec0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
1fed0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
1fee0 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c    * lock to spil
1fef0 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
1ff00 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
1ff10 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
1ff20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73  .     * there is
1ff30 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
1ff40 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
1ff50 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
1ff60 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74   * better to ret
1ff70 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
1ff80 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  .     */.    rc 
1ff90 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1ffa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ffb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
1ffc0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
1ffd0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
1ffe0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1fff0 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
20000 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
20010 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
20020 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
20030 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
20040 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
20050 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
20060 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
20070 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
20080 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
20090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
200a0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
200b0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
200c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
200d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
200e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
200f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
20100 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20110 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
20120 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
20130 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
20140 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
20150 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
20160 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
20170 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50  0 &&.        (pP
20180 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
20190 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
201a0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20  MODE_DELETE ||. 
201b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
201c0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d  >exclusiveMode!=
201d0 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
201e0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
201f0 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
20200 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
20210 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
20220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20230 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43 4f   PAGERTRACE2("CO
20240 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
20250 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20260 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20270 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
20280 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  CED || MEMDB || 
20290 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
202a0 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  che );.  rc = pa
202b0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
202c0 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
202d0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
202e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
202f0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
20300 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20310 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
20320 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65  ll changes.  The
20330 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
20340 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
20350 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c  ARED mode..** Al
20360 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  l in-memory cach
20370 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74  e pages revert t
20380 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  o their original
20390 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a   data contents..
203a0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** The journal i
203b0 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
203c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
203d0 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73  nnot fail unless
203e0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
203f0 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f  ess is not follo
20400 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72  wing.** the corr
20410 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  ect locking prot
20420 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73  ocol or unless s
20430 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
20440 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
20450 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
20460 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
20470 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
20480 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
20490 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
204a0 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
204b0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
204c0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
204d0 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
204e0 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
204f0 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
20500 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
20510 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
20520 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
20530 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
20540 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
20550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41   SQLITE_OK;.  PA
20560 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  GERTRACE2("ROLLB
20570 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
20580 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
20590 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
205a0 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
205b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
205c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
205d0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
205e0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
205f0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d  >setMaster);.  }
20600 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
20610 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
20620 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
20630 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
20640 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20650 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
20660 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
20670 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
20680 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
20690 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
206a0 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rCode;.  }else{.
206b0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
206c0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
206d0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 20 20 69  ERVED ){.      i
206e0 6e 74 20 72 63 32 3b 0a 20 20 20 20 20 20 72 63  nt rc2;.      rc
206f0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
20700 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
20710 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
20720 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20730 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
20740 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
20750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
20770 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 7d  c = rc2;.      }
20780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20790 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
207a0 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
207b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
207c0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
207d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
207e0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
207f0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
20800 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
20810 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
20820 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
20830 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
20840 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c  * cache. So call
20850 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f   pager_error() o
20860 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f  n the way out to
20870 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20   make any error 
20880 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74 65  .    ** persiste
20890 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  nt..    */.    r
208a0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
208b0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d  pPager, rc);.  }
208c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
208d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
208e0 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
208f0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
20900 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
20910 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
20920 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20930 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
20940 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
20950 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
20960 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
20970 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
20980 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
20990 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
209a0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
209b0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
209c0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
209d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
209e0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
209f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
20a00 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
20a10 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20a20 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
20a30 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
20a40 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20a50 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
20a60 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
20a70 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
20a80 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
20a90 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
20aa0 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
20ab0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
20ac0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20ad0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
20ae0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
20af0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
20b00 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
20b10 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
20b20 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
20b30 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
20b40 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
20b50 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
20b60 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
20b70 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
20b80 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
20b90 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
20ba0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
20bb0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
20bc0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
20bd0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
20be0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
20bf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
20c00 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
20c10 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
20c20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
20c30 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
20c40 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
20c50 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
20c60 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55   a[8] = 0;  /* U
20c70 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65 72  sed to be pPager
20c80 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39  ->nOvfl */.  a[9
20c90 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61  ] = pPager->nRea
20ca0 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61  d;.  a[10] = pPa
20cb0 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72  ger->nWrite;.  r
20cc0 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73  eturn a;.}.int s
20cd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65 6d  qlite3PagerIsMem
20ce0 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  db(Pager *pPager
20cf0 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d 44  ){.  return MEMD
20d00 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B;.}.#endif../*.
20d10 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
20d20 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
20d30 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
20d40 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
20d50 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
20d60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
20d70 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
20d80 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
20d90 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
20da0 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
20db0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
20dc0 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
20dd0 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
20de0 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
20df0 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
20e00 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
20e10 63 20 69 6e 74 20 70 61 67 65 72 53 74 6d 74 42  c int pagerStmtB
20e20 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
20e30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
20e40 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
20e50 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
20e60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20e70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
20e80 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
20e90 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
20ea0 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
20eb0 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
20ec0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
20ed0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
20ee0 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
20ef0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67  Open ){.    pPag
20f00 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
20f10 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
20f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20f30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20f40 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
20f50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20f60 72 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b  r->pInStmt==0 );
20f70 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  .  pPager->pInSt
20f80 6d 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  mt = sqlite3Bitv
20f90 65 63 43 72 65 61 74 65 28 70 50 61 67 65 72 2d  ecCreate(pPager-
20fa0 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  >dbSize);.  if( 
20fb0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
20fc0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
20fd0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
20fe0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
20ff0 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
21000 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
21010 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
21020 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
21030 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
21040 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
21050 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21060 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
21070 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
21080 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
21090 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
210a0 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
210b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
210c0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
210d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
210e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
210f0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
21100 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
21110 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
21120 74 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tfd);.    }else{
21130 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
21140 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
21150 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
21160 3e 73 74 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >stfd, SQLITE_OP
21170 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
21180 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
21190 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 6d          goto stm
211a0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
211b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
211c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
211d0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
211e0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
211f0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21200 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
21210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21220 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
21230 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
21240 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b  ager->pInStmt ){
21250 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
21260 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
21270 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->pInStmt);.    
21280 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
21290 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
212a0 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  n rc;.}.int sqli
212b0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
212c0 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
212d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63  {.  int rc;.  rc
212e0 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
212f0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  n(pPager);.  ret
21300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21310 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
21320 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21330 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
21340 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21350 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
21360 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
21370 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
21380 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
21390 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
213a0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
213b0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
213c0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20  ger->pInStmt);. 
213d0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
213e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
213f0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
21400 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
21410 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
21420 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 4d 65   if( sqlite3IsMe
21430 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  mJournal(pPager-
21440 3e 73 74 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >stfd) ){.      
21450 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
21460 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
21470 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
21480 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
21490 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
214a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
214b0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
214c0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
214d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
214e0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
214f0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
21500 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
21510 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
21520 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
21530 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
21540 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21550 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 72 63  pPager));.    rc
21560 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
21570 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
21580 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21590 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
215a0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
215b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
215c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
215d0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
215e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
215f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21600 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
21610 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
21620 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
21630 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
21640 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
21650 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21660 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
21670 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
21680 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
21690 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
216a0 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
216b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
216c0 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
216d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
216e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
216f0 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
21700 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
21710 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
21720 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
21730 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
21740 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
21750 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
21760 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
21770 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
21780 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
21790 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
217a0 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
217b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
217c0 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
217d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
217e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
217f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21800 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21810 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
21820 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
21830 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21840 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
21850 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
21860 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
21870 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
21880 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
21890 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
218a0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
218b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
218c0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
218d0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
218e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
218f0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
21900 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
21910 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
21920 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
21930 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
21940 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
21950 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21960 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
21970 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21980 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
21990 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
219a0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
219b0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
219c0 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
219d0 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
219e0 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
219f0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
21a00 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
21a10 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
21a20 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
21a30 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
21a40 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
21a50 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
21a60 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
21a70 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
21a80 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
21a90 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
21aa0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
21ab0 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
21ac0 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
21ad0 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
21ae0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
21af0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
21b00 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
21b10 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
21b20 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
21b30 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
21b40 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
21b50 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
21b60 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
21b70 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
21b80 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
21b90 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
21ba0 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
21bb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
21bc0 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
21bd0 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
21be0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
21bf0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
21c00 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
21c10 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
21c20 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
21c30 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
21c40 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
21c50 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
21c60 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
21c70 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
21c80 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
21c90 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
21ca0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
21cb0 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
21cc0 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
21cd0 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
21ce0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
21cf0 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
21d00 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
21d10 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
21d20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
21d30 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
21d40 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
21d50 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
21d60 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
21d70 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
21d80 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
21d90 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
21da0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
21db0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
21dc0 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20  ourth argument, 
21dd0 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e  isCommit, is non
21de0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73  -zero, then this
21df0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a   page is being.*
21e00 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20  * moved as part 
21e10 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65  of a database re
21e20 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73  organization jus
21e30 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  t before the tra
21e40 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20  nsaction .** is 
21e50 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e  being committed.
21e60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69   In this case, i
21e70 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
21e80 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
21e90 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72  e page .** pPg r
21ea0 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f  efers to will no
21eb0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
21ec0 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69  again within thi
21ed0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  s transaction..*
21ee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21ef0 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
21f00 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
21f10 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
21f20 2c 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b  , int isCommit){
21f30 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
21f40 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
21f50 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
21f60 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64  . */.  Pgno need
21f70 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
21f80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
21f90 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52  ef>0 );..  PAGER
21fa0 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
21fb0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
21fc0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
21fd0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
21fe0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
21ff0 67 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66  g->pgno, (pPg->f
22000 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
22010 53 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29  SYNC)?1:0, pgno)
22020 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
22030 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
22040 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
22050 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
22060 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
22070 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
22080 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
22090 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
220a0 65 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e  efore page pPg->
220b0 70 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65  pgno can.  ** be
220c0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f   written to, sto
220d0 72 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20  re pPg->pgno in 
220e0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  local variable n
220f0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a  eedSyncPgno..  *
22100 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73  *.  ** If the is
22110 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  Commit flag is s
22120 65 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  et, there is no 
22130 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
22140 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a   that.  ** the j
22150 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
22160 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
22170 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
22180 20 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a   pPg->pgno .  **
22190 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
221a0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
221b0 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
221c0 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
221d0 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
221e0 66 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  f( (pPg->flags&P
221f0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20  GHDR_NEED_SYNC) 
22200 26 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a  && !isCommit ){.
22210 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
22220 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
22230 20 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e    assert( pageIn
22240 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20  Journal(pPg) || 
22250 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72  (int)pgno>pPager
22260 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
22270 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
22280 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
22290 54 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TY );.    assert
222a0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
222b0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
222c0 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
222d0 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
222e0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
222f0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
22300 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
22310 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
22320 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
22330 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
22340 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
22350 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
22360 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
22370 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
22380 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
22390 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
223a0 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
223b0 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
223c0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50  _NEED_SYNC;.  pP
223d0 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
223e0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
223f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  );.  assert( !pP
22400 67 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e  gOld || pPgOld->
22410 6e 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nRef==1 );.  if(
22420 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70   pPgOld ){.    p
22430 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50  Pg->flags |= (pP
22440 67 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44  gOld->flags&PGHD
22450 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20  R_NEED_SYNC);.  
22460 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  }..  sqlite3Pcac
22470 68 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f  heMove(pPg, pgno
22480 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
22490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
224a0 61 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29  acheDrop(pPgOld)
224b0 3b 0a 20 20 7d 0a 0a 20 20 6d 61 6b 65 44 69 72  ;.  }..  makeDir
224c0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
224d0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
224e0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  1;.  pPager->dbM
224f0 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20  odified = 1;..  
22500 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
22510 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
22520 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
22530 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
22540 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
22550 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
22560 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
22570 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
22580 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
22590 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
225a0 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
225b0 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
225c0 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
225d0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
225e0 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
225f0 2a 20 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22  * "is journaled"
22600 20 62 69 74 76 65 63 20 66 6c 61 67 20 68 61 73   bitvec flag has
22610 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
22620 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
22630 64 69 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c  died by.    ** l
22640 6f 61 64 69 6e 67 20 74 68 65 20 70 61 67 65 20  oading the page 
22650 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
22660 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
22670 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
22680 79 6e 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67  ync .    ** flag
22690 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
226a0 49 66 20 74 68 65 20 61 74 74 65 6d 70 74 20 74  If the attempt t
226b0 6f 20 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20  o load the page 
226c0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61  into the page-ca
226d0 63 68 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a  che fails, (due.
226e0 20 20 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c      ** to a mall
226f0 6f 63 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75  oc() or IO failu
22700 72 65 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62  re), clear the b
22710 69 74 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75  it in the pInJou
22720 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72  rnal[].    ** ar
22730 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ray. Otherwise, 
22740 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6c  if the page is l
22750 6f 61 64 65 64 20 61 6e 64 20 77 72 69 74 74 65  oaded and writte
22760 6e 20 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a  n again in.    *
22770 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  * this transacti
22780 6f 6e 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72  on, it may be wr
22790 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
227a0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
227b0 65 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73  e.    ** it is s
227c0 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a  ynced into the j
227d0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
227e0 73 20 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e  s way, it may en
227f0 64 20 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74  d up in.    ** t
22800 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
22810 74 77 69 63 65 2c 20 62 75 74 20 74 68 61 74 20  twice, but that 
22820 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
22830 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
22840 54 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  The sqlite3Pager
22850 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  Get() call may c
22860 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
22870 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
22880 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
22890 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
228a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
228b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
228c0 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72 20 2a   rc;.    PgHdr *
228d0 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73 73 65  pPgHdr;.    asse
228e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
228f0 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d  Sync );.    rc =
22900 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22910 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
22920 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72 29 3b  cPgno, &pPgHdr);
22930 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
22940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22950 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
22960 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 6e  ournal && (int)n
22970 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50 61  eedSyncPgno<=pPa
22980 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
22990 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
229a0 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50  e3BitvecClear(pP
229b0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
229c0 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29 3b  , needSyncPgno);
229d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
229e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
229f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
22a00 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73  Sync = 1;.    as
22a10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f  sert( pPager->no
22a20 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44  Sync==0 && !MEMD
22a30 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  B );.    pPgHdr-
22a40 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
22a50 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 6d  NEED_SYNC;.    m
22a60 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
22a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
22a80 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
22a90 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
22aa0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
22ab0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
22ac0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22ad0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
22ae0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
22af0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
22b00 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
22b10 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65  ge *pPg){.  asse
22b20 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
22b30 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
22b40 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72  memDb );.  retur
22b50 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a  n pPg->pData;.}.
22b60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22b70 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
22b80 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
22b90 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61  s of "extra" spa
22ba0 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  ce .** allocated
22bb0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
22bc0 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
22bd0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
22be0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62  PagerGetExtra(Db
22bf0 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61  Page *pPg){.  Pa
22c00 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
22c10 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74  g->pPager;.  ret
22c20 75 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d  urn (pPager?pPg-
22c30 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f  >pExtra:0);.}../
22c40 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
22c50 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f   locking-mode fo
22c60 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
22c70 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
22c80 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20  st be one.** of 
22c90 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22ca0 45 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c  E_QUERY, PAGER_L
22cb0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
22cc0 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c  L or .** PAGER_L
22cd0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
22ce0 53 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72  SIVE. If the par
22cf0 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51  ameter is not _Q
22d00 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  UERY, then.** th
22d10 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69  e locking-mode i
22d20 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
22d30 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  ue specified..**
22d40 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22d50 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
22d60 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
22d70 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20  DE_NORMAL or.** 
22d80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22d90 45 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64  E_EXCLUSIVE, ind
22da0 69 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72  icating the curr
22db0 65 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70  ent (possibly up
22dc0 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e  dated).** lockin
22dd0 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  g-mode..*/.int s
22de0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
22df0 6e 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50  ngMode(Pager *pP
22e00 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29  ager, int eMode)
22e10 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64  {.  assert( eMod
22e20 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
22e30 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20  MODE_QUERY.     
22e40 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
22e50 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
22e60 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  DE_NORMAL.      
22e70 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
22e80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22e90 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20  E_EXCLUSIVE );. 
22ea0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
22eb0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
22ec0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
22ed0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22ee0 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50  E_NORMAL>=0 && P
22ef0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22f00 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b  _EXCLUSIVE>=0 );
22f10 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
22f20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
22f30 46 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67  File ){.    pPag
22f40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
22f50 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20  e = eMode;.  }. 
22f60 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
22f70 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
22f80 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
22f90 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  /set the journal
22fa0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
22fb0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
22fc0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
22fd0 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50  e of:.**.**    P
22fe0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
22ff0 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47  _QUERY.**    PAG
23000 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
23010 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  ELETE.**    PAGE
23020 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
23030 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47  UNCATE.**    PAG
23040 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
23050 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47  ERSIST.**    PAG
23060 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
23070 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  FF.**.** If the 
23080 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
23090 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68   _QUERY, then th
230a0 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
230b0 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20  s set to the.** 
230c0 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
230d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
230e0 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65  ned indicate the
230f0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
23100 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a  ly updated).** j
23110 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ournal-mode..*/.
23120 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
23130 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65  JournalMode(Page
23140 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
23150 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45  Mode){.  if( !ME
23160 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72  MDB ){.    asser
23170 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
23180 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
23190 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
231a0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
231b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
231c0 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TE.             
231d0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
231e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
231f0 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20  NCATE.          
23200 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
23210 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23220 50 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20  PERSIST.        
23230 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
23240 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
23250 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20  E_OFF .         
23260 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
23270 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23280 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61  _MEMORY );.    a
23290 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55  ssert( PAGER_JOU
232a0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30  RNALMODE_QUERY<0
232b0 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64   );.    if( eMod
232c0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  e>=0 ){.      pP
232d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
232e0 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 20 20 7d  e = eMode;.    }
232f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
23300 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
23310 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
23320 52 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RY );.    }.  }.
23330 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
23340 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
23350 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
23360 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d  set the size-lim
23370 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73  it used for pers
23380 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
23390 69 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  iles..*/.i64 sql
233a0 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
233b0 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20  SizeLimit(Pager 
233c0 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69  *pPager, i64 iLi
233d0 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d  mit){.  if( iLim
233e0 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50  it>=-1 ){.    pP
233f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
23400 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b  eLimit = iLimit;
23410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50  .  }.  return pP
23420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
23430 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69  eLimit;.}..#endi
23440 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
23450 5f 44 49 53 4b 49 4f 20 2a 2f 0a                 _DISKIO */.