/ Hex Artifact Content
Login

Artifact 2e9182e181bbd3d758436d9ccce2a3910400dd30:


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: 39 20 32 30 30 38 2f 31 31 2f 32 36 20 30 37 3a  9 2008/11/26 07:
0360: 32 35 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37  25:52 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 38 20 64 62 53 69 7a 65 56   */.  u8 dbSizeV
2040: 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  alid;           
2050: 20 20 2f 2a 20 53 65 74 20 77 68 65 6e 20 64 62    /* Set when db
2060: 53 69 7a 65 20 69 73 20 63 6f 72 72 65 63 74 20  Size is correct 
2070: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
2080: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2090: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
20a0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
20b0: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
20c0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
20d0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
20e0: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
20f0: 72 6f 72 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64  rors */.  Pgno d
2100: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2110: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2120: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2130: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
2140: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2150: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
2160: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
2170: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 50  nt change */.  P
2180: 67 6e 6f 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  gno stmtSize;   
2190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
21a0: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
21b0: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
21c0: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
21d0: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
21e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
2200: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2210: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
2220: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
2230: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
2240: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
2250: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
2260: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
2270: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
2280: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2290: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
22a0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
22b0: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22d0: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
22e0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
22f0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2300: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2320: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2330: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
2340: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
2360: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
2370: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
2380: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23a0: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
23b0: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
23c0: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
23d0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23f0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
2400: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
2410: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
2420: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
2430: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2440: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2450: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2460: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
2470: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
2480: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2490: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
24a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
24b0: 20 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61 79    Bitvec *pAlway
24c0: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f 2a  sRollback;    /*
24d0: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
24e0: 68 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  h page marked al
24f0: 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ways-rollback */
2500: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
2510: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
2520: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
2530: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2540: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2560: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
2570: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
2580: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
2590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
25a0: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
25b0: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
25c0: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69   files */.  sqli
25d0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a  te3_file *fd, *j
25e0: 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  fd;     /* File 
25f0: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
2600: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
2610: 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rnal */.  sqlite
2620: 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  3_file *stfd;   
2630: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2640: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
2650: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
2660: 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20 28 2a  urnal*/.  int (*
2670: 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
2680: 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63 74 69 6f  id*); /* Functio
2690: 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65 6e 20 62  n to call when b
26a0: 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  usy */.  void *p
26b0: 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 20  BusyHandlerArg; 
26c0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
26d0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 78 42 75  argument for xBu
26e0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69  syHandler */.  i
26f0: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
2700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2710: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
2720: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
2730: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
2740: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
2750: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
2760: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
2770: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
2780: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
2790: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
27a0: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
27b0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
27c0: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
27d0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
27e0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
27f0: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
2800: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
2810: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  i
2820: 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20  64 stmtJSize;   
2830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2840: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74  ze of journal at
2850: 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f   stmt_begin() */
2860: 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a  .  u32 sectorSiz
2870: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2880: 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72  * Assumed sector
2890: 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c   size during rol
28a0: 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20  lback */.#ifdef 
28b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
28c0: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20  t nHit, nMiss;  
28d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63            /* Cac
28e0: 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73  he hits and miss
28f0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ing */.  int nRe
2900: 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20  ad, nWrite;     
2910: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2920: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
2930: 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ten */.#endif.  
2940: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
2950: 29 28 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43  )(DbPage*); /* C
2960: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
2970: 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20   when reloading 
2980: 70 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20  pages */.#ifdef 
2990: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
29a0: 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
29b0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
29c0: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
29d0: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
29e0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
29f0: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
2a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a10: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
2a20: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64  xCodec() */.#end
2a30: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
2a40: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
2a50: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
2a60: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2a70: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
2a80: 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65  .  char dbFileVe
2a90: 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f  rs[16];        /
2aa0: 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76  * Changes whenev
2ab0: 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  er database file
2ac0: 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36   changes */.  i6
2ad0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  4 journalSizeLim
2ae0: 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  it;       /* Siz
2af0: 65 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73  e limit for pers
2b00: 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  istent journal f
2b10: 69 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65  iles */.  PCache
2b20: 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20   *pPCache;      
2b30: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2b40: 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f   to page cache o
2b50: 62 6a 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  bject */.};../*.
2b60: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2b70: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
2b80: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
2b90: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
2ba0: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
2bb0: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
2bc0: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
2bd0: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
2be0: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
2bf0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
2c00: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
2c10: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2c20: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2c30: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
2c40: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
2c50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
2c60: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
2c70: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
2c80: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2c90: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
2ca0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
2cb0: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
2cc0: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
2cd0: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
2ce0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
2cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2d00: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
2d10: 6e 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  nal */.# define 
2d20: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76  PAGER_INCR(v)  v
2d30: 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ++.#else.# defin
2d40: 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a  e PAGER_INCR(v).
2d50: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
2d60: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
2d70: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
2d80: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
2d90: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
2da0: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
2db0: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
2dc0: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
2dd0: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
2de0: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
2df0: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
2e00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
2e10: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
2e20: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
2e30: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
2e40: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
2e50: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
2e60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
2e70: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
2e80: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
2e90: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
2ea0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
2eb0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
2ec0: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
2ed0: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
2ee0: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
2ef0: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
2f00: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
2f10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
2f20: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
2f30: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
2f40: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
2f50: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
2f60: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
2f70: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
2f80: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
2f90: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
2fa0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
2fb0: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
2fc0: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
2fd0: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
2fe0: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
2ff0: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3000: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
3010: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
3020: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
3030: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
3040: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
3050: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
3060: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3070: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3080: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3090: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
30a0: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
30b0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
30c0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
30d0: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
30e0: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
30f0: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3100: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3110: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3120: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3130: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3140: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3150: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3160: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3170: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3180: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3190: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
31a0: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
31b0: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
31c0: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
31d0: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
31e0: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
31f0: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3200: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3210: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3220: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3230: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3240: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3250: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3260: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3270: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3280: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3290: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
32a0: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
32b0: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
32c0: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
32d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
32e0: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
32f0: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3300: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3310: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3320: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3330: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3340: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3350: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3360: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3370: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3380: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3390: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
33a0: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
33b0: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
33c0: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
33d0: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
33e0: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
33f0: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3400: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3410: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3420: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3430: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3440: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3450: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3460: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3470: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3480: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3490: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
34a0: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
34b0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
34c0: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
34d0: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
34e0: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
34f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3500: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
3510: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
3520: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
3530: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
3540: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
3550: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
3560: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
3570: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
3580: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3590: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
35a0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
35b0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
35c0: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
35d0: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
35e0: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41  * Page number PA
35f0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e  GER_MJ_PGNO is n
3600: 65 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20  ever used in an 
3610: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
3620: 28 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76  (it is.** reserv
3630: 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61  ed for working a
3640: 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f  round a windows/
3650: 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62  posix incompatib
3660: 69 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a  ility). It is.**
3670: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75   used in the jou
3680: 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20  rnal to signify 
3690: 74 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64  that the remaind
36a0: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
36b0: 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65  l file .** is de
36c0: 76 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67  voted to storing
36d0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
36e0: 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61  l name - there a
36f0: 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73  re no more pages
3700: 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b   to.** roll back
3710: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66  . See comments f
3720: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  or function writ
3730: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29  eMasterJournal()
3740: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
3750: 0a 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45  ./* #define PAGE
3760: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
3770: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
3780: 3e 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23  >pageSize)) */.#
3790: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
37a0: 50 47 4e 4f 28 78 29 20 28 28 50 67 6e 6f 29 28  PGNO(x) ((Pgno)(
37b0: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
37c0: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
37d0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  ))../*.** The ma
37e0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
37f0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
3800: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
3810: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
3820: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
3830: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
3840: 66 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20  f page *pPg has 
3850: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
3860: 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tten to the stat
3870: 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ement.** journal
3880: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73   (or statement s
3890: 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e  napshot has been
38a0: 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50   created, if *pP
38b0: 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  g is part.** of 
38c0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
38d0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
38e0: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74  c int pageInStat
38f0: 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ement(PgHdr *pPg
3900: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
3910: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
3920: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3930: 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
3940: 67 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50  ger->pInStmt, pP
3950: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 73 74 61  g->pgno);.}..sta
3960: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f  tic int pageInJo
3970: 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67  urnal(PgHdr *pPg
3980: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3990: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
39a0: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  g->pPager->pInJo
39b0: 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f  urnal, pPg->pgno
39c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
39d0: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
39e0: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
39f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a00: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
3a10: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
3a20: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
3a30: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
3a40: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
3a50: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
3a60: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
3a70: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3a80: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
3a90: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
3aa0: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
3ab0: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
3ac0: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
3ad0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
3ae0: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
3af0: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
3b00: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
3b10: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
3b20: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
3b30: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
3b40: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
3b50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3b60: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
3b70: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
3b80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
3b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
3ba0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
3bb0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
3bc0: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
3bd0: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
3be0: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
3bf0: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
3c00: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
3c10: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
3c20: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
3c30: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
3c40: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3c50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3c60: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
3c70: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
3c80: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
3c90: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
3ca0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
3cb0: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
3cc0: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
3cd0: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
3ce0: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
3cf0: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
3d00: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
3d10: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
3d20: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
3d30: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
3d40: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
3d50: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
3d60: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
3d70: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
3d80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
3d90: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
3da0: 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74    if( !pFd->pMet
3db0: 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75  hods ){.    retu
3dc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3de0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20  e3OsUnlock(pFd, 
3df0: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
3e00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
3e10: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
3e20: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
3e30: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
3e40: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
3e50: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
3e60: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
3e70: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
3e80: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
3e90: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
3ea0: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
3eb0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
3ec0: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
3ed0: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
3ee0: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
3ef0: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
3f00: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
3f10: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
3f20: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
3f30: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
3f40: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
3f50: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
3f60: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  size..**.** If t
3f70: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
3f80: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
3f90: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
3fa0: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
3fb0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
3fc0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
3fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
3fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
3ff0: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
4000: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
4010: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
4020: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
4030: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
4040: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
4050: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
4060: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
4070: 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20  r){.  int dc;   
4080: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
4090: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
40a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74  s */.  int nSect
40b0: 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74  or;      /* Sect
40c0: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  or size */.  int
40d0: 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20 20   szPage;        
40e0: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
40f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
4100: 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
4110: 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  ..  if( fd->pMet
4120: 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d  hods ){.    dc =
4130: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
4140: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
4150: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
4160: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
4170: 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20  orSize(fd);.    
4180: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
4190: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a  >pageSize;.  }..
41a0: 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
41b0: 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
41c0: 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73  =(512>>8));.  as
41d0: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
41e0: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
41f0: 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28  536>>8));..  if(
4200: 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c   !fd->pMethods |
4210: 7c 20 0a 20 20 20 20 20 20 20 28 64 63 20 26 20  | .       (dc & 
4220: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
4230: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
4240: 29 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a  ) && nSector<=sz
4250: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Page) ){.    ret
4260: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
4270: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
4280: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4290: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
42a0: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
42b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
42c0: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
42d0: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
42e0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
42f0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
4300: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
4310: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
4320: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
4330: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
4340: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
4350: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
4360: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
4370: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
4380: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
4390: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
43a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
43b0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
43c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
43d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
43e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
43f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
4400: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
4410: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
4420: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
4430: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
4440: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
4450: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
4460: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
4470: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
4480: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
4490: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
44a0: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
44b0: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
44c0: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
44d0: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
44e0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
44f0: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
4500: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
4510: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
4520: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
4530: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
4540: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
4550: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
4560: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
4570: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
4580: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
4590: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
45a0: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
45b0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
45c0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
45d0: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
45e0: 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61  replayed..*/.sta
45f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
4600: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
4610: 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ger);.static int
4620: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
4630: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
4640: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
4650: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
4660: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
4670: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
4680: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
4690: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
46a0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
46b0: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
46c0: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
46d0: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
46e0: 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72    );.  if(.    r
46f0: 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
4700: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
4710: 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
4720: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  rc2==SQLITE_CORR
4730: 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61  UPT.  ){.    pPa
4740: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
4750: 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  c;.    if( pPage
4760: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
4770: 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26 20  UNLOCK .     && 
4780: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
4790: 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
47a0: 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
47b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
47c0: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
47d0: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
47e0: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
47f0: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
4800: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
4810: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
4820: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
4830: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
4840: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
4850: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
4860: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
4870: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4880: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
48a0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
48b0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
48c0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
48d0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
48e0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
48f0: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
4900: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
4910: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
4920: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
4930: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
4940: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4950: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4960: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4970: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4980: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4990: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
49a0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
49b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
49c0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
49d0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
49e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
49f0: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
4a00: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
4a10: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
4a20: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
4a30: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
4a40: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
4a50: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
4a60: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
4a70: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
4a80: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e 73  ->pageSize, (uns
4a90: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50 61  igned char *)pPa
4aa0: 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74  ge->pData);.}.st
4ab0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
4ac0: 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67 48  set_pagehash(PgH
4ad0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70 50  dr *pPage){.  pP
4ae0: 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  age->pageHash = 
4af0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
4b00: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
4b10: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
4b20: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
4b30: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
4b40: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
4b50: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
4b60: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
4b70: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
4b80: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
4b90: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
4ba0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
4bb0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
4bc0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
4bd0: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
4be0: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
4bf0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4c00: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
4c10: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
4c20: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
4c30: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
4c40: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
4c50: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
4c60: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
4c70: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
4c80: 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d 3e  .      || (pPg->
4c90: 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
4ca0: 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65 48  Y) || pPg->pageH
4cb0: 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68  ash==pager_pageh
4cc0: 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23  ash(pPg) );.}..#
4cd0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67  else.#define pag
4ce0: 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29  er_datahash(X,Y)
4cf0: 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65    0.#define page
4d00: 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30  r_pagehash(X)  0
4d10: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4d20: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20 2f  AGE(x).#endif  /
4d30: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  * SQLITE_CHECK_P
4d40: 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57  AGES */../*.** W
4d50: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
4d60: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
4d70: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
4d80: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
4d90: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
4da0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
4db0: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
4dc0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
4dd0: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
4de0: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
4df0: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
4e00: 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a  caller. .**.** z
4e10: 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69 6e  Master must poin
4e20: 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  t to a buffer of
4e30: 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74 65   at least nMaste
4e40: 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  r bytes allocate
4e50: 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  d by.** the call
4e60: 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  er. This should 
4e70: 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d  be sqlite3_vfs.m
4e80: 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f 20  xPathname+1 (to 
4e90: 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73 0a  ensure there is.
4ea0: 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ** enough space 
4eb0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61 73  to write the mas
4ec0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
4ed0: 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65 72  ). If the master
4ee0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65   journal.** name
4ef0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
4f00: 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 6e  is longer than n
4f10: 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69 6e  Master bytes (in
4f20: 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c  cluding a.** nul
4f30: 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74 68  -terminator), th
4f40: 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64 6c  en this is handl
4f50: 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73 74  ed as if no mast
4f60: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er journal name.
4f70: 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 20  ** were present 
4f80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  in the journal..
4f90: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74  **.** If no mast
4fa0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
4fb0: 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20  name is present 
4fc0: 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65  zMaster[0] is se
4fd0: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
4fe0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
4ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5000: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5010: 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  l(sqlite3_file *
5020: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61  pJrnl, char *zMa
5030: 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65  ster, u32 nMaste
5040: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5050: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5060: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5070: 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20  .  u32 u;       
5080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
5090: 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75  nsigned loop cou
50a0: 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nter */.  unsign
50b0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
50c0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
50d0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
50e0: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d   header */..  zM
50f0: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
5100: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5110: 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c  OsFileSize(pJrnl
5120: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
5130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5140: 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20  szJ<16 ) return 
5150: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5160: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
5170: 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69  J-16, &len);.  i
5180: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
51a0: 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65   if( len>=nMaste
51b0: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
51c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
51d0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51e0: 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c  s(pJrnl, szJ-12,
51f0: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
5200: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5210: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
5230: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
5240: 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28  8, szJ-8);.  if(
5250: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
5260: 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  | memcmp(aMagic,
5270: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
5280: 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  8) ) return rc;.
5290: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
52a0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61  sRead(pJrnl, zMa
52b0: 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31  ster, len, szJ-1
52c0: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
52d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
52e0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
52f0: 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d  }.  zMaster[len]
5300: 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53   = '\0';..  /* S
5310: 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73  ee if the checks
5320: 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d  um matches the m
5330: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
5340: 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30 3b  me */.  for(u=0;
5350: 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20   u<len; u++){.  
5360: 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74    cksum -= zMast
5370: 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69 66  er[u];.   }.  if
5380: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
5390: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
53a0: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
53b0: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
53c0: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
53d0: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
53e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
53f0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5400: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
5410: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
5420: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
5430: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
5440: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
5450: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
5460: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
5470: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
5480: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
5490: 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27    zMaster[0] = '
54a0: 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72  \0';.  }.   .  r
54b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
54c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  .}../*.** Seek t
54d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
54e0: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
54f0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
5500: 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a  undary where a.*
5510: 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  * journal header
5520: 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20   may be read or 
5530: 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a  written. Pager.j
5540: 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64  ournalOff is upd
5550: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
5560: 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74   new seek offset
5570: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
5580: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
5590: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75   512:.**.** Inpu
55a0: 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20  t Offset        
55b0: 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66        Output Off
55c0: 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  set.** ---------
55d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
55f0: 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  * 0             
5600: 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a              0.**
5610: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
5620: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
5630: 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20  * 100           
5640: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5650: 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20  ** 2000         
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34               204
5670: 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20  8.** .*/.static 
5680: 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  void seekJournal
5690: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
56a0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
56b0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
56c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
56d0: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
56e0: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
56f0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5700: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5710: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5720: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5730: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5740: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5750: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5760: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5770: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5780: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5790: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
57a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
57b0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
57c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a  }../*.** Write z
57d0: 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65  eros over the he
57e0: 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
57f0: 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
5800: 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63  has the.** effec
5810: 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e  t of invalidatin
5820: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
5830: 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e  le and committin
5840: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  g the.** transac
5850: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5860: 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  int zeroJournalH
5870: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5880: 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65  , int doTruncate
5890: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
58a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69  LITE_OK;.  stati
58b0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72  c const char zer
58c0: 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a  oHdr[28] = {0};.
58d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
58e0: 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20  ournalOff ){.   
58f0: 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70 50   i64 iLimit = pP
5900: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a  ager->journalSiz
5910: 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f 54  eLimit;..    IOT
5920: 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52 20  RACE(("JZEROHDR 
5930: 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
5940: 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63 61      if( doTrunca
5950: 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30 20  te || iLimit==0 
5960: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5970: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
5980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
5990: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
59a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
59b0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
59c0: 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65  d, zeroHdr, size
59d0: 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b  of(zeroHdr), 0);
59e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
59f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
5a00: 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
5a10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
5a20: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
5a30: 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45 5f  er->jfd, SQLITE_
5a40: 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70 50  SYNC_DATAONLY|pP
5a50: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
5a60: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5a70: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
5a80: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
5a90: 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74 20  s committed but 
5aa0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 0a  the write lock .
5ab0: 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
5ac0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
5ad0: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
5ae0: 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66 69  size limit confi
5af0: 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20 2a  gured for .    *
5b00: 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  * the persistent
5b10: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65   journal and the
5b20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 75   journal file cu
5b30: 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65 73  rrently consumes
5b40: 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70 61   more.    ** spa
5b50: 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69 6d  ce than that lim
5b60: 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20 74  it allows for, t
5b70: 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e 20  runcate it now. 
5b80: 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
5b90: 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63 20  .    ** to sync 
5ba0: 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77 69  the file followi
5bb0: 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  ng this operatio
5bc0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
5bd0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5be0: 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a 20  && iLimit>0 ){. 
5bf0: 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20 20       i64 sz;.   
5c00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5c10: 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
5c20: 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20 20  ->jfd, &sz);.   
5c30: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
5c40: 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d 69  E_OK && sz>iLimi
5c50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
5c60: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
5c70: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
5c80: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
5c90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
5ca0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5cb0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5cc0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5cd0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5ce0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5cf0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
5d00: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5d10: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
5d20: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
5d30: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
5d40: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
5d50: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5d60: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5d70: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5d80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5d90: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5da0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5db0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5dc0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5dd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5de0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5df0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
5e00: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5e10: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
5e20: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
5e30: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5e40: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
5e50: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
5e60: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
5e70: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
5e80: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
5e90: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
5ea0: 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  al..** - 4 bytes
5eb0: 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 20  : Database page 
5ec0: 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c  size..** .** Fol
5ed0: 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41  lowed by (JOURNA
5ee0: 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20 62  L_HDR_SZ - 28) b
5ef0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
5f00: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
5f10: 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  int writeJournal
5f20: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5f30: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
5f40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
5f50: 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67   *zHeader = pPag
5f60: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
5f70: 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20 70   u32 nHeader = p
5f80: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
5f90: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a 0a  .  u32 nWrite;..
5fa0: 20 20 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f    if( nHeader>JO
5fb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5fc0: 67 65 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61  ger) ){.    nHea
5fd0: 64 65 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  der = JOURNAL_HD
5fe0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
5ff0: 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
6000: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
6010: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
6020: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
6030: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
6040: 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61   }..  seekJourna
6050: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6060: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6070: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6080: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63  rnalOff;..  memc
6090: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
60a0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
60b0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
60c0: 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57  );..  /* .  ** W
60d0: 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46 69  rite the nRec Fi
60e0: 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72  eld - the number
60f0: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
6100: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69   that follow thi
6110: 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  s.  ** journal h
6120: 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  eader. Normally,
6130: 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e   zero is written
6140: 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61   to this value a
6150: 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a  t this time..  *
6160: 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63 6f  * After the reco
6170: 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74 6f  rds are added to
6180: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e   the journal (an
6190: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79  d the journal sy
61a0: 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69  nced, .  ** if i
61b0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
61c0: 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f  ), the zero is o
61d0: 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
61e0: 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a  the true number.
61f0: 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20    ** of records 
6200: 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  (see syncJournal
6210: 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ())..  **.  ** A
6220: 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74   faster alternat
6230: 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65 20  ive is to write 
6240: 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74 68  0xFFFFFFFF to th
6250: 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68  e nRec field. Wh
6260: 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  en.  ** reading 
6270: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73  the journal this
6280: 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c   value tells SQL
6290: 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68  ite to assume th
62a0: 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74  at the.  ** rest
62b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
62c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61  file contains va
62d0: 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73  lid page records
62e0: 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f  . This assumptio
62f0: 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72  n.  ** is danger
6300: 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61 69  ous, as if a fai
6310: 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68 69  lure occured whi
6320: 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
6330: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
6340: 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74  file it may cont
6350: 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ain some garbage
6360: 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65   data. There are
6370: 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20   two scenarios. 
6380: 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72   ** where this r
6390: 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72  isk can be ignor
63a0: 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ed:.  **.  **   
63b0: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72  * When the pager
63c0: 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d   is in no-sync m
63d0: 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20  ode. Corruption 
63e0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a  can follow a.  *
63f0: 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c  *     power fail
6400: 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ure in this case
6410: 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20   anyway..  **.  
6420: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
6430: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
6440: 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73  E_APPEND flag is
6450: 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61   set. This guara
6460: 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74  ntees.  **     t
6470: 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61  hat garbage data
6480: 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64   is never append
6490: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
64a0: 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61  l file..  */.  a
64b0: 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64  ssert(pPager->fd
64c0: 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67  ->pMethods||pPag
64d0: 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69  er->noSync);.  i
64e0: 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( (pPager->noSy
64f0: 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  nc) || (pPager->
6500: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
6510: 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
6520: 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71  EMORY).   || (sq
6530: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
6540: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
6550: 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f  ger->fd)&SQLITE_
6560: 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
6570: 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74  D) .  ){.    put
6580: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
6590: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
65a0: 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66  agic)], 0xffffff
65b0: 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ff);.  }else{.  
65c0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
65d0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
65e0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b  rnalMagic)], 0);
65f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
6600: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
6610: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
6620: 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
6630: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
6640: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
6650: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6660: 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74  nit);.  put32bit
6670: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6680: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6690: 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  +4], pPager->cks
66a0: 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68  umInit);.  /* Th
66b0: 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61  e initial databa
66c0: 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74  se size */.  put
66d0: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
66e0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
66f0: 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72  agic)+8], pPager
6700: 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20  ->dbSize);.  /* 
6710: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
6720: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
6730: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75   process */.  pu
6740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
6750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6760: 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67  Magic)+12], pPag
6770: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6780: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
6790: 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29 7b 0a  ournalHdr==0 ){.
67a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
67b0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75 74 33  size */.    put3
67c0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
67d0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
67e0: 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67 65 72  gic)+16], pPager
67f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
6800: 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30  ..  for(nWrite=0
6810: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26  ; rc==SQLITE_OK&
6820: 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f  &nWrite<JOURNAL_
6830: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20  HDR_SZ(pPager); 
6840: 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29  nWrite+=nHeader)
6850: 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
6860: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
6870: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
6880: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
6890: 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63  nHeader)).    rc
68a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
68b0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
68c0: 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c  Header, nHeader,
68d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
68e0: 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Off);.    pPager
68f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
6900: 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  nHeader;.  }..  
6910: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6920: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6930: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6940: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
6950: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
6960: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
6970: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6980: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
6990: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
69a0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
69b0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
69c0: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
69d0: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
69e0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
69f0: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6a00: 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   of.** the journ
6a10: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
6a20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
6a30: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
6a40: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65  ccessfully, *nRe
6a50: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
6a60: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
6a70: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
6a80: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
6a90: 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73  and *dbSize is s
6aa0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
6ab0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
6ac0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
6ad0: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
6ae0: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
6af0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6b00: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
6b10: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6b20: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
6b30: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
6b40: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
6b50: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
6b60: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
6b70: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
6b80: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
6b90: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
6ba0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
6bb0: 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64  ed and *nRec and
6bc0: 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74   *dbSize are not
6bd0: 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41   set.  If JOURNA
6be0: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
6bf0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
6c00: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6c10: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
6c20: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6c30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6c40: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
6c50: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
6c60: 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53   .  i64 journalS
6c70: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
6c80: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
6c90: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
6ca0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6cb0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6cc0: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6cd0: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6ce0: 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66  */.  i64 jrnlOff
6cf0: 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53 69 7a  ;.  int iPageSiz
6d00: 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  e;..  seekJourna
6d10: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6d20: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6d30: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
6d40: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
6d50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
6d60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6d70: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
6d80: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
6d90: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
6da0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6db0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
6dc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
6dd0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
6de0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6df0: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
6e00: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
6e10: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
6e20: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6e30: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6e40: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6e50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6e60: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6e70: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6e80: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
6e90: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
6ea0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6eb0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6ec0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
6ed0: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
6ee0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6ef0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6f00: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
6f10: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
6f20: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
6f30: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
6f40: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6f50: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
6f60: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6f70: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20 28 75  , jrnlOff+16, (u
6f80: 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a 65 29  32 *)&iPageSize)
6f90: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6fa0: 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69 50 61  TE_OK .   && iPa
6fb0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20 20 20  geSize>=512 .   
6fc0: 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d 53 51  && iPageSize<=SQ
6fd0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
6fe0: 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50 61 67  ZE .   && ((iPag
6ff0: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
7000: 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20  ze)==0 .  ){.   
7010: 20 75 31 36 20 70 61 67 65 73 69 7a 65 20 3d 20   u16 pagesize = 
7020: 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  iPageSize;.    r
7030: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7040: 53 65 74 50 61 67 65 73 69 7a 65 28 70 50 61 67  SetPagesize(pPag
7050: 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a  er, &pagesize);.
7060: 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72    }.  if( rc ) r
7070: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
7080: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
7090: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
70a0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
70b0: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
70c0: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
70d0: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
70e0: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
70f0: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
7100: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
7110: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
7120: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
7130: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
7140: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
7150: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
7160: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
7170: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
7180: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
7190: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
71a0: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
71b0: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
71c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
71d0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
71e0: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20  fd, jrnlOff+12, 
71f0: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
7200: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
7210: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
7220: 28 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ( (pPager->secto
7230: 72 53 69 7a 65 20 26 20 28 70 50 61 67 65 72 2d  rSize & (pPager-
7240: 3e 73 65 63 74 6f 72 53 69 7a 65 2d 31 29 29 21  >sectorSize-1))!
7250: 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
7260: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7270: 65 3e 30 78 31 30 30 30 30 30 30 20 29 7b 0a 20  e>0x1000000 ){. 
7280: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7290: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 70 50  _DONE;.  }..  pP
72a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
72b0: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
72c0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
72d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
72e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
72f0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
7300: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
7310: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
7320: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
7330: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
7340: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
7350: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
7360: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
7370: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
7380: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
7390: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
73a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
73b0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
73c0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
73d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
73e0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
73f0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
7400: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
7410: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
7420: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
7430: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
7440: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
7450: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
7460: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
7470: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7480: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
7490: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
74a0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
74b0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
74c0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
74d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
74e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
74f0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
7500: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
7510: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
7520: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
7530: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
7540: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
7550: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
7560: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
7570: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
7580: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
7590: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
75a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
75b0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
75c0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
75d0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
75e0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
75f0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
7600: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
7610: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
7620: 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75  64 jrnlSize;.  u
7630: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
7640: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
7650: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
7660: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
7670: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
7680: 3e 73 65 74 4d 61 73 74 65 72 20 29 20 72 65 74  >setMaster ) ret
7690: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
76a0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
76b0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
76c0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
76d0: 52 59 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  RY ) return SQLI
76e0: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
76f0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
7700: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
7710: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
7720: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
7730: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
7740: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
7750: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
7760: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
7770: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
7780: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
7790: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
77a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
77b0: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
77c0: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
77d0: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
77e0: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
77f0: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
7800: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
7810: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
7820: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
7830: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
7840: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7850: 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
7860: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
7870: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7880: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
7890: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
78a0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
78b0: 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52 5f   jrnlOff, PAGER_
78c0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
78d0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
78e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
78f0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
7900: 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  4;..  rc = sqlit
7910: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
7920: 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20  ->jfd, zMaster, 
7930: 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  len, jrnlOff);. 
7940: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7950: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7960: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65 6e    jrnlOff += len
7970: 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28 7a  ;..  put32bits(z
7980: 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74  Buf, len);.  put
7990: 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c  32bits(&zBuf[4],
79a0: 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70   cksum);.  memcp
79b0: 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75  y(&zBuf[8], aJou
79c0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
79d0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
79e0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
79f0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7a00: 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69  >jfd, zBuf, 8+si
7a10: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7a20: 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20  ic), jrnlOff);. 
7a30: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73 69   jrnlOff += 8+si
7a40: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7a50: 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ic);.  pPager->n
7a60: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
7a70: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a  r->noSync;..  /*
7a80: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
7a90: 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a 6f   in peristent-jo
7aa0: 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65 6e  urnal mode, then
7ab0: 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a 20   the physical . 
7ac0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65   ** journal-file
7ad0: 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73 74   may extend past
7ae0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
7af0: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e  master-journal n
7b00: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20 62  ame.  ** and 8 b
7b10: 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64 61  ytes of magic da
7b20: 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  ta just written 
7b30: 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69  to the file. Thi
7b40: 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67 65  s is .  ** dange
7b50: 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68 65  rous because the
7b60: 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61 63   code to rollbac
7b70: 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  k a hot-journal 
7b80: 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  file.  ** will n
7b90: 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66 69  ot be able to fi
7ba0: 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  nd the master-jo
7bb0: 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64 65  urnal name to de
7bc0: 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68  termine .  ** wh
7bd0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
7be0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e   journal is hot.
7bf0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73 69   .  **.  ** Easi
7c00: 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f 20  est thing to do 
7c10: 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69 6f  in this scenario
7c20: 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20   is to truncate 
7c30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
7c40: 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72 65  * file to the re
7c50: 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20 2a  quired size..  *
7c60: 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53 51  / .  if( (rc==SQ
7c70: 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20 28  LITE_OK).   && (
7c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
7c90: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
7ca0: 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29 3d  fd, &jrnlSize))=
7cb0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
7cc0: 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f 66   jrnlSize>jrnlOf
7cd0: 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  f.  ){.    rc = 
7ce0: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
7cf0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  e(pPager->jfd, j
7d00: 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20 72  rnlOff);.  }.  r
7d10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7d20: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7d30: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7d40: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7d50: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7d60: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7d70: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
7d80: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
7d90: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
7da0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
7db0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
7dc0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
7dd0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  *p;.  sqlite3Pca
7de0: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
7df0: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
7e00: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
7e10: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   p;.}../*.** Cle
7e20: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
7e30: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
7e40: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
7e50: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
7e60: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
7e70: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
7e80: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
7e90: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
7ea0: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
7eb0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
7ec0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
7ed0: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
7ee0: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
7ef0: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
7f00: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
7f10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7f20: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
7f30: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7f40: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
7f50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
7f60: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
7f70: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
7f80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
7f90: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
7fa0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
7fb0: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
7fc0: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
7fd0: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
7fe0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
7ff0: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
8000: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
8010: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
8020: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
8030: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
8040: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
8050: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
8060: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
8070: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
8080: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
8090: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
80a0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
80b0: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
80c0: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
80d0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
80e0: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
80f0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
8100: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
8110: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
8120: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8130: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  e ){.    int rc 
8140: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
8150: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
8160: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70 50  .    if( rc ) pP
8170: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
8180: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
8190: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
81a0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
81b0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
81c0: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 41 6c  ger))..    /* Al
81d0: 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a  ways close the j
81e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
81f0: 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
8200: 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20  tabase lock..   
8210: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
8220: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
8230: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
8240: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
8250: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
8260: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
8270: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
8280: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
8290: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
82a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
82b0: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
82c0: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
82d0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
82e0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
82f0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8300: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
8310: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8320: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
8330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
8340: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8350: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8360: 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ack);.      pPag
8370: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8380: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ack = 0;.    }..
8390: 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e      /* If Pager.
83a0: 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
83b0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
83c0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
83d0: 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  cannot be.    **
83e0: 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
83f0: 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  at the pager fil
8400: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  e is unlocked, t
8410: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
8420: 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20  he.    ** cache 
8430: 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
8440: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
8450: 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72  ode safely clear
8460: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
8470: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
8480: 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  de ){.      if( 
8490: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
84a0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
84b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
84c0: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
84d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
84e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
84f0: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
8500: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
8510: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
8520: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
8530: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
8540: 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
8550: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
8560: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
8570: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
8580: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
8590: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
85a0: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Use = 0;.      p
85b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
85c0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
85d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
85e0: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
85f0: 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
8600: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  pen = 0;.      p
8610: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8620: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
8630: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
8640: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
8650: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
8660: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
8670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
8680: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
8690: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
86a0: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
86b0: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
86c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
86d0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
86e0: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
86f0: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
8700: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  .** do not attem
8710: 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  pt the rollback.
8720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8730: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
8740: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
8750: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
8760: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
8770: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
8780: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8790: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
87a0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
87b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
87c0: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
87d0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
87e0: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
87f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d  ger_unlock(p);.}
8800: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8810: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
8820: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
8830: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
8840: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
8850: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
8860: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
8870: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8880: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
8890: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
88a0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
88b0: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
88c0: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
88d0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
88e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
88f0: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
8900: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
8910: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
8920: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
8930: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
8940: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
8950: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
8960: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
8970: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
8980: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
8990: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
89a0: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
89b0: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
89c0: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
89d0: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
89e0: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
89f0: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
8a00: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
8a10: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
8a20: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
8a30: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
8a40: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
8a50: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
8a60: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
8a70: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
8a80: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
8a90: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
8aa0: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
8ab0: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
8ac0: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
8ad0: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
8ae0: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
8af0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8b00: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
8b10: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
8b20: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
8b30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
8b40: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
8b50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8b60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8b70: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
8b80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8b90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8ba0: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8bb0: 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
8bc0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8bd0: 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65  mtOpen && !pPage
8be0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
8bf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8c00: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
8c10: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
8c20: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8c30: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8c40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8c50: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8c60: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8c70: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8c80: 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
8c90: 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  int isMemoryJour
8ca0: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d  nal = sqlite3IsM
8cb0: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
8cc0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71  ->jfd);.      sq
8cd0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
8ce0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
8cf0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8d00: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
8d10: 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75  if( !isMemoryJou
8d20: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
8d30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8d40: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
8d50: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
8d60: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
8d70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8d80: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8d90: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8da0: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
8db0: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
8dc0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8dd0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8de0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
8df0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
8e00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8e10: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8e20: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8e30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8e40: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8e50: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
8e60: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8e70: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8e80: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
8e90: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
8ea0: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
8eb0: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
8ec0: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
8ed0: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
8ee0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8ef0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8f00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8f10: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8f20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8f30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8f40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8f50: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8f60: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
8f70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8f80: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
8f90: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8fa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8fb0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8fc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
8fd0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
8fe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8ff0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
9000: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
9010: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
9020: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
9030: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
9040: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
9050: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
9060: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
9070: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
9080: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
9090: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
90a0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
90b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
90c0: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
90d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
90e0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
90f0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
9100: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
9110: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
9120: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
9130: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
9140: 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
9150: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
9160: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
9170: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
9180: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
9190: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
91a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
91b0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
91c0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
91d0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
91e0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
91f0: 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72   osUnlock(pPager
9200: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
9210: 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  K);.    pPager->
9220: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
9230: 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ARED;.  }else if
9240: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9250: 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b  =PAGER_SYNCED ){
9260: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9270: 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
9280: 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67  SIVE;.  }.  pPag
9290: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
92a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
92b0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
92c0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
92d0: 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69 73  = 0;.  /* lruLis
92e0: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
92f0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 69 66  pPager); */.  if
9300: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
9310: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
9320: 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  lid = 0;.  }.  p
9330: 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
9340: 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e  d = 0;..  return
9350: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
9360: 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rc2:rc);.}../*.*
9370: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
9380: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
9390: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
93a0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
93b0: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
93c0: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
93d0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
93e0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
93f0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
9400: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
9410: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
9420: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
9430: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
9440: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
9450: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
9460: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
9470: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
9480: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
9490: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
94a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
94b0: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
94c0: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
94d0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
94e0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
94f0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
9500: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
9510: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
9520: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
9530: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
9540: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
9550: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
9560: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
9570: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
9580: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
9590: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
95a0: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
95b0: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
95c0: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
95d0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
95e0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
95f0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
9600: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
9610: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
9620: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
9630: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
9640: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
9650: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
9660: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
9670: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
9680: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
9690: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
96a0: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
96b0: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
96c0: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
96d0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
96e0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
96f0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
9700: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
9710: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
9720: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
9730: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
9740: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
9750: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
9760: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
9770: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
9780: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
9790: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
97a0: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
97b0: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
97c0: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
97d0: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
97e0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
97f0: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
9800: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
9810: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
9820: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
9830: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
9840: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
9850: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
9860: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9870: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
9880: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
9890: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
98a0: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
98b0: 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e  ** The isMainJrn
98c0: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69  l flag is true i
98d0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
98e0: 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  in rollback jour
98f0: 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65  nal and.** false
9900: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
9910: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  nt journal.  The
9920: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
9930: 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63  ournal uses.** c
9940: 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73  hecksums - the s
9950: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9960: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74   does not..*/.st
9970: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
9980: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
9990: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
99a0: 72 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r,       /* The 
99b0: 70 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79  pager being play
99c0: 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73 71 6c  ed back */.  sql
99d0: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 20  ite3_file *jfd, 
99e0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74 68    /* The file th
99f0: 61 74 20 69 73 20 74 68 65 20 6a 6f 75 72 6e 61  at is the journa
9a00: 6c 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  l being rolled b
9a10: 61 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66  ack */.  i64 off
9a20: 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
9a30: 20 4f 66 66 73 65 74 20 6f 66 20 74 68 65 20 70   Offset of the p
9a40: 61 67 65 20 77 69 74 68 69 6e 20 74 68 65 20 6a  age within the j
9a50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
9a60: 69 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20 20 20  isMainJrnl      
9a70: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d 61 69   /* True for mai
9a80: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
9a90: 61 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 74  al. False for St
9aa0: 6d 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20 20  mt jrnl */.){.  
9ab0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
9ac0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
9ad0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
9ae0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
9af0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
9b00: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9b20: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
9b30: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
9b40: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
9b50: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
9b60: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9b70: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
9b80: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
9b90: 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38   u8 *aData = (u8
9ba0: 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
9bb0: 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20  pace;   /* Temp 
9bc0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
9bd0: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d 61  ge */..  /* isMa
9be0: 69 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20 62 65  inJrnl should be
9bf0: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
9c00: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
9c10: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
9c20: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
9c30: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
9c40: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
9c50: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
9c60: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 69 73  sert( jfd == (is
9c70: 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65  MainJrnl ? pPage
9c80: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
9c90: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
9ca0: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
9cb0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
9cc0: 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67  jfd, offset, &pg
9cd0: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
9ce0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
9cf0: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
9d00: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
9d10: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9d20: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
9d30: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
9d40: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9d50: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
9d60: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
9d70: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
9d80: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
9d90: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
9da0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
9db0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
9dc0: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
9dd0: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
9de0: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
9df0: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
9e00: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
9e10: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
9e20: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
9e30: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
9e40: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
9e50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
9e60: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
9e70: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
9e80: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
9e90: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
9ea0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
9eb0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
9ec0: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
9ed0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9ee0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9ef0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
9f00: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
9f10: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
9f20: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9f30: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9f40: 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e  .  if( isMainJrn
9f50: 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  l ){.    rc = re
9f60: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
9f70: 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67  fset+pPager->pag
9f80: 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29  eSize+4, &cksum)
9f90: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9fa0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
9fb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9fc0: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
9fd0: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
9fe0: 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  r, aData)!=cksum
9ff0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
a000: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
a010: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
a020: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
a030: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
a040: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
a050: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
a060: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
a070: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
a080: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
a090: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
a0a0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
a0b0: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
a0c0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
a0d0: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
a0e0: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
a0f0: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
a100: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
a110: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
a120: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
a130: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
a140: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78  .  **.  ** An ex
a150: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61  ception to the a
a160: 62 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68  bove rule: If th
a170: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e  e database is in
a180: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20   no-sync mode.  
a190: 2a 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73  ** and a page is
a1a0: 20 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e   moved during an
a1b0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
a1c0: 75 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67  uum then the pag
a1d0: 65 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62  e may.  ** not b
a1e0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
a1f0: 61 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20  ache. Later: if 
a200: 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
a210: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20   error occurs.  
a220: 2a 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65  ** during a Move
a230: 70 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65  page() call, the
a240: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e  n the page may n
a250: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63  ot be in the cac
a260: 68 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20  he.  ** either. 
a270: 53 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  So the condition
a280: 20 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68   described in th
a290: 65 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70  e above paragrap
a2a0: 68 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73  h is not.  ** as
a2b0: 73 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a  sert()able..  **
a2c0: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
a2d0: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
a2e0: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
a2f0: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
a300: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
a310: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
a320: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
a330: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
a340: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
a350: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
a360: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a370: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
a380: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
a390: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
a3a0: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
a3b0: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
a3c0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
a3d0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
a3e0: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
a3f0: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
a400: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
a410: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
a420: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
a430: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
a440: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
a450: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
a460: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
a470: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
a480: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
a490: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
a4a0: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
a4b0: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
a4c0: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
a4d0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
a4e0: 6e 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69  nts are synced i
a4f0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c  nto the main rol
a500: 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e  lback.  ** journ
a510: 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  al.  Otherwise, 
a520: 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67  a power loss mig
a530: 68 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65  ht leave modifie
a540: 64 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20  d data in the.  
a550: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
a560: 20 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72   without an entr
a570: 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  y in the rollbac
a580: 6b 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63  k journal that c
a590: 61 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20  an.  ** restore 
a5a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
a5b0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72  its original for
a5c0: 6d 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  m.  Two conditio
a5d0: 6e 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  ns must be.  ** 
a5e0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
a5f0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
a600: 73 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  se files. (1) th
a610: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
a620: 62 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20  be.  ** locked. 
a630: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
a640: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
a650: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66  age content is f
a660: 75 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ully synced.  **
a670: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
a680: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
a690: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
a6a0: 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
a6b0: 65 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  else.  ** the pa
a6c0: 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
a6d0: 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a  needSync==0..  *
a6e0: 2a 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31  *.  ** 2008-04-1
a6f0: 34 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74  4:  When attempt
a700: 69 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20  ing to vacuum a 
a710: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
a720: 20 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69   file, it.  ** i
a730: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61  s possible to fa
a740: 69 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  il a statement o
a750: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61  n a database tha
a760: 74 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65  t does not yet e
a770: 78 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f  xist..  ** Do no
a780: 74 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  t attempt to wri
a790: 74 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66  te if database f
a7a0: 69 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65  ile has never be
a7b0: 65 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a  en opened..  */.
a7c0: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
a7d0: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
a7e0: 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  o);.  PAGERTRACE
a7f0: 34 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  4("PLAYBACK %d p
a800: 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
a810: 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
a820: 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
a830: 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
a840: 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65  r_datahash(pPage
a850: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61  r->pageSize, aDa
a860: 74 61 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61  ta));.  if( (pPa
a870: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
a880: 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  R_EXCLUSIVE).   
a890: 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d  && (pPg==0 || 0=
a8a0: 3d 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  =(pPg->flags&PGH
a8b0: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20  DR_NEED_SYNC)). 
a8c0: 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66 64    && (pPager->fd
a8d0: 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b  ->pMethods).  ){
a8e0: 0a 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20  .    i64 ofst = 
a8f0: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
a900: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
a910: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a920: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
a930: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
a940: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73  r->pageSize, ofs
a950: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  t);.  }.  if( pP
a960: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70  g ){.    /* No p
a970: 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20  age should ever 
a980: 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f  be explicitly ro
a990: 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69  lled back that i
a9a0: 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74  s in use, except
a9b0: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65  .    ** for page
a9c0: 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64   1 which is held
a9d0: 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72   in use in order
a9e0: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63   to keep the loc
a9f0: 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
aa00: 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e  database active.
aa10: 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20   However such a 
aa20: 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c  page may be roll
aa30: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
aa40: 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e  ult.    ** of an
aa50: 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20   internal error 
aa60: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
aa70: 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74  automatic call t
aa80: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
aa90: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e  PagerRollback().
aaa0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64  .    */.    void
aab0: 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61   *pData;.    pDa
aac0: 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
aad0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
aae0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
aaf0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
ab00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
ab10: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
ab20: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
ab30: 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  r(pPg);.    }.  
ab40: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
ab50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ab60: 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
ab70: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23 69 66  (pPg);.    }.#if
ab80: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ab90: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
aba0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
abb0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
abc0: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
abd0: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
abe0: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
abf0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
ac00: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
ac10: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
ac20: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
ac30: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
ac40: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
ac50: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
ac60: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
ac70: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
ac80: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
ac90: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
aca0: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
acb0: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
acc0: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
acd0: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
ace0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
acf0: 6f 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  o, 3);.    sqlit
ad00: 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
ad10: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
ad20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ad30: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
ad40: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
ad50: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ad60: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
ad70: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
ad80: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
ad90: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
ada0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
adb0: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
adc0: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
add0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
ade0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
adf0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
ae00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
ae10: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
ae20: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
ae30: 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65 72  Argument zMaster
ae40: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50 61   may point to Pa
ae50: 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20 53  ger.pTmpSpace. S
ae60: 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69 73  o that buffer is
ae70: 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61 62   not .** availab
ae80: 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68 69  le for use withi
ae90: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  n this function.
aea0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  .**.**.** The ma
aeb0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
aec0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
aed0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
aee0: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
aef0: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
af00: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
af10: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
af20: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
af30: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
af40: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
af50: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
af60: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
af70: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
af80: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
af90: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
afa0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
afb0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
afc0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
afd0: 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72 20  delmaster(Pager 
afe0: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
aff0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
b000: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
b010: 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
b020: 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  s;.  int rc;.  i
b030: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
b040: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   0;.  sqlite3_fi
b050: 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20 73  le *pMaster;.  s
b060: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
b070: 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  urnal;.  char *z
b080: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
b090: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
b0a0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
b0b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
b0c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
b0d0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b0e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b0f0: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
b100: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
b110: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
b120: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
b130: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
b140: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
b150: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
b160: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
b170: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
b180: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
b190: 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71 6c    pMaster = (sql
b1a0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69  ite3_file *)sqli
b1b0: 74 65 33 4d 61 6c 6c 6f 63 28 70 56 66 73 2d 3e  te3Malloc(pVfs->
b1c0: 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a 20  szOsFile * 2);. 
b1d0: 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71 6c   pJournal = (sql
b1e0: 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28 75  ite3_file *)(((u
b1f0: 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20 70  8 *)pMaster) + p
b200: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
b210: 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20 29    if( !pMaster )
b220: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
b230: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
b240: 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20  {.    int flags 
b250: 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
b260: 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f  EADONLY|SQLITE_O
b270: 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
b280: 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  AL);.    rc = sq
b290: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
b2a0: 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61 73 74  , zMaster, pMast
b2b0: 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  er, flags, 0);. 
b2c0: 20 7d 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 20 20 6d  lmaster_out;.  m
b2f0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
b300: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
b310: 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73 74 65  sFileSize(pMaste
b320: 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  r, &nMasterJourn
b330: 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  al);.  if( rc!=S
b340: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b350: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
b360: 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75    if( nMasterJou
b370: 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68  rnal>0 ){.    ch
b380: 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20  ar *zJournal;.  
b390: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50    char *zMasterP
b3a0: 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  tr = 0;.    int 
b3b0: 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70 50 61  nMasterPtr = pPa
b3c0: 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ger->pVfs->mxPat
b3d0: 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
b3e0: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
b3f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b400: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
b410: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
b420: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
b430: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
b440: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
b450: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
b460: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
b470: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
b480: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  ite3Malloc(nMast
b490: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
b4a0: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
b4b0: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
b4c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
b4d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
b4e0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
b4f0: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
b500: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
b510: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
b520: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
b530: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b540: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
b550: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
b560: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30  MasterJournal, 0
b570: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
b580: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
b590: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
b5a0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
b5b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
b5c0: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
b5d0: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
b5e0: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
b5f0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  al ){.      int 
b600: 65 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63  exists;.      rc
b610: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
b620: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
b630: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
b640: 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
b650: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b660: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b670: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
b680: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
b690: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73  }.      if( exis
b6a0: 74 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ts ){.        /*
b6b0: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
b6c0: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
b6d0: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
b6e0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
b6f0: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
b700: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
b710: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
b720: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
b730: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
b740: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
b750: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
b760: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b770: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
b780: 20 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20       int c;.    
b790: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
b7a0: 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
b7b0: 44 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45  DONLY|SQLITE_OPE
b7c0: 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
b7d0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
b7e0: 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73  lite3OsOpen(pVfs
b7f0: 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75  , zJournal, pJou
b800: 72 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b  rnal, flags, 0);
b810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
b820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b830: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
b840: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
b850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
b860: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
b870: 75 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20  urnal(pJournal, 
b880: 7a 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73  zMasterPtr, nMas
b890: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
b8a0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b8b0: 70 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  pJournal);.     
b8c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
b8d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
b8e0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
b8f0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
b900: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
b910: 73 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26  sterPtr[0]!=0 &&
b920: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
b930: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
b940: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
b950: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
b960: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
b970: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
b980: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b990: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
b9a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
b9b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
b9c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b9d0: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
b9e0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
b9f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
ba00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
ba10: 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
ba20: 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73  ter, 0);..delmas
ba30: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
ba40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
ba50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ba60: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
ba70: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
ba80: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
ba90: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
baa0: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (pMaster);.  }. 
bab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
bac0: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
bad0: 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20   rc;.}...static 
bae0: 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
baf0: 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
bb00: 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a  *pPager);../*.**
bb10: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
bb20: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
bb30: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
bb40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
bb50: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20  s.** indicated. 
bb60: 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68  Also truncate th
bb70: 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65  e cached represe
bb80: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
bb90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74  ile..**.** Might
bba0: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
bbb0: 73 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  se that the file
bbc0: 20 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c   on disk is smal
bbd0: 6c 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a  ler than nPage..
bbe0: 2a 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ** This can happ
bbf0: 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
bc00: 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68   if we are in th
bc10: 65 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72  e middle of a tr
bc20: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  ansaction.** whi
bc30: 63 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20  ch has extended 
bc40: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e  the file size an
bc50: 64 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20  d the new pages 
bc60: 61 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65  are still all he
bc70: 6c 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20  ld.** in cache, 
bc80: 74 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f  then an INSERT o
bc90: 72 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20  r UPDATE does a 
bca0: 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
bcb0: 63 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65  ck.  Some.** ope
bcc0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d  rating system im
bcd0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61  plementations ca
bce0: 6e 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69  n get confused i
bcf0: 66 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20  f you try to.** 
bd00: 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20  truncate a file 
bd10: 74 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61  to some size tha
bd20: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
bd30: 20 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73   it currently is
bd40: 2c 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74  ,.** so detect t
bd50: 68 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69  his case and wri
bd60: 74 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f  te a single zero
bd70: 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
bd80: 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66   of the new.** f
bd90: 69 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ile instead..*/.
bda0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bdb0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
bdc0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
bdd0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
bde0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
bdf0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
be00: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
be10: 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e   && pPager->fd->
be20: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
be30: 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
be40: 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63   newSize;.    rc
be50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
be60: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
be70: 20 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a   &currentSize);.
be80: 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50      newSize = pP
be90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
bea0: 69 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69  i64)nPage;.    i
beb0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bec0: 20 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21   && currentSize!
bed0: 3d 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20  =newSize ){.    
bee0: 20 20 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a    if( currentSiz
bef0: 65 3e 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20  e>newSize ){.   
bf00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bf10: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
bf20: 65 72 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29  er->fd, newSize)
bf30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
bf40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
bf50: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
bf60: 72 2d 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65  r->fd, "", 1, ne
bf70: 77 53 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  wSize-1);.      
bf80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
bf90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bfa0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
bfb0: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
bfc0: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
bfd0: 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
bfe0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
c000: 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f  he sectorSize fo
c010: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
c020: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  r..**.** The sec
c030: 74 6f 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c  tor size is at l
c040: 65 61 73 74 20 61 73 20 62 69 67 20 61 73 20 74  east as big as t
c050: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72  he sector size r
c060: 65 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71  eported.** by sq
c070: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
c080: 65 28 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75  e().  The minimu
c090: 6d 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  m sector size is
c0a0: 20 35 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   512..*/.static 
c0b0: 76 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69  void setSectorSi
c0c0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c0d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  ){.  assert(pPag
c0e0: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
c0f0: 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
c100: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  le);.  if( !pPag
c110: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
c120: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
c130: 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
c140: 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
c150: 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
c160: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
c170: 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
c180: 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
c190: 63 69 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  cih case the OsS
c1a0: 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
c1b0: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
c1c0: 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
c1d0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c1e0: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
c1f0: 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
c200: 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
c210: 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
c220: 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
c230: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c240: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a  ze = 512;.  }.}.
c250: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
c260: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
c270: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
c280: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
c290: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
c2a0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
c2b0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
c2c0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
c2d0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
c2e0: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
c2f0: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
c300: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
c310: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
c320: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
c330: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
c340: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c350: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c360: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
c370: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
c380: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
c390: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
c3a0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
c3b0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
c3c0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
c3d0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
c3e0: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
c3f0: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
c400: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
c410: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c420: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
c430: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
c440: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
c450: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
c460: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
c470: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c480: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
c490: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
c4a0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
c4b0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
c4c0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
c4d0: 28 35 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (5)  4 byte big-
c4e0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
c4f0: 68 69 63 68 20 69 73 20 74 68 65 20 73 65 63 74  hich is the sect
c500: 6f 72 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65  or size.  The he
c510: 61 64 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73  ader.**       is
c520: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
c530: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36   in size..**  (6
c540: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
c550: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
c560: 63 68 20 69 73 20 74 68 65 20 70 61 67 65 20 63  ch is the page c
c570: 61 73 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20  ase..**  (7)  4 
c580: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
c590: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
c5a0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
c5b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
c5c0: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
c5d0: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
c5e0: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
c5f0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
c600: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
c610: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
c620: 38 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  8)  N bytes of t
c630: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c640: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
c650: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
c660: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
c670: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
c680: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
c690: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
c6a0: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
c6b0: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
c6c0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
c6d0: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
c6e0: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
c6f0: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
c700: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
c710: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
c720: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
c730: 28 39 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (9)  Zero or mor
c740: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
c750: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
c760: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
c770: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
c780: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
c790: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
c7a0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
c7b0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
c7c0: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
c7d0: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
c7e0: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
c7f0: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
c800: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 69 74  n the first 8 it
c810: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
c820: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
c830: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
c840: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74  stance of the 9t
c850: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
c860: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
c870: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
c880: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
c890: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
c8a0: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
c8b0: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
c8c0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
c8d0: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
c8e0: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
c8f0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
c900: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
c910: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c920: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
c930: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
c940: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
c950: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
c960: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
c970: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
c980: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
c990: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c9a0: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
c9b0: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
c9c0: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
c9d0: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
c9e0: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
c9f0: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
ca00: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
ca10: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ca20: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
ca30: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
ca40: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
ca50: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
ca60: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
ca70: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
ca80: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
ca90: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
caa0: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
cab0: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
cac0: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
cad0: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
cae0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
caf0: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
cb00: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
cb10: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
cb20: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
cb30: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
cb40: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
cb50: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
cb60: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
cb70: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
cb80: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
cb90: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
cba0: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
cbb0: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
cbc0: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
cbd0: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
cbe0: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
cbf0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
cc00: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
cc10: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
cc20: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
cc30: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
cc40: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
cc50: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
cc60: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
cc70: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
cc80: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
cc90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
cca0: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
ccb0: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
ccc0: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
ccd0: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
cce0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
ccf0: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
cd00: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
cd10: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
cd20: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
cd30: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
cd40: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
cd50: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
cd60: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
cd70: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
cd80: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
cd90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
cda0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
cdb0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48  *pPager, int isH
cdc0: 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ot){.  sqlite3_v
cdd0: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
cde0: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73  r->pVfs;.  i64 s
cdf0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
ce00: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
ce10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
ce20: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
ce30: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
ce40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ce50: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
ce60: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
ce70: 75 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20  u32 u;          
ce80: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69           /* Unsi
ce90: 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  gned loop counte
cea0: 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67  r */.  Pgno mxPg
ceb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
cec0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f  /* Size of the o
ced0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20  riginal file in 
cee0: 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  pages */.  int r
cef0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
cf00: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
cf10: 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69  de of a subrouti
cf20: 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  ne */.  int res 
cf30: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
cf40: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
cf50: 65 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41  ed by sqlite3OsA
cf60: 63 63 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61  ccess() */.  cha
cf70: 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
cf80: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
cf90: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cfa0: 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a  file if any */..
cfb0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
cfc0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
cfd0: 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72   are in the jour
cfe0: 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c  nal.  Abort earl
cff0: 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  y if.  ** the jo
d000: 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a  urnal is empty..
d010: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d020: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
d030: 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
d040: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
d050: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
d060: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d070: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30  ITE_OK || szJ==0
d080: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
d090: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d0a0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61    /* Read the ma
d0b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
d0c0: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
d0d0: 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65  al, if it is pre
d0e0: 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20  sent..  ** If a 
d0f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
d100: 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63  ile name is spec
d110: 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66  ified, but the f
d120: 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ile is not.  ** 
d130: 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c  present on disk,
d140: 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
d150: 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64  l is not hot and
d160: 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
d170: 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64  o be.  ** played
d180: 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d   back..  */.  zM
d190: 61 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  aster = pPager->
d1a0: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20  pTmpSpace;.  rc 
d1b0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
d1c0: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
d1d0: 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
d1e0: 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
d1f0: 6d 65 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d  me+1);.  if( rc=
d200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
d210: 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  aster[0] ){.    
d220: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
d230: 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
d240: 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
d250: 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
d260: 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d  .  }.  zMaster =
d270: 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
d280: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20  LITE_OK || !res 
d290: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
d2a0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
d2b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d2c0: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
d2d0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
d2e0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
d2f0: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
d300: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
d310: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
d320: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
d330: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
d340: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
d350: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
d360: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
d370: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
d380: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
d390: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
d3a0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
d3b0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
d3c0: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
d3d0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
d3e0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
d3f0: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
d400: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
d410: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
d420: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
d430: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
d440: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
d450: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
d460: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
d470: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
d480: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
d490: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
d4a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d4b0: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
d4c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
d4d0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
d4e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d4f0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
d500: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d510: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
d520: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
d530: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
d540: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
d550: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
d560: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
d570: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
d580: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
d590: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
d5a0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
d5b0: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
d5c0: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
d5d0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
d5e0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
d5f0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
d600: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
d610: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
d620: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
d630: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
d640: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
d650: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
d660: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
d670: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
d680: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
d690: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
d6a0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
d6b0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
d6c0: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
d6d0: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
d6e0: 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
d6f0: 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
d700: 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
d710: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
d720: 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
d730: 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
d740: 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
d750: 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
d760: 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
d770: 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
d780: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
d790: 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
d7a0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
d7b0: 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
d7c0: 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
d7d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
d7e0: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
d7f0: 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
d800: 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
d810: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
d820: 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
d830: 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
d840: 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
d850: 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f  et #2565..    */
d860: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
d870: 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
d880: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
d890: 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
d8a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
d8b0: 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
d8c0: 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
d8d0: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
d8e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
d8f0: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
d900: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
d910: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
d920: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
d930: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
d940: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
d950: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
d960: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
d970: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
d980: 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
d990: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
d9a0: 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
d9b0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
d9c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
d9d0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
d9e0: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
d9f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
da00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
da10: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
da20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
da30: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
da40: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
da50: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
da60: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
da70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
da80: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75      */.    for(u
da90: 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29  =0; u<nRec; u++)
daa0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
dab0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
dac0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
dad0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
dae0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
daf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
db00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
db10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
db20: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
db30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
db40: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
db50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
db60: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
db70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
db80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
db90: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65      /* If we are
dba0: 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62   unable to rollb
dbb0: 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61  ack, then the da
dbc0: 74 61 62 61 73 65 20 69 73 20 70 72 6f 62 61 62  tabase is probab
dbd0: 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ly.          ** 
dbe0: 67 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20  going to end up 
dbf0: 62 65 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20  being corrupt.  
dc00: 49 74 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f  It is corrupt to
dc10: 20 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20   us, anyhow..   
dc20: 20 20 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70         ** Perhap
dc30: 73 20 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65  s the next proce
dc40: 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67  ss to come along
dc50: 20 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a   can fix it.....
dc60: 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
dc70: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
dc80: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dc90: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
dca0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
dcb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dcc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
dcd0: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
dce0: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
dcf0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
dd00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
dd10: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50      zMaster = pP
dd20: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
dd30: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61  .    rc = readMa
dd40: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
dd50: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
dd60: 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
dd70: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
dd80: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
dd90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
dda0: 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
ddb0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
ddc0: 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
ddd0: 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ');.  }.  if( rc
dde0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
ddf0: 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
de00: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
de10: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
de20: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
de30: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
de40: 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
de50: 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
de60: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
de70: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
de80: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
de90: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
dea0: 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
deb0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  , zMaster);.  }.
dec0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
ded0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
dee0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
def0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
df00: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
df10: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
df20: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
df30: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
df40: 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20  t sector size.  
df50: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
df60: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
df70: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
df80: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
df90: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
dfa0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
dfb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
dfc0: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
dfd0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
dfe0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
dff0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
e000: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
e010: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
e020: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
e030: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
e040: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
e050: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
e060: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e070: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
e080: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
e090: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
e0a0: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
e0b0: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
e0c0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
e0d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
e0e0: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
e0f0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
e100: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
e110: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
e120: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
e130: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
e140: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
e150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
e160: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
e170: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
e180: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
e190: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
e1a0: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
e1b0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
e1c0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
e1d0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
e1e0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
e1f0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
e200: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
e210: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
e220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
e230: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
e240: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
e250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e260: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e270: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
e280: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
e290: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 53  rnalOff;..  /* S
e2a0: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
e2b0: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
e2c0: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
e2d0: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
e2e0: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
e2f0: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
e300: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
e310: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
e320: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
e330: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
e340: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
e350: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
e360: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
e370: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
e380: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
e390: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
e3a0: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
e3b0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
e3c0: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
e3d0: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
e3e0: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
e3f0: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
e400: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
e410: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
e420: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
e430: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
e440: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
e450: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
e460: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
e470: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
e480: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
e490: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e4a0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
e4b0: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
e4c0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
e4d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
e4e0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
e4f0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
e500: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65 63  alOpen );.  nRec
e510: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
e520: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
e530: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
e540: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
e550: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
e560: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
e570: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e580: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
e590: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e5a0: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
e5b0: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
e5c0: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
e5d0: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
e5e0: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
e5f0: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
e600: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
e610: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
e620: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
e630: 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65  ){.    i64 offse
e640: 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72 2d  t = i*(4+pPager-
e650: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
e660: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
e670: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
e680: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66  ger, pPager->stf
e690: 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a 20  d, offset, 0);. 
e6a0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e6b0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e6c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e6d0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e6e0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e6f0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
e700: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
e710: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
e720: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
e730: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
e740: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
e750: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e760: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
e770: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
e780: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
e790: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
e7a0: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
e7b0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
e7c0: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
e7d0: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
e7e0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
e7f0: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
e800: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
e810: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
e820: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
e830: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
e840: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
e850: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
e860: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
e870: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
e880: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
e890: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
e8a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
e8b0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
e8c0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
e8d0: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
e8e0: 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65  mtCksum;.  while
e8f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
e900: 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b  lOff < hdrOff ){
e910: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
e920: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
e930: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
e940: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
e950: 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20  ournalOff, 1);. 
e960: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e970: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e990: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e9a0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e9b0: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
e9c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
e9d0: 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
e9e0: 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
e9f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
ea00: 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
ea10: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
ea20: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
ea30: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
ea40: 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
ea50: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
ea60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ea70: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
ea80: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
ea90: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
eaa0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
eab0: 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
eac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
ead0: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
eae0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
eaf0: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
eb00: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
eb10: 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
eb20: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
eb30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
eb40: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
eb50: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
eb60: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
eb70: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
eb80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
eb90: 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  ff, 1);.      as
eba0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ebb0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69  _DONE );.      i
ebc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ebd0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
ebe0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
ebf0: 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e  .  }..  pPager->
ec00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
ec10: 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c  ;.  .end_stmt_pl
ec20: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
ec30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20  ==SQLITE_OK) {. 
ec40: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ec50: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
ec60: 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64   /* pager_reload
ec70: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 20  _cache(pPager); 
ec80: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
ec90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
eca0: 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  nge the maximum 
ecb0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
ecc0: 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20 61  ory pages that a
ecd0: 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76  re allowed..*/.v
ece0: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
ecf0: 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61 67  SetCachesize(Pag
ed00: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
ed10: 6d 78 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74  mxPage){.  sqlit
ed20: 65 33 50 63 61 63 68 65 53 65 74 43 61 63 68 65  e3PcacheSetCache
ed30: 73 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43  size(pPager->pPC
ed40: 61 63 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d  ache, mxPage);.}
ed50: 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74  ../*.** Adjust t
ed60: 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66  he robustness of
ed70: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
ed80: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
ed90: 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20  S crashes.** or 
eda0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20 62  power failures b
edb0: 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e  y changing the n
edc0: 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29  umber of syncs()
edd0: 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a  s when writing.*
ede0: 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
edf0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61  ournal.  There a
ee00: 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a  re three levels:
ee10: 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20  .**.**    OFF   
ee20: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e      sqlite3OsSyn
ee30: 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c  c() is never cal
ee40: 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  led.  This is th
ee50: 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20  e default.**    
ee60: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 65            for te
ee70: 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e  mporary and tran
ee80: 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a  sient files..**.
ee90: 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20  **    NORMAL    
eea0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
eeb0: 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72  ynced once befor
eec0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
eed0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
eee0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20        database. 
eef0: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
ef00: 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74 65  y adequate prote
ef10: 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20  ction, but.**   
ef20: 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69 73             it is
ef30: 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70   theoretically p
ef40: 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20  ossible, though 
ef50: 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a  very unlikely,.*
ef60: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
ef70: 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e  hat an inopertun
ef80: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  e power failure 
ef90: 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20  could leave the 
efa0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
efb0: 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74 61          in a sta
efc0: 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63  te which would c
efd0: 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74  ause damage to t
efe0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  he database.**  
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 6e              when
f000: 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61   it is rolled ba
f010: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c  ck..**.**    FUL
f020: 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  L      The journ
f030: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77 69  al is synced twi
f040: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
f050: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
f070: 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d  tabase (with som
f080: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  e additional inf
f090: 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e  ormation - the n
f0a0: 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20  Rec field.**    
f0b0: 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
f0c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
f0d0: 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  - being written 
f0e0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 74  in between the t
f0f0: 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  wo.**           
f100: 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77     syncs).  If w
f110: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 72  e assume that wr
f120: 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  iting a.**      
f130: 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64          single d
f140: 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74  isk sector is at
f150: 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20  omic, then this 
f160: 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a  mode provides.**
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
f180: 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68 65  surance that the
f190: 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f   journal will no
f1a0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 74  t be corrupted t
f1b0: 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  o the.**        
f1c0: 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63        point of c
f1d0: 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f  ausing damage to
f1e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64 75   the database du
f1f0: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ring rollback..*
f200: 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c  *.** Numeric val
f210: 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ues associated w
f220: 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65 73  ith these states
f230: 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52   are OFF==1, NOR
f240: 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55  MAL=2,.** and FU
f250: 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  LL=3..*/.#ifndef
f260: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
f270: 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20  ER_PRAGMAS.void 
f280: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
f290: 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72  afetyLevel(Pager
f2a0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65   *pPager, int le
f2b0: 76 65 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73  vel, int bFullFs
f2c0: 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ync){.  pPager->
f2d0: 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d  noSync =  level=
f2e0: 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65  =1 || pPager->te
f2f0: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
f300: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76  ->fullSync = lev
f310: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
f320: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
f330: 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
f340: 20 3d 20 28 62 46 75 6c 6c 46 73 79 6e 63 3f 53   = (bFullFsync?S
f350: 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a  QLITE_SYNC_FULL:
f360: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
f370: 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  AL);.  if( pPage
f380: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
f390: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
f3a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
f3b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f3c0: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
f3d0: 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77  is incremented w
f3e0: 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72  henever the libr
f3f0: 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20  ary.** attempts 
f400: 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72  to open a tempor
f410: 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ary file.  This 
f420: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
f430: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
f440: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
f450: 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65  only.  .*/.#ifde
f460: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
f470: 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
f480: 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  mp_count = 0;.#e
f490: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
f4a0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
f4b0: 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  e. .**.** Write 
f4c0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f4d0: 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52  tor into *fd.  R
f4e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
f4f0: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f  on success or so
f500: 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f  me.** other erro
f510: 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69  r code if we fai
f520: 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  l. The OS will a
f530: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
f540: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
f550: 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 69  y.** file when i
f560: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  t is closed..*/.
f570: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
f580: 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
f590: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
f5a0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
f5b0: 70 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  pager object */.
f5c0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
f5d0: 70 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65  pFile,  /* Write
f5e0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
f5f0: 70 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 69  ptor here */.  i
f600: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
f610: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
f620: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
f630: 74 68 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20  the VFS */.){.  
f640: 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
f650: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
f660: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
f670: 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
f680: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
f690: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
f6a0: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
f6b0: 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
f6c0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
f6d0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
f6e0: 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
f6f0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
f700: 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
f710: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
f720: 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
f730: 74 65 33 4f 73 4f 70 65 6e 28 70 50 61 67 65 72  te3OsOpen(pPager
f740: 2d 3e 70 56 66 73 2c 20 30 2c 20 70 46 69 6c 65  ->pVfs, 0, pFile
f750: 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
f760: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f770: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65  LITE_OK || pFile
f780: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
f790: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74  return rc;.}..st
f7a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74  atic int pagerSt
f7b0: 72 65 73 73 28 76 6f 69 64 20 2a 2c 50 67 48 64  ress(void *,PgHd
f7c0: 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  r *);../*.** Cre
f7d0: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
f7e0: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
f7f0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
f800: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
f810: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
f820: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
f830: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
f840: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
f850: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
f860: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
f870: 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
f880: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
f890: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
f8a0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
f8b0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
f8c0: 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ng sqlite3PagerU
f8d0: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
f8e0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
f8f0: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
f900: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
f910: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
f920: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
f930: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
f940: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
f950: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
f960: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
f970: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
f980: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
f990: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
f9a0: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
f9b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
f9c0: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
f9d0: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
f9e0: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
f9f0: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
fa00: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
fa10: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
fa20: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
fa30: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
fa40: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
fa50: 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
fa60: 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
fa70: 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
fa80: 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
fa90: 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  er,         /* R
faa0: 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20  eturn the Pager 
fab0: 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
fac0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fad0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  zFilename,   /* 
fae0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
faf0: 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
fb00: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  n */.  int nExtr
fb10: 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
fb20: 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61  /* Extra bytes a
fb30: 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e  ppend to each in
fb40: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
fb50: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
fb60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
fb70: 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  ags controlling 
fb80: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
fb90: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
fba0: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
fbb0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
fbc0: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
fbd0: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75  Open() */.){.  u
fbe0: 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72  8 *pPtr;.  Pager
fbf0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
fc00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
fc10: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
fc20: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
fc30: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
fc40: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
fc50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
fc60: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
fc70: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
fc80: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
fc90: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
fca0: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
fcb0: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69  EADLOCK)!=0;.  i
fcc0: 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69  nt journalFileSi
fcd0: 7a 65 3b 0a 20 20 69 6e 74 20 70 63 61 63 68 65  ze;.  int pcache
fce0: 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
fcf0: 61 63 68 65 53 69 7a 65 28 29 3b 0a 20 20 69 6e  acheSize();.  in
fd00: 74 20 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 53  t szPageDflt = S
fd10: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
fd20: 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68 61 72 20  GE_SIZE;.  char 
fd30: 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a  *zPathname = 0;.
fd40: 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 20    int nPathname 
fd50: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  = 0;..  if( sqli
fd60: 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
fd70: 56 66 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a  Vfs)>sqlite3MemJ
fd80: 6f 75 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a  ournalSize() ){.
fd90: 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53      journalFileS
fda0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75  ize = sqlite3Jou
fdb0: 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a  rnalSize(pVfs);.
fdc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6a 6f 75    }else{.    jou
fdd0: 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73  rnalFileSize = s
fde0: 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
fdf0: 53 69 7a 65 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Size();.  }..  /
fe00: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 72 65  * The default re
fe10: 74 75 72 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70  turn is a NULL p
fe20: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50  ointer */.  *ppP
fe30: 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
fe40: 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
fe50: 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
fe60: 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
fe70: 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
fe80: 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
fe90: 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
fea0: 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
feb0: 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
fec0: 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
fed0: 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
fee0: 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
fef0: 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
ff00: 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
ff10: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
ff20: 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
ff30: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
ff40: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
ff50: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
ff60: 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
ff70: 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
ff80: 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
ff90: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffa0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
ffb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ffc0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
ffd0: 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
ffe0: 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
fff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
10000 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
10010 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
10020 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
10030 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20  .    {.      rc 
10040 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  = sqlite3OsFullP
10050 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
10060 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  ilename, nPathna
10070 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  me, zPathname);.
10080 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
10090 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
100a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
100b0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
100c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
100d0 20 20 20 7d 0a 20 20 20 20 6e 50 61 74 68 6e 61     }.    nPathna
100e0 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 50 61 74  me = strlen(zPat
100f0 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  hname);.  }..  /
10100 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
10110 79 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  y for the pager 
10120 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70  structure */.  p
10130 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  Pager = sqlite3M
10140 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73  allocZero(.    s
10150 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
10160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
10170 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
10180 0a 20 20 20 20 70 63 61 63 68 65 53 69 7a 65 20  .    pcacheSize 
10190 20 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 20       +          
101a0 20 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63   /* PCache objec
101b0 74 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  t */.    journal
101c0 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20  FileSize +      
101d0 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72       /* The jour
101e0 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75  nal file structu
101f0 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d  re */ .    pVfs-
10200 3e 73 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20  >szOsFile  +    
10210 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10220 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
10230 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
10240 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a  e * 2 +       /*
10250 20 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c   The two journal
10260 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33   files */ .    3
10270 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20  *nPathname + 40 
10280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
10290 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74  ilename, zDirect
102a0 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f  ory, zJournal */
102b0 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  .  );.  if( !pPa
102c0 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ger ){.    sqlit
102d0 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
102e0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
102f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
10300 0a 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  .  pPager->pPCac
10310 68 65 20 3d 20 28 50 43 61 63 68 65 20 2a 29 26  he = (PCache *)&
10320 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74  pPager[1];.  pPt
10330 72 20 3d 20 28 28 75 38 20 2a 29 26 70 50 61 67  r = ((u8 *)&pPag
10340 65 72 5b 31 5d 29 20 2b 20 70 63 61 63 68 65 53  er[1]) + pcacheS
10350 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76  ize;.  pPager->v
10360 66 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61  fsFlags = vfsFla
10370 67 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  gs;.  pPager->fd
10380 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
10390 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
103a0 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61  OsFile*0];.  pPa
103b0 67 65 72 2d 3e 73 74 66 64 20 3d 20 28 73 71 6c  ger->stfd = (sql
103c0 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
103d0 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d  [pVfs->szOsFile]
103e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
103f0 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
10400 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
10410 73 46 69 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c  sFile+journalFil
10420 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72  eSize];.  pPager
10430 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
10440 68 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  har*)&pPtr[pVfs-
10450 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72  >szOsFile+2*jour
10460 6e 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20  nalFileSize];.  
10470 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
10480 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46  ry = &pPager->zF
10490 69 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d  ilename[nPathnam
104a0 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
104b0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
104c0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
104d0 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70  Pathname+1];.  p
104e0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
104f0 66 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e  fs;.  if( zPathn
10500 61 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ame ){.    memcp
10510 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  y(pPager->zFilen
10520 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20  ame, zPathname, 
10530 6e 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  nPathname+1);.  
10540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10550 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Pathname);.  }..
10560 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
10570 67 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ger file..  */. 
10580 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
10590 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26  & zFilename[0] &
105a0 26 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  & !memDb ){.    
105b0 69 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70  if( nPathname>(p
105c0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
105d0 2d 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 22 2d  - (int)sizeof("-
105e0 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
105f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10600 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
10610 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
10620 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
10630 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
10640 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
10650 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
10660 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
10690 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
106a0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
106b0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
106c0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
106d0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
106e0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
106f0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
10700 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
10710 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
10720 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
10730 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
10740 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
10750 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
10760 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
10770 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
10780 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
10790 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
107a0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
107b0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
107c0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
107d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
107e0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
107f0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
10800 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
10810 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
10820 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
10830 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
10840 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
10850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10860 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
10870 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
10880 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
10890 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
108a0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
108b0 20 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c     if( szPageDfl
108c0 74 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b  t<iSectorSize ){
108d0 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
108e0 65 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53  eDflt = iSectorS
108f0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ize;.        }.#
10900 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10910 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
10920 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
10930 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
10940 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
10950 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
10960 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
10970 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
10980 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
10990 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
109a0 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
109b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
109c0 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
109d0 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
109e0 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20  >>8));.         
109f0 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d   assert(SQLITE_M
10a00 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
10a10 53 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20  SIZE<=65536);.  
10a20 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73          for(ii=s
10a30 7a 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53  zPageDflt; ii<=S
10a40 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
10a50 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d  T_PAGE_SIZE; ii=
10a60 69 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20  ii*2){.         
10a70 20 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49     if( iDc&(SQLI
10a80 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c  TE_IOCAP_ATOMIC|
10a90 28 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67  (ii>>8)) ) szPag
10aa0 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
10ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10ac0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
10ad0 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e   if( szPageDflt>
10ae0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
10af0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
10b00 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
10b10 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Dflt = SQLITE_MA
10b20 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
10b30 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IZE;.        }. 
10b40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10b50 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
10b60 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10b70 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
10b80 74 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20  t is not opened 
10b90 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
10ba0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
10bb0 20 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64   we accept the d
10bc0 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
10bd0 20 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61   and delay actua
10be0 6c 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69  lly.    ** openi
10bf0 6e 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69  ng the file unti
10c00 6c 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  l the first call
10c10 20 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20   to OsWrite().. 
10c20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
10c30 73 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f  s branch is also
10c40 20 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d   run for an in-m
10c50 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
10c60 41 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20  An in-memory.   
10c70 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
10c80 74 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65  the same as a te
10c90 6d 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20  mp-file that is 
10ca0 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75  never written ou
10cb0 74 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b  t to.    ** disk
10cc0 20 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d   and uses an in-
10cd0 6d 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20  memory rollback 
10ce0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20  journal..    */ 
10cf0 0a 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20  .    tempFile = 
10d00 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
10d10 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
10d20 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69  LUSIVE;.  }..  i
10d30 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
10d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d50 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
10d60 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
10d70 65 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66  eMalloc(szPageDf
10d80 6c 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  lt);.  }..  /* I
10d90 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10da0 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20  ed in either of 
10db0 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65  the blocks above
10dc0 2e 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20  ..  ** Free the 
10dd0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
10de0 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69  and close the fi
10df0 6c 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74  le..  ** Since t
10e00 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
10e10 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
10e20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
10e30 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
10e40 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
10e50 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
10e60 21 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67  !pPager || !pPag
10e70 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  er->pTmpSpace ){
10e80 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
10e90 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
10ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
10eb0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10ec0 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
10ed0 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f  TE_OK)?SQLITE_NO
10ee0 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e  MEM:rc);.  }.  n
10ef0 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
10f00 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
10f10 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
10f20 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
10f30 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
10f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10f50 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
10f60 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
10f70 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
10f80 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
10f90 50 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45  PAGERTRACE3("OPE
10fa0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
10fb0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
10fc0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
10fd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52  ilename);.  IOTR
10fe0 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73  ACE(("OPEN %p %s
10ff0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
11000 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29  ger->zFilename))
11010 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
11020 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b  ager.zDirectory[
11030 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
11040 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
11050 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
11060 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
11070 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65  );.  for(i=strle
11080 6e 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n(pPager->zDirec
11090 74 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50  tory); i>0 && pP
110a0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
110b0 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
110c0 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
110d0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
110e0 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f  y[i-1] = 0;..  /
110f0 2a 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e  * Fill in Pager.
11100 7a 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20  zJournal[] */.  
11110 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b  if( zPathname ){
11120 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
11130 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
11140 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
11150 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
11160 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
11170 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
11180 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
11190 2c 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 9);.  }else{. 
111a0 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
111b0 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nal = 0;.  }..  
111c0 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  /* pPager->journ
111d0 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  alOpen = 0; */. 
111e0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
111f0 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
11200 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
11210 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c  adlock = noReadl
11220 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b  ock && readOnly;
11230 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
11240 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
11250 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
11260 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
11270 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
11280 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11290 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
112a0 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
112b0 3e 70 61 67 65 53 69 7a 65 20 3d 20 73 7a 50 61  >pageSize = szPa
112c0 67 65 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50 61  geDflt;.  /* pPa
112d0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
112e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
112f0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
11300 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11310 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
11320 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
11330 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
11340 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
11350 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
11360 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
11370 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
11380 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
11390 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
113a0 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
113b0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
113c0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
113d0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
113e0 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
113f0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
11400 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
11410 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
11420 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
11430 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
11440 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
11450 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
11460 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
11470 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
11480 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
11490 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
114a0 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
114b0 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65  eMode = tempFile
114c0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
114d0 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
114e0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
114f0 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
11500 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
11510 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
11520 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
11530 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
11540 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
11550 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
11560 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
11570 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
11580 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
11590 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
115a0 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
115b0 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
115c0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
115d0 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
115e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
115f0 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
11600 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 6e  ager->nExtra = n
11610 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72 2d  Extra;.  pPager-
11620 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69  >journalSizeLimi
11630 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  t = SQLITE_DEFAU
11640 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f  LT_JOURNAL_SIZE_
11650 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74 28  LIMIT;.  assert(
11660 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
11670 68 6f 64 73 7c 7c 74 65 6d 70 46 69 6c 65 29 3b  hods||tempFile);
11680 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
11690 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
116a0 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
116b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
116c0 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c   = PAGER_JOURNAL
116d0 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  MODE_MEMORY;.  }
116e0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 78 42  .  /* pPager->xB
116f0 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
11700 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
11710 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20  pBusyHandlerArg 
11720 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d  = 0; */.  /* mem
11730 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73  set(pPager->aHas
11740 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61  h, 0, sizeof(pPa
11750 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f  ger->aHash)); */
11760 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50  .  *ppPager = pP
11770 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 53  ager;.  return S
11780 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11790 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
117a0 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
117b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
117c0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
117d0 64 6c 65 72 28 0a 20 20 50 61 67 65 72 20 2a 70  dler(.  Pager *p
117e0 50 61 67 65 72 2c 20 0a 20 20 69 6e 74 20 28 2a  Pager, .  int (*
117f0 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f  xBusyHandler)(vo
11800 69 64 20 2a 29 2c 0a 20 20 76 6f 69 64 20 2a 70  id *),.  void *p
11810 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 0a 29  BusyHandlerArg.)
11820 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e 78 42  {  .  pPager->xB
11830 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
11840 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70 50 61  syHandler;.  pPa
11850 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
11860 72 41 72 67 20 3d 20 70 42 75 73 79 48 61 6e 64  rArg = pBusyHand
11870 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lerArg;.}../*.**
11880 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
11890 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
118a0 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
118b0 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
118c0 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
118d0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
118e0 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
118f0 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
11900 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
11910 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
11920 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
11930 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
11940 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
11950 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
11960 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
11970 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
11980 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
11990 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
119a0 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
119b0 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
119c0 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
119d0 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
119e0 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
119f0 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
11a00 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
11a10 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
11a20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
11a30 70 61 67 65 20 73 69 7a 65 20 74 6f 20 2a 70 50  page size to *pP
11a40 61 67 65 53 69 7a 65 2e 20 49 66 20 74 68 65 20  ageSize. If the 
11a50 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
11a60 20 73 69 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70   size is.** inap
11a70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
11a80 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
11a90 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 74 20  age size is set 
11aa0 74 6f 20 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65  to that.** value
11ab0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
11ac0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
11ad0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
11ae0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
11af0 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65 29   u16 *pPageSize)
11b00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61  {.  int rc = pPa
11b10 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
11b20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11b30 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
11b40 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
11b50 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
11b60 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
11b70 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
11b80 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
11b90 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
11ba0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   );.    if( page
11bb0 53 69 7a 65 20 26 26 20 70 61 67 65 53 69 7a 65  Size && pageSize
11bc0 21 3d 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  !=pPager->pageSi
11bd0 7a 65 20 0a 20 20 20 20 20 26 26 20 28 70 50 61  ze .     && (pPa
11be0 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
11bf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
11c00 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
11c10 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
11c20 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
11c30 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)==0 .    ){.  
11c40 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
11c50 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
11c60 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
11c70 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
11c80 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
11c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
11ca0 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
11cb0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
11cc0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
11cd0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
11ce0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
11cf0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e;.        if( !
11d00 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 20  pPager->memDb ) 
11d10 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
11d20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
11d30 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
11d40 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
11d50 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
11d60 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
11d70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
11d80 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
11d90 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
11da0 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
11db0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11dc0 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
11dd0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11de0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
11df0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
11e00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
11e10 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20   the "temporary 
11e20 70 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c  page" buffer hel
11e30 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20  d internally.** 
11e40 62 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54  by the pager.  T
11e50 68 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20  his is a buffer 
11e60 74 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75  that is big enou
11e70 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  gh to hold the.*
11e80 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  * entire content
11e90 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
11ea0 61 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65  age.  This buffe
11eb0 72 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e  r is used intern
11ec0 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72  ally.** during r
11ed0 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c  ollback and will
11ee0 20 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20   be overwritten 
11ef0 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62  whenever a rollb
11f00 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20  ack.** occurs.  
11f10 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65  But other module
11f20 73 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73  s are free to us
11f30 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e  e it too, as lon
11f40 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62  g as.** no rollb
11f50 61 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69  acks are happeni
11f60 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ng..*/.void *sql
11f70 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
11f80 63 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ce(Pager *pPager
11f90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
11fa0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d  er->pTmpSpace;.}
11fb0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
11fc0 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
11fd0 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
11fe0 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
11ff0 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
12000 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
12010 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
12020 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
12030 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
12040 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
12050 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
12060 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
12070 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
12080 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
12090 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
120a0 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
120b0 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
120c0 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
120d0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
120e0 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
120f0 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
12100 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
12110 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
12120 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
12130 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
12140 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
12150 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74  Pager, 0);.  ret
12160 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  urn pPager->mxPg
12170 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
12180 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
12190 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
121a0 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
121b0 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
121c0 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
121d0 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
121e0 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
121f0 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
12200 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
12210 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
12220 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
12230 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
12240 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
12250 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
12260 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
12270 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
12280 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
12290 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
122a0 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
122b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
122c0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
122d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
122e0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
122f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
12300 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61  d_cnt;.void disa
12310 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
12320 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
12330 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
12340 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
12350 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
12360 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
12370 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
12380 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
12390 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
123a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
123b0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
123c0 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
123d0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
123e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
123f0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
12400 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
12410 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
12420 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
12430 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
12440 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
12450 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
12460 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
12470 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
12480 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
12490 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
124a0 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
124b0 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
124c0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
124d0 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
124e0 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
124f0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
12500 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
12510 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
12520 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
12530 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
12540 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
12550 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
12560 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
12570 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
12580 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
12590 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
125a0 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
125b0 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
125c0 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
125d0 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
125e0 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
125f0 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
12600 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
12610 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
12620 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
12630 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
12640 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
12650 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12660 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
12670 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73  est, 0, N);.  as
12680 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
12690 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
126a0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
126b0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  if( pPager->fd->
126c0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
126d0 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20  IOTRACE(("DBHDR 
126e0 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67  %p 0 %d\n", pPag
126f0 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d  er, N)).    rc =
12700 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
12710 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
12720 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , N, 0);.    if(
12730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
12740 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
12750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12760 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
12770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12780 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12790 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
127a0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69   pages in the di
127b0 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74  sk file associat
127c0 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65  ed with.** pPage
127d0 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  r. .**.** If the
127e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69   PENDING_BYTE li
127f0 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64  es on the page d
12800 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68  irectly after th
12810 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12820 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69  file, then consi
12830 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61  der this page pa
12840 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  rt of the file t
12850 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  oo. For example,
12860 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42   if.** PENDING_B
12870 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36  YTE is byte 4096
12880 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
12890 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20   of page 5) and 
128a0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
128b0 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20  ** file is 4096 
128c0 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75  bytes, 5 is retu
128d0 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  rned instead of 
128e0 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  4..*/.int sqlite
128f0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12900 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12910 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69  nt *pnPage){.  i
12920 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 n = 0;.  int 
12930 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
12940 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
12950 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12960 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
12970 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
12980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12990 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
129a0 62 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20  bSizeValid ){.  
129b0 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
129c0 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
129d0 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
129e0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
129f0 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ||pPager->tempFi
12a00 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50  le);.    if( (pP
12a10 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
12a20 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20  ds).     && (rc 
12a30 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
12a40 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
12a50 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
12a60 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
12a70 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
12a80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
12a90 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
12aa0 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
12ab0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
12ac0 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d      n = 1;.    }
12ad0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d  else{.      n /=
12ae0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
12af0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
12b00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
12b10 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
12b20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
12b30 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 20 20  Size = n;.      
12b40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
12b50 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  lid = 1;.    }. 
12b60 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
12b70 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
12b80 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
12b90 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66     n++;.  }.  if
12ba0 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  ( n>pPager->mxPg
12bb0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
12bc0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20  ->mxPgno = n;.  
12bd0 7d 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29  }.  if( pnPage )
12be0 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20  {.    *pnPage = 
12bf0 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
12c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12c10 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
12c20 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
12c30 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
12c40 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
12c50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12c60 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
12c70 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65  te the cache whe
12c80 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  n a database.** 
12c90 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44  is truncated.  D
12ca0 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63  rop from the cac
12cb0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  he all pages who
12cc0 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61  se pgno is.** la
12cd0 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
12ce0 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
12cf0 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
12d00 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
12d10 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
12d20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
12d30 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
12d40 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74  * Actually, at t
12d50 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
12d60 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
12d70 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20   it would be.** 
12d80 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  an error to have
12d90 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61   a referenced pa
12da0 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20  ge.  But rather 
12db0 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74  than delete.** t
12dc0 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61  hat page and gua
12dd0 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75  rantee a subsequ
12de0 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74  ent segfault, it
12df0 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a   seems better.**
12e00 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20   to zero it and 
12e10 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72  hope that we err
12e20 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a  or out sanely..*
12e30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
12e40 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
12e50 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
12e60 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
12e70 68 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  heTruncate(pPage
12e80 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67  r->pPCache, pPag
12e90 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a  er->dbSize);.}..
12ea0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
12eb0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
12ec0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
12ed0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
12ee0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
12ef0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
12f00 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
12f10 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
12f20 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
12f30 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
12f40 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
12f50 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
12f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
12f70 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
12f80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
12f90 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
12fa0 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
12fb0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
12fc0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
12fd0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
12fe0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
12ff0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
13000 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
13010 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
13020 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
13030 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
13040 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
13050 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
13060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
13070 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
13080 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
13090 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
130a0 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
130b0 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
130c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
130d0 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
130e0 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
130f0 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
13100 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
13110 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
13120 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
13130 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
13140 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ==0 );..  if( pP
13150 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
13160 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
13170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
13180 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
13190 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
131a0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
131b0 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
131c0 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
131d0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
131e0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
131f0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
13200 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
13210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
13230 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
13240 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
13250 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
13260 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
13270 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
13280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
132a0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
132b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
132c0 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
132d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
132e0 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
132f0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
13300 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
13310 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
13320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
13330 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
13340 44 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  D );..  sqlite3P
13350 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
13360 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
13370 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13380 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
13390 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
133a0 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3c 70  else if( nPage<p
133b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
133c0 0a 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f  .    rc = syncJo
133d0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
133e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
133f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
13400 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
13410 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
13420 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
13430 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  uncating. */.   
13440 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
13450 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
13460 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
13470 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  K);.    }.    if
13480 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
134a0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
134b0 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20  ger, nPage);.   
134c0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
134d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
134e0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
134f0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
13500 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
13510 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
13520 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
13530 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
13540 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
13550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
13560 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
13570 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
13580 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
13590 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
135a0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
135b0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
135c0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
135d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
135e0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
135f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
13600 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
13610 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
13620 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
13630 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
13640 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
13650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
13660 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
13670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
13680 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
13690 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
136a0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
136b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
136c0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
136d0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
136e0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
136f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
13700 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
13710 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
13720 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
13730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13740 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
13750 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 64 69   *pPager){..  di
13760 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
13770 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73  io_errors();.  s
13780 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
13790 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61  nMalloc();.  pPa
137a0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
137b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
137c0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
137d0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
137e0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d  ger);.  if( !MEM
137f0 44 42 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55  DB ){.    pagerU
13800 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
13810 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
13820 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
13830 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
13840 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
13850 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45  Malloc();.  PAGE
13860 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  RTRACE2("CLOSE %
13870 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
13880 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
13890 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
138a0 20 70 50 61 67 65 72 29 29 0a 20 20 69 66 28 20   pPager)).  if( 
138b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
138c0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
138d0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
138e0 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
138f0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
13900 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
13910 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65  urnal);.  sqlite
13920 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
13930 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f  Pager->pAlwaysRo
13940 6c 6c 62 61 63 6b 29 3b 0a 20 20 69 66 28 20 70  llback);.  if( p
13950 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
13960 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
13970 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74  Close(pPager->st
13980 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
13990 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
139a0 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
139b0 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
139c0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
139d0 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
139e0 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
139f0 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
13a00 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
13a10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13a20 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
13a30 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
13a40 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
13a50 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ace);.  sqlite3P
13a60 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65  cacheClose(pPage
13a70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 73  r->pPCache);.  s
13a80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
13a90 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
13aa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
13ab0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
13ac0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
13ad0 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
13ae0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
13af0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
13b00 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
13b10 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
13b20 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
13b30 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
13b40 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
13b50 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
13b60 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
13b70 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
13b80 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
13b90 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
13ba0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
13bb0 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
13bc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
13bd0 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
13be0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
13bf0 65 52 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  eRef(pPg);.  ret
13c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13c10 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
13c20 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
13c30 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
13c40 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
13c50 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
13c60 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
13c70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
13c80 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
13c90 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
13ca0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
13cb0 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
13cc0 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
13cd0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
13ce0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
13cf0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
13d00 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
13d10 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
13d20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
13d30 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
13d40 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
13d50 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
13d60 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
13d70 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
13d80 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
13d90 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
13da0 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
13db0 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
13dc0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
13dd0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
13de0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
13df0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
13e00 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
13e10 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
13e20 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
13e30 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
13e40 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
13e50 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
13e60 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
13e70 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
13e80 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
13e90 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
13ea0 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
13eb0 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
13ec0 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
13ed0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
13ee0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
13ef0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
13f00 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13f10 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
13f20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
13f30 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
13f40 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
13f50 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
13f60 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
13f70 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
13f80 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
13f90 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f 20 73  failure, so no s
13fa0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
13fb0 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  * If the IOCAP_S
13fc0 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67 20 69  EQUENTIAL flag i
13fd0 73 20 73 65 74 20 66 6f 72 20 74 68 65 20 70 65  s set for the pe
13fe0 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 6f  rsistent media o
13ff0 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 64  n which.** the d
14000 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72 65  atabase is store
14010 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63 28 29  d, then OsSync()
14020 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
14030 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   on the journal.
14040 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69 73  ** file. In this
14050 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74 20 69   case all that i
14060 73 20 72 65 71 75 69 72 65 64 20 69 73 20 74 6f  s required is to
14070 20 75 70 64 61 74 65 20 74 68 65 20 6e 52 65 63   update the nRec
14080 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74 68 65   field in.** the
14090 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
140a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
140b0 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
140c0 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
140d0 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
140e0 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
140f0 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
14100 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
14110 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14120 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14130 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
14140 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
14150 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
14160 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
14170 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
14180 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
14190 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
141a0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
141b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
141c0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
141d0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
141e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
141f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
14200 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
14210 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
14220 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e  MORY ){.      in
14230 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
14240 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
14250 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
14260 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
14270 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14280 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20  lOpen );..      
14290 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
142a0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
142b0 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20  PEND) ){.       
142c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
142d0 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
142e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
142f0 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
14300 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
14310 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
14320 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
14330 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
14340 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
14350 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
14360 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
14370 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
14380 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
14390 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
143a0 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
143b0 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
143c0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
143d0 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
143e0 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
143f0 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
14400 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
14410 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
14420 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
14430 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
14440 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
14450 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
14460 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
14470 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
14480 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
14490 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
144a0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
144b0 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
144c0 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
144d0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
144e0 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
144f0 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
14500 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
14510 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
14520 20 20 20 20 20 20 20 20 69 36 34 20 6a 72 6e 6c          i64 jrnl
14530 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Off;.        if(
14540 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
14550 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
14560 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
14570 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
14580 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
14590 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
145a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
145b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
145c0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
145d0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
145e0 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
145f0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
14600 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
14610 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
14620 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14630 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
14640 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
14650 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20 3d 20        jrnlOff = 
14660 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
14670 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
14680 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20  rnalMagic);.    
14690 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
146a0 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
146b0 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c 4f 66  , pPager, jrnlOf
146c0 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20  f, 4));.        
146d0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
146e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
146f0 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 6e  nlOff, pPager->n
14700 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
14710 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14730 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49  if( 0==(iDc&SQLI
14740 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
14750 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  IAL) ){.        
14760 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
14770 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
14780 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
14790 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  er));.        IO
147a0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
147b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
147c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
147d0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
147e0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
147f0 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20  nc_flags| .     
14800 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79       (pPager->sy
14810 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45  nc_flags==SQLITE
14820 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54  _SYNC_FULL?SQLIT
14830 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a  E_SYNC_DATAONLY:
14840 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  0).        );.  
14850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14860 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14870 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
14880 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
14890 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
148a0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
148b0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
148c0 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
148d0 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
148e0 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
148f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
14900 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70  ClearSyncFlags(p
14910 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
14920 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
14930 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
14940 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
14950 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
14960 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
14970 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
14980 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
14990 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
149a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
149b0 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73 20 61  file. No calls a
149c0 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  re made.** to th
149d0 65 20 70 61 67 65 2d 63 61 63 68 65 20 74 6f 20  e page-cache to 
149e0 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73 20 61  mark the pages a
149f0 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73 20 74  s clean. It is t
14a00 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
14a10 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61 6c 6c  y.** of the call
14a20 65 72 20 74 6f 20 75 73 65 20 50 63 61 63 68 65  er to use Pcache
14a30 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20 50 63  CleanAll() or Pc
14a40 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20  acheMakeClean() 
14a50 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65 20 70  to mark.** the p
14a60 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  ages as clean..*
14a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
14a80 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
14a90 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
14aa0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14ab0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14ac0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14ae0 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
14af0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
14b00 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14b10 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
14b20 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
14b30 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
14b40 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
14b50 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
14b60 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
14b70 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
14b80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
14b90 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
14ba0 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
14bb0 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
14bc0 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
14bd0 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
14be0 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
14bf0 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
14c00 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
14c10 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
14c20 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
14c30 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
14c40 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
14c50 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
14c60 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
14c70 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
14c80 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
14c90 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
14ca0 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
14cb0 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
14cc0 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
14cd0 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
14ce0 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
14cf0 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
14d00 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
14d10 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
14d20 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
14d30 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
14d40 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
14d50 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
14d60 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
14d70 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
14d80 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
14d90 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14da0 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
14db0 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
14dc0 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
14dd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14de0 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
14df0 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
14e00 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
14e10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14e20 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
14e30 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
14e40 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
14e50 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
14e60 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
14e70 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
14e80 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
14e90 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
14ea0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14ec0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68  rn rc;.  }..  wh
14ed0 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
14ee0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
14ef0 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
14f00 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
14f10 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
14f20 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
14f30 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
14f40 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
14f50 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
14f60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
14f70 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
14f80 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20  er, pPager->fd, 
14f90 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
14fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
14fb0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14fc0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
14fd0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
14fe0 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
14ff0 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
15000 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
15010 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
15020 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
15030 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
15040 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
15050 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
15060 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
15070 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
15080 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
15090 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
150a0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
150b0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
150c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
150d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
150e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
150f0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
15100 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
15110 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
15120 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
15130 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
15140 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
15150 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61  eSize;.      cha
15160 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
15170 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  2(pPager, pList-
15180 3e 70 44 61 74 61 2c 20 70 4c 69 73 74 2d 3e 70  >pData, pList->p
15190 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50  gno, 6);.      P
151a0 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f 52  AGERTRACE4("STOR
151b0 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
151c0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
151e0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
151f0 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67  pList->pgno, pag
15200 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
15210 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  t));.      IOTRA
15220 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
15230 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
15240 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  st->pgno));.    
15250 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15260 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
15270 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
15280 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
15290 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f  t);.      PAGER_
152a0 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
152b0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
152c0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
152d0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69  NCR(pPager->nWri
152e0 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  te);.      if( p
152f0 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  List->pgno==1 ){
15300 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
15310 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
15320 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c  ers, &pData[24],
15330 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
15340 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
15350 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e      }.    }.#ifn
15360 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
15370 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52  lse{.      PAGER
15380 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20  TRACE3("NOSTORE 
15390 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
153a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
153b0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
153c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69    }.#endif.    i
153d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
153e0 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
153f0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
15400 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68   pList->pageHash
15410 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
15420 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  h(pList);.#endif
15430 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69  .    pList = pLi
15440 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a  st->pDirty;.  }.
15450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15460 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
15470 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15480 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
15490 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
154a0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
154b0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
154c0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 61 72 67  y limit. The arg
154d0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
154e0 65 72 20 74 6f 20 61 20 70 75 72 67 65 61 62 6c  er to a purgeabl
154f0 65 20 50 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65  e Pager .** obje
15500 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ct. This functio
15510 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6d 61  n attempts to ma
15520 6b 65 20 61 20 73 69 6e 67 6c 65 20 64 69 72 74  ke a single dirt
15530 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20  y page that has 
15540 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  no.** outstandin
15550 67 20 72 65 66 65 72 65 6e 63 65 73 20 28 69 66  g references (if
15560 20 6f 6e 65 20 65 78 69 73 74 73 29 20 63 6c 65   one exists) cle
15570 61 6e 20 73 6f 20 74 68 61 74 20 69 74 20 63 61  an so that it ca
15580 6e 20 62 65 20 72 65 63 79 63 6c 65 64 20 0a 2a  n be recycled .*
15590 2a 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  * by the pcache 
155a0 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
155b0 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
155c0 28 76 6f 69 64 20 2a 70 2c 20 50 67 48 64 72 20  (void *p, PgHdr 
155d0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
155e0 70 50 61 67 65 72 20 3d 20 28 50 61 67 65 72 20  pPager = (Pager 
155f0 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *)p;.  int rc = 
15600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
15610 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
15620 79 6e 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ync ){.    retur
15630 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15640 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
15650 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
15660 54 59 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  TY );.  if( pPag
15670 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
15680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15690 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ( pPg->flags&PGH
156a0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
156b0 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
156c0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
156d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
156e0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
156f0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a  r->fullSync && .
15700 20 20 20 20 20 20 20 20 21 28 70 50 61 67 65 72          !(pPager
15710 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
15720 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
15730 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20 20  _MEMORY) &&.    
15740 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
15750 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
15760 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
15770 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
15780 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 20  FE_APPEND).     
15790 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
157a0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
157b0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
157c0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
157d0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
157e0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
157f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15800 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
15810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  ;.      rc = pag
15820 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
15830 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
15840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15850 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
15860 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
15870 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   rc);.    }.  }.
15880 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
158a0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
158b0 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  an(pPg);.  }.  r
158c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
158d0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
158e0 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
158f0 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
15900 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
15910 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
15920 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
15930 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
15940 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
15950 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
15960 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15970 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
15980 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
15990 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
159a0 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
159b0 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
159c0 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
159d0 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
159e0 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
159f0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
15a00 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  al..**.** Return
15a10 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e 61   negative if una
15a20 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
15a30 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74   the status of t
15a40 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
15a50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
15a60 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65  oes not open the
15a70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
15a80 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20   examine its.** 
15a90 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c  content.  Hence,
15aa0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
15ab0 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  ht contain the n
15ac0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 0a  ame of a master.
15ad0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
15ae0 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64 65  that has been de
15af0 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63 65  leted, and hence
15b00 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f 72   not be hot.  Or
15b10 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 6f  .** the header o
15b20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  f the journal mi
15b30 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f 75  ght be zeroed ou
15b40 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
15b50 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69 73  .** does not dis
15b60 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73 65  cover these case
15b70 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a  s of a non-hot j
15b80 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a  ournal - if the.
15b90 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
15ba0 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f  exists and is no
15bb0 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f 75  t empty this rou
15bc0 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74 0a  tine assumes it.
15bd0 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65 20  ** is hot.  The 
15be0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
15bf0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69   routine will di
15c00 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 0a  scover that the.
15c10 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
15c20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
15c30 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70  t and will no-op
15c40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15c50 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
15c60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15c70 20 2a 70 45 78 69 73 74 73 29 7b 0a 20 20 73 71   *pExists){.  sq
15c80 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
15c90 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
15ca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15cb0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73  E_OK;.  int exis
15cc0 74 73 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b 65 64  ts;.  int locked
15cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15ce0 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
15cf0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
15d00 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72  urnal );.  asser
15d10 74 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  t( pPager->fd->p
15d20 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 2a 70 45  Methods );.  *pE
15d30 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 72 63 20  xists = 0;.  rc 
15d40 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
15d50 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
15d60 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
15d70 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
15d80 26 65 78 69 73 74 73 29 3b 0a 20 20 69 66 28 20  &exists);.  if( 
15d90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15da0 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 72   exists ){.    r
15db0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 43 68 65  c = sqlite3OsChe
15dc0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
15dd0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6c 6f 63 6b  Pager->fd, &lock
15de0 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ed);.  }.  if( r
15df0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15e00 65 78 69 73 74 73 20 26 26 20 21 6c 6f 63 6b 65  exists && !locke
15e10 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61  d ){.    int nPa
15e20 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ge;.    rc = sql
15e30 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
15e40 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67  nt(pPager, &nPag
15e50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
15e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e70 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
15e80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15e90 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
15ea0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
15eb0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
15ec0 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 45 78 69  e{.        *pExi
15ed0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  sts = 1;.      }
15ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15ef0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15f00 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
15f10 74 20 6f 66 20 70 61 67 65 20 70 50 67 20 6f 75  t of page pPg ou
15f20 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
15f30 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
15f40 63 20 69 6e 74 20 72 65 61 64 44 62 50 61 67 65  c int readDbPage
15f50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
15f60 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67 6e 6f  PgHdr *pPg, Pgno
15f70 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63   pgno){.  int rc
15f80 3b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 3b 0a  ;.  i64 offset;.
15f90 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d    assert( MEMDB=
15fa0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  =0 );.  assert(p
15fb0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15fc0 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d  ods||pPager->tem
15fd0 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  pFile);.  if( !p
15fe0 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15ff0 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ods ){.    retur
16000 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
16010 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20  HORT_READ;.  }. 
16020 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d   offset = (pgno-
16030 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
16040 70 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d  pageSize;.  rc =
16050 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
16060 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e  Pager->fd, pPg->
16070 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
16080 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
16090 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  ;.  PAGER_INCR(s
160a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
160b0 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
160c0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
160d0 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
160e0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
160f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
16100 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  ));.  if( pgno==
16110 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
16120 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
16130 65 72 73 2c 20 26 28 28 75 38 2a 29 70 50 67 2d  ers, &((u8*)pPg-
16140 3e 70 44 61 74 61 29 5b 32 34 5d 2c 0a 20 20 20  >pData)[24],.   
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
16180 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
16190 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f  Vers));.  }.  CO
161a0 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50 67  DEC1(pPager, pPg
161b0 2d 3e 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  ->pData, pPg->pg
161c0 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54  no, 3);.  PAGERT
161d0 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20  RACE4("FETCH %d 
161e0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
161f0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
16200 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
16210 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
16220 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
16230 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  (pPg));.  return
16240 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16260 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
16270 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
16280 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
16290 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
162a0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
162b0 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
162c0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
162d0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
162e0 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
162f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
16300 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
16310 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
16320 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
16330 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
16340 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
16350 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
16360 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
16370 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
16380 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
16390 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
163a0 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
163b0 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
163c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
163d0 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
163e0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
163f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
16400 20 69 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65   int isErrorRese
16410 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
16420 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69 73  this database is
16430 20 6f 70 65 6e 65 64 20 66 6f 72 20 65 78 63 6c   opened for excl
16440 75 73 69 76 65 20 61 63 63 65 73 73 2c 20 68 61  usive access, ha
16450 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
16460 20 0a 20 20 2a 2a 20 70 61 67 65 20 72 65 66 65   .  ** page refe
16470 72 65 6e 63 65 73 20 61 6e 64 20 69 73 20 69 6e  rences and is in
16480 20 61 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   an error-state,
16490 20 6e 6f 77 20 69 73 20 74 68 65 20 63 68 61 6e   now is the chan
164a0 63 65 20 74 6f 20 63 6c 65 61 72 0a 20 20 2a 2a  ce to clear.  **
164b0 20 74 68 65 20 65 72 72 6f 72 2e 20 44 69 73 63   the error. Disc
164c0 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
164d0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
164e0 63 68 65 20 61 6e 64 20 74 72 65 61 74 20 61 6e  che and treat an
164f0 79 0a 20 20 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72  y.  ** open jour
16500 6e 61 6c 20 66 69 6c 65 20 61 73 20 61 20 68 6f  nal file as a ho
16510 74 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t-journal..  */.
16520 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
16530 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
16540 65 4d 6f 64 65 20 0a 20 20 20 26 26 20 73 71 6c  eMode .   && sql
16550 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
16560 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
16570 68 65 29 3d 3d 30 20 26 26 20 70 50 61 67 65 72  he)==0 && pPager
16580 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20 29 7b 0a  ->errCode .  ){.
16590 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
165a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
165b0 20 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65       isErrorRese
165c0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 1;.    }.   
165d0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
165e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
165f0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
16600 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
16610 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
16620 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72   still in an err
16630 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74  or state, do not
16640 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72   proceed. The er
16650 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20  ror .  ** state 
16660 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20  will be cleared 
16670 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  at some point in
16680 20 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e   the future when
16690 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20   all page .  ** 
166a0 72 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64  references are d
166b0 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63  ropped and the c
166c0 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
166d0 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  arded..  */.  if
166e0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
166f0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
16700 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
16710 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  L ){.    return 
16720 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
16730 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
16740 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
16750 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 45 72 72  _UNLOCK || isErr
16760 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 73  orReset ){.    s
16770 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
16780 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
16790 0a 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f  .    int isHotJo
167a0 75 72 6e 61 6c 3b 0a 20 20 20 20 61 73 73 65 72  urnal;.    asser
167b0 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
167c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
167d0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
167e0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
167f0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  =0 );.    if( !p
16800 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
16810 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
16820 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
16830 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
16840 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
16850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16860 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
16870 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16880 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
16890 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
168a0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
168b0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
168c0 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
168d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
168e0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
168f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
16900 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
16910 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
16920 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
16930 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
16940 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16950 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
16960 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
16970 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
16980 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
16990 69 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65  if( !isErrorRese
169a0 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
169b0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
169c0 61 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72  ager, &isHotJour
169d0 6e 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nal);.      if( 
169e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
169f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
16a00 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
16a10 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72    }.    if( isEr
16a20 72 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f  rorReset || isHo
16a30 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
16a40 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
16a50 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16a60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16a70 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
16a80 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d  t is.      ** im
16a90 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
16aa0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16ab0 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
16ac0 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
16ad0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
16ae0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
16af0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
16b00 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
16b10 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16b20 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
16b30 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
16b40 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
16b50 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
16b60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
16b70 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
16b80 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
16b90 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
16ba0 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 62 61   it .      ** ba
16bb0 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20  ck..      ** .  
16bc0 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
16bd0 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
16be0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
16bf0 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
16c00 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63  the.      ** sec
16c10 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
16c20 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
16c30 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16c40 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
16c50 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   ** obtain its o
16c60 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
16c70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16c80 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f  e file..      */
16c90 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
16ca0 72 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49  r->state<EXCLUSI
16cb0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
16cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16cd0 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
16ce0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
16cf0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16d10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
16d20 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16d30 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16d40 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
16d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16d60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
16d70 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
16d80 3b 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20  ;.      }. .    
16d90 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
16da0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
16db0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
16dc0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
16dd0 0a 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73  .      ** exclus
16de0 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
16df0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
16e00 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
16e10 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
16e20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64  ** possibly used
16e30 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69   for a transacti
16e40 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20  on later on. On 
16e50 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68  some systems, th
16e60 65 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75  e.      ** OsTru
16e70 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
16e80 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
16e90 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
16ea0 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
16eb0 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
16ec0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
16ed0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
16ee0 69 73 45 72 72 6f 72 52 65 73 65 74 20 26 26 20  isErrorReset && 
16ef0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16f00 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
16f10 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20    int res;.     
16f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16f30 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61  sAccess(pVfs,pPa
16f40 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51  ger->zJournal,SQ
16f50 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
16f60 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20  TS,&res);.      
16f70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16f90 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
16fa0 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
16fb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
16fc0 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
16fd0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
16fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16ff0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
17000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
17010 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
17020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
17030 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
17040 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
17050 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
17060 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
17070 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
17080 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
17090 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
170a0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
170b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
170c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
170d0 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45   fout&SQLITE_OPE
170e0 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20  N_READONLY ){.  
170f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17100 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
17110 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
17120 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
17130 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
17140 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17160 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
17170 65 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  e journal does n
17180 6f 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d  ot exist, that m
17190 65 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  eans some other 
171a0 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20  process.        
171b0 20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61      ** has alrea
171c0 64 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63  dy rolled it bac
171d0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  k */.           
171e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
171f0 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  Y;.          }. 
17200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17210 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17220 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17230 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
17240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
17250 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17260 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  en = 1;.      pP
17270 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
17280 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
17290 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
172a0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
172b0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
172c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
172d0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
172e0 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  0;. .      /* Pl
172f0 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
17300 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
17310 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
17320 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
17330 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
17340 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
17350 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
17360 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
17370 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
17380 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
173a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
173b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
173c0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
173d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
173e0 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
173f0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
17400 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20  R_SHARED || .   
17410 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17420 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
17430 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50   pPager->state>P
17440 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
17450 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
17460 20 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63   if( sqlite3Pcac
17470 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  hePagecount(pPag
17480 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29  er->pPCache)>0 )
17490 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73  {.      /* The s
174a0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
174b0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
174c0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
174d0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
174e0 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
174f0 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
17500 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
17510 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
17520 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ** read or write
17530 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20   transaction).  
17540 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
17550 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
17560 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d     ** has been m
17570 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65  odified.  If the
17580 20 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68   database has ch
17590 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65  anged, flush the
175a0 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  .      ** cache.
175b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
175c0 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
175d0 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
175e0 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
175f0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
17600 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
17610 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
17620 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
17630 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
17640 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a  ytes are.      *
17650 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
17660 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
17670 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
17680 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
17690 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
176a0 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
176b0 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
176c0 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
176d0 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69      ** a codec i
176e0 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20  s in use..      
176f0 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65  ** .      ** The
17700 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e  re is a vanishin
17710 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65  gly small chance
17720 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77   that a change w
17730 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20  ill not be .    
17740 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
17750 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
17760 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
17770 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
17780 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  hat.      ** it 
17790 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
177a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
177b0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
177c0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
177d0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
177e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
177f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
17800 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 0);..      if(
17810 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17820 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17830 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17840 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
17850 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
17860 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17870 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
17880 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
17890 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
178a0 29 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  ){.        IOTRA
178b0 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25  CE(("CKVERS %p %
178c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69  d\n", pPager, si
178d0 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29  zeof(dbFileVers)
178e0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
178f0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
17900 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69  Pager->fd, &dbFi
17910 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
17920 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b  bFileVers), 24);
17930 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17950 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
17960 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  led;.        }. 
17970 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17980 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c      memset(dbFil
17990 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66  eVers, 0, sizeof
179a0 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  (dbFileVers));. 
179b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
179c0 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d  ( memcmp(pPager-
179d0 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
179e0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
179f0 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20  dbFileVers))!=0 
17a00 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
17a10 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17a40 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
17a50 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
17a60 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  <=PAGER_SHARED )
17a70 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17a80 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
17a90 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
17aa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
17ab0 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
17ac0 20 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a   }.  }.. failed:
17ad0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70  E_OK ){.    /* p
17af0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73  ager_unlock() is
17b00 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63   a no-op for exc
17b10 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20  lusive mode and 
17b20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
17b30 73 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ses. */.    page
17b40 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
17b50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17b60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  c;.}../*.** Make
17b70 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68   sure we have th
17b80 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20  e content for a 
17b90 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61  page.  If the pa
17ba0 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f  ge was.** previo
17bb0 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
17bc0 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
17bd0 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
17be0 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e  t was.** just in
17bf0 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
17c00 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65  os instead of be
17c10 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69  ing read from di
17c20 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77  sk..** But now w
17c30 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20  e need the real 
17c40 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b  data off of disk
17c50 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20  .  So make sure 
17c60 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20  we.** have it.  
17c70 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65  Read it in if we
17c80 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20   do not have it 
17c90 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74  already..*/.stat
17ca0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74  ic int pager_get
17cb0 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a  _content(PgHdr *
17cc0 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
17cd0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
17ce0 44 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e  D_READ ){.    in
17cf0 74 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67  t rc = readDbPag
17d00 65 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70  e(pPg->pPager, p
17d10 50 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  Pg, pPg->pgno);.
17d20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17d30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
17d40 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47  Pg->flags &= ~PG
17d50 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20  HDR_NEED_READ;. 
17d60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17d70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
17d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17da0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
17db0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
17dc0 63 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74  ched zero, and t
17dd0 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
17de0 69 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65  in the.** middle
17df0 20 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e   of a write tran
17e00 73 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65  saction or opene
17e10 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  d in exclusive m
17e20 6f 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a  ode, unlock it..
17e30 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
17e40 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
17e50 73 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65  sed(Pager *pPage
17e60 72 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74  r){.  if( (sqlit
17e70 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
17e80 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
17e90 29 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70  )==0).    && (!p
17ea0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
17eb0 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
17ec0 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20  journalOff>0) . 
17ed0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c   ){.    pagerUnl
17ee0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
17ef0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Pager);.  }.}../
17f00 2a 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65  *.** Drop a page
17f10 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
17f20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61  using sqlite3Pca
17f30 63 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a  cheDrop()..**.**
17f40 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
17f50 68 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20  here are now no 
17f60 70 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72  pages with refer
17f70 65 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61  ences to them, a
17f80 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
17f90 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
17fa0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17fb0 20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a   is removed..*/.
17fc0 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
17fd0 72 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65  rDropPage(DbPage
17fe0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
17ff0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
18000 50 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33  Pager;.  sqlite3
18010 50 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b  PcacheDrop(pPg);
18020 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66  .  pagerUnlockIf
18030 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
18040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
18050 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
18060 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
18070 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
18080 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
18090 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
180a0 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
180b0 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
180c0 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
180d0 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
180e0 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
180f0 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
18100 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
18110 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
18120 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
18130 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
18140 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
18150 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
18160 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
18170 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
18180 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
18190 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
181a0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
181b0 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
181c0 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
181d0 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
181e0 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
181f0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
18200 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
18210 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
18220 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
18230 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
18240 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
18250 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
18260 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
18270 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
18280 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
18290 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
182a0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
182b0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
182c0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
182d0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
182e0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
182f0 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
18300 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
18310 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
18320 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
18330 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
18340 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
18350 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
18360 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
18370 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
18380 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
18390 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
183a0 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
183b0 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
183c0 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
183d0 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
183e0 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
183f0 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
18400 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
18410 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
18420 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
18430 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
18440 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
18450 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
18460 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
18470 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
18480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
18490 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
184a0 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
184b0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
184c0 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
184d0 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
184e0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
184f0 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
18500 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
18510 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
18520 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
18530 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
18540 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
18550 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
18560 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
18570 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
18580 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
18590 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
185a0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
185b0 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
185c0 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
185d0 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
185e0 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
185f0 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
18600 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
18610 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
18620 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
18630 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
18640 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
18650 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
18660 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
18670 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
18680 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
18690 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
186a0 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
186b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
186c0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
186d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
186e0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
186f0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
18700 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18710 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
18720 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
18730 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
18740 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
18750 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
18760 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
18770 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
18780 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
18790 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
187a0 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
187b0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
187c0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
187d0 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69  dr *pPg = 0;.  i
187e0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
187f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18800 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20  =PAGER_UNLOCK . 
18810 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
18820 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
18830 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e  Pager->pPCache)>
18840 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e  0 .       || pgn
18850 6f 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  o==1.  );..  /* 
18860 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
18870 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
18880 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
18890 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
188a0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
188b0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
188c0 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
188d0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
188e0 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
188f0 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
18900 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
18910 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
18920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
18930 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
18940 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
18950 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
18960 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
18970 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
18980 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
18990 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
189a0 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ge = 0;..  /* If
189b0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
189c0 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
189d0 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
189e0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
189f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18a00 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
18a10 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
18a20 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
18a30 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
18a40 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
18a50 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
18a60 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
18a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
18a90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
18aa0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
18ab0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18ac0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
18ad0 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50  e3PcacheFetch(pP
18ae0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70  ager->pPCache, p
18af0 67 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  gno, 1, &pPg);. 
18b00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18b10 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
18b20 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
18b30 50 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b  Pg->pPager==0 ){
18b40 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  .    /* The page
18b50 72 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61  r cache has crea
18b60 74 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ted a new page. 
18b70 49 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64  Its content need
18b80 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20  s to .    ** be 
18b90 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20  initialized..   
18ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78   */.    int nMax
18bb0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
18bc0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
18bd0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
18be0 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d   = pPager;.    m
18bf0 65 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72  emset(pPg->pExtr
18c00 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
18c10 78 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d  xtra);..    rc =
18c20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
18c30 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
18c40 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
18c50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18c70 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
18c80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18c90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
18ca0 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
18cb0 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
18cc0 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
18cd0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
18ce0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
18cf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
18d00 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
18d10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
18d20 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
18d30 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
18d40 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
18d50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
18d60 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
18d70 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
18d80 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
18d90 44 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a  D_READ;.      }.
18da0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18db0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
18dc0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
18dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18de0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
18df0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
18e00 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
18e10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
18e20 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
18e30 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
18e40 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
18e50 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
18e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
18e70 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
18e80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18e90 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
18ea0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
18eb0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
18ec0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
18ed0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
18ee0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
18ef0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
18f00 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
18f10 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
18f20 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
18f30 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  t(sqlite3PcacheR
18f40 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
18f50 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67  pPCache)>0 || pg
18f60 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
18f70 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
18f80 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
18f90 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
18fa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
18fb0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
18fc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
18fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
18fe0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
18ff0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19010 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
19020 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
19030 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19040 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19050 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
19060 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
19070 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
19080 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
19090 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
190a0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
190b0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
190c0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
190d0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
190e0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
190f0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
19100 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
19110 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
19120 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
19130 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19140 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
19150 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
19160 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
19170 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
19180 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19190 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
191a0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
191b0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
191c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
191d0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
191e0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
191f0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
19200 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
19210 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
19220 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
19230 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
19240 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
19250 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
19260 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
19270 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
19280 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  ;..  if( (pPager
19290 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
192a0 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50  NLOCK).   && (pP
192b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
192c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
192d0 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
192e0 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_FULL).  ){. 
192f0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19300 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
19310 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
19320 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  &pPg);.  }..  re
19330 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
19340 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
19350 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
19360 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
19370 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
19380 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
19390 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
193a0 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
193b0 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
193c0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
193d0 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
193e0 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
193f0 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
19400 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
19410 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
19420 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
19430 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
19440 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
19450 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
19460 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
19470 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
19480 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
19490 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
194a0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
194b0 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
194c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
194d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
194e0 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
194f0 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
19500 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
19510 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
19520 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
19530 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
19540 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19550 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
19560 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
19570 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
19580 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
19590 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
195a0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
195b0 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
195c0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
195d0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
195e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
195f0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
19600 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19610 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19620 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
19630 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
19640 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
19650 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
19660 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
19670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
19680 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
19690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
196a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
196b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
196c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
196d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
196e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
196f0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
19700 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19710 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
19720 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
19730 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
19740 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
19750 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
19760 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
19770 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
19780 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19790 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
197a0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
197b0 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
197c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
197d0 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
197e0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
197f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
19800 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
19810 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
19820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
19830 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
19840 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
19850 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
19860 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
19870 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
19880 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
19890 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
198a0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
198b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
198c0 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
198d0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
198e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
198f0 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
19900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19910 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
19920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
19930 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
19940 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
19950 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
19960 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
19970 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
19980 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
19990 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
199a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
199b0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
199c0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
199d0 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
199e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
199f0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
19a00 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
19a10 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
19a20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
19a30 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
19a40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
19a50 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
19a60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
19a70 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
19a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19a90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19aa0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
19ab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
19ac0 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
19ad0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
19ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19af0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
19b00 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
19b10 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
19b20 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
19b30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
19b40 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
19b50 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
19b60 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
19b70 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
19b80 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19b90 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
19ba0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
19bb0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
19bc0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
19bd0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
19be0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
19bf0 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
19c00 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
19c10 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
19c20 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
19c30 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
19c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c50 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19c60 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
19c70 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
19c80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
19c90 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
19ca0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
19cb0 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
19cc0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
19cd0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
19ce0 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
19cf0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19d00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19d10 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19d20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19d30 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
19d40 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
19d50 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
19d60 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
19d70 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
19d80 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
19d90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19da0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
19db0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
19dc0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
19dd0 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
19de0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
19df0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19e00 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
19e10 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19e20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
19e30 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
19e40 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19e50 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
19e60 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
19e70 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
19e80 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19e90 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19ea0 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
19eb0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
19ec0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
19ed0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
19ee0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
19ef0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19f00 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
19f10 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
19f20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
19f30 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
19f40 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
19f50 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
19f60 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
19f70 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
19f80 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
19f90 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
19fa0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
19fb0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
19fc0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
19fd0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
19fe0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
19ff0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1a000 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1a010 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1a020 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1a030 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1a040 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1a050 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1a060 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1a070 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1a080 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1a090 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1a0a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a0b0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1a0c0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1a0d0 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1a0e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1a0f0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1a100 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1a110 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1a120 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1a130 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1a140 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1a150 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1a160 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1a170 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a180 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1a190 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1a1a0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1a1b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a1c0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1a1d0 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1a1e0 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1a1f0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1a200 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1a210 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1a220 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1a230 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a240 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1a250 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a260 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1a270 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1a280 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a290 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1a2a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a2c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1a2d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a2e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a2f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1a300 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1a310 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1a320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1a330 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1a340 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1a350 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1a360 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1a370 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
1a380 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
1a390 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a3a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1a3b0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
1a3c0 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  RVED;.      if( 
1a3d0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1a3e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1a3f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1a400 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1a410 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a420 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1a450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1a460 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
1a470 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
1a480 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
1a490 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1a4a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a4b0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1a4c0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a4d0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  le.           &&
1a4e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a4f0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1a500 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
1a510 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a520 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1a530 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ger);.    }.  }e
1a540 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1a550 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1a560 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a570 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1a580 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1a590 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1a5a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1a5b0 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
1a5c0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1a5d0 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1a5e0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1a5f0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1a600 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1a610 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1a620 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1a630 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1a640 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1a650 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1a660 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
1a670 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1a680 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
1a690 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
1a6a0 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
1a6b0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
1a6c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1a6d0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1a6e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1a6f0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1a700 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a710 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1a720 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1a730 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1a740 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50  ager, 0);.    pP
1a750 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1a760 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1a770 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e  Create( pPager->
1a780 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  dbSize );.    if
1a790 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( !pPager->pInJo
1a7a0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1a7b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1a7c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a7d0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1a7e0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1a7f0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1a800 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1a810 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1a820 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1a830 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1a840 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1a850 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1a860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1a870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a880 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1a890 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1a8a0 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1a8b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1a8c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1a8d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1a8e0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1a8f0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1a900 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1a910 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1a920 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1a930 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1a940 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1a950 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1a960 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1a970 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1a980 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1a990 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1a9a0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1a9b0 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1a9c0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1a9d0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1a9e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1a9f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1aa00 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1aa10 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1aa20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1aa30 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1aa40 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1aa50 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1aa60 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1aa70 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1aa80 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1aa90 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1aaa0 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1aab0 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1aac0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1aad0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1aae0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1aaf0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1ab00 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1ab10 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1ab20 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1ab30 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1ab40 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1ab50 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1ab60 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1ab70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ab80 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1ab90 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1aba0 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1abb0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1abc0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1abd0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1abe0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1abf0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1ac00 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1ac10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ac20 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1ac30 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1ac40 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1ac50 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1ac60 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1ac70 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1ac80 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1ac90 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1aca0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1acb0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1acc0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1acd0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1ace0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1acf0 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65  his page was pre
1ad00 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64  viously acquired
1ad10 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1ad20 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20  =1, that means. 
1ad30 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65   ** we didn't re
1ad40 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65  ally read in the
1ad50 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1ad60 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20  page.  This can 
1ad70 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72  happen.  ** (for
1ad80 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74   example) when t
1ad90 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
1ada0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
1adb0 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a  eelist.  But.  *
1adc0 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65  * now we are (pe
1add0 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68  rhaps) moving th
1ade0 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68  e page off of th
1adf0 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20  e freelist for. 
1ae00 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65   ** reuse and we
1ae10 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74   need to know it
1ae20 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  s original conte
1ae30 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65  nt so that conte
1ae40 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73  nt.  ** can be s
1ae50 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  tored in the rol
1ae60 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
1ae70 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61  So do the read a
1ae80 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65  t this.  ** time
1ae90 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1aea0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1aeb0 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pPg);.  if( rc )
1aec0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1aed0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
1aee0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
1aef0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
1af00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1af10 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1af20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
1af30 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
1af40 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
1af50 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1af60 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
1af70 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
1af80 6e 61 6c 28 70 50 67 29 20 26 26 20 28 70 61 67  nal(pPg) && (pag
1af90 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67  eInStatement(pPg
1afa0 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ) || pPager->stm
1afb0 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
1afc0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1afd0 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50  ache = 1;.    pP
1afe0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
1aff0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
1b000 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
1b010 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
1b020 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1b030 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
1b040 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
1b050 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b060 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
1b070 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
1b080 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
1b090 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b0a0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
1b0b0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
1b0c0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1b0d0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
1b0e0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
1b0f0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
1b100 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1b110 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b120 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1b130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b140 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
1b150 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b180 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1b190 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1b1a0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1b1b0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1b1c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1b1d0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1b1e0 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  l.          && p
1b1f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
1b200 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de!=PAGER_JOURNA
1b210 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20  LMODE_OFF ){.   
1b220 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
1b230 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
1b240 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1b250 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1b260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1b270 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
1b280 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70  Cache = 1;.    p
1b290 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1b2a0 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a  d = 1;.  .    /*
1b2b0 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1b2c0 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69   journal now exi
1b2d0 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20  sts and we have 
1b2e0 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e  a RESERVED or an
1b2f0 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  .    ** EXCLUSIV
1b300 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61  E lock on the ma
1b310 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1b320 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72  .  Write the cur
1b330 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20  rent page to.   
1b340 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74   ** the transact
1b350 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69  ion journal if i
1b360 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
1b370 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
1b380 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a 6f     if( !pageInJo
1b390 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 70 50  urnal(pPg) && pP
1b3a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b3b0 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  n ){.      if( p
1b3c0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1b3d0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1b3e0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1b3f0 6d 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  m;.        char 
1b400 2a 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20  *pData2;..      
1b410 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
1b420 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
1b430 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1b440 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
1b450 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
1b460 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
1b470 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
1b480 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
1b490 69 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ies.        ** t
1b4a0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a  hat we do not. *
1b4b0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
1b4c0 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47  ( pPg->pgno!=PAG
1b4d0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1b4e0 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  r) );.        pD
1b4f0 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1b500 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1b510 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1b520 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
1b530 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
1b540 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
1b550 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1b560 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
1b570 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
1b580 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e  nalOff, pPg->pgn
1b590 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1b5a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1b5b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1b5c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1b5d0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
1b5e0 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1b5f0 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Size,.          
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b620 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
1b630 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b640 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
1b650 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 3b  ger->pageSize+4;
1b660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b670 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b690 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
1b6a0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
1b6b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b6c0 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  ff, cksum);.    
1b6d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1b6e0 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20  urnalOff += 4;. 
1b6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b700 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1b710 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1b720 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1b730 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20  gno, .          
1b740 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
1b750 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67 65  ournalOff, pPage
1b760 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
1b770 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43         PAGER_INC
1b780 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1b790 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20  writej_count);. 
1b7a0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1b7b0 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E5("JOURNAL %d p
1b7c0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
1b7d0 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
1b7e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 50  ,.             P
1b7f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1b800 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
1b810 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
1b820 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1b830 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61 67  _SYNC)?1:0), pag
1b840 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1b850 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41  );..        /* A
1b860 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
1b870 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74  red writing to t
1b880 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1b890 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
1b8a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
1b8b0 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
1b8c0 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
1b8d0 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
1b8e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b8f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b900 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b910 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1b920 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1b930 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  c++;.        ass
1b940 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1b950 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
1b960 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
1b970 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1b980 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
1b990 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
1b9a0 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  f( !pPager->noSy
1b9b0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
1b9c0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1b9d0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20  HDR_NEED_SYNC;. 
1b9e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b9f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1ba00 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1ba10 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
1ba20 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1ba30 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
1ba40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ba50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ba60 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1ba70 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
1ba80 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1ba90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
1baa0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
1bab0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
1bac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1bad0 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
1bae0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
1baf0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1bb10 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1bb20 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
1bb30 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
1bb40 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1bb50 53 59 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20 20  SYNC)?1:0));.   
1bb60 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1bb70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1bb80 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
1bb90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
1bba0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1bbb0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1bbc0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
1bbd0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
1bbe0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
1bbf0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
1bc00 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
1bc10 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1bc20 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
1bc30 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
1bc40 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
1bc50 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1bc60 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
1bc70 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
1bc80 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
1bc90 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
1bca0 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
1bcb0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
1bcc0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
1bcd0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1bce0 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20  >stmtInUse .    
1bcf0 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1bd00 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20  ment(pPg) .     
1bd10 26 26 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  && pPg->pgno<=pP
1bd20 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
1bd30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36 34      ){.      i64
1bd40 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1bd50 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
1bd60 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1bd70 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1bd80 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1bd90 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1bda0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1bdb0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
1bdc0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
1bdd0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1bde0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1bdf0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
1be00 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74  2bits(pPager->st
1be10 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
1be20 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
1be30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1be40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1be50 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1be60 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1be70 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1be80 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1be90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bea0 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
1beb0 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1bec0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1bed0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1bee0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1bef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bf00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1bf10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1bf20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1bf30 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
1bf40 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53  rt( pPager->pInS
1bf50 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1bf60 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1bf70 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
1bf80 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1bf90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
1bfa0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
1bfb0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
1bfc0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
1bfd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1bfe0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1bff0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1c000 62 53 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20  bSize<pPg->pgno 
1c010 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1c020 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
1c030 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
1c040 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 50 41 47 45  r->dbSize==(PAGE
1c050 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1c060 29 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 70 50  )-1) ){.      pP
1c070 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
1c080 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1c090 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c0a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1c0b0 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20   used to mark a 
1c0c0 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69  data-page as wri
1c0d0 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a  table. It uses .
1c0e0 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  ** pager_write()
1c0f0 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e   to open a journ
1c100 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69  al file (if it i
1c110 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1c120 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  en).** and write
1c130 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61   the page *pData
1c140 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1c150 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
1c160 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1c170 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
1c180 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
1c190 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
1c1a0 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
1c1b0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
1c1c0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
1c1d0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
1c1e0 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
1c1f0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
1c200 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
1c210 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
1c220 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
1c230 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1c240 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
1c250 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1c260 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1c270 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
1c280 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
1c290 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c2a0 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
1c2b0 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
1c2c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1c2d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
1c2e0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
1c2f0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
1c300 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
1c310 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
1c320 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31  nPagePerSector>1
1c330 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61   ){.    Pgno nPa
1c340 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  geCount;        
1c350 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
1c360 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1c370 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1c380 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20     Pgno pg1;    
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3a0 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  First page of th
1c3b0 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1c3c0 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20  located on. */. 
1c3d0 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20     int nPage;   
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c3f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1c400 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20  starting at pg1 
1c410 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  to journal */.  
1c420 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
1c430 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
1c440 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1c450 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
1c460 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
1c470 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
1c480 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
1c490 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
1c4a0 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
1c4b0 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
1c4c0 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
1c4d0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
1c4e0 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
1c4f0 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
1c500 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53  ( pPager->doNotS
1c510 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ync==0 );.    pP
1c520 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20  ager->doNotSync 
1c530 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  = 1;..    /* Thi
1c540 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20  s trick assumes 
1c550 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61  that both the pa
1c560 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74  ge-size and sect
1c570 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20  or-size are.    
1c580 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f  ** an integer po
1c590 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74  wer of 2. It set
1c5a0 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74  s variable pg1 t
1c5b0 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  o the identifier
1c5c0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  .    ** of the f
1c5d0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1c5e0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1c5f0 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a  ocated on..    *
1c600 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50  /.    pg1 = ((pP
1c610 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e  g->pgno-1) & ~(n
1c620 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1c630 29 20 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69  ) + 1;..    sqli
1c640 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1c650 74 28 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  t(pPager, (int *
1c660 29 26 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20  )&nPageCount);. 
1c670 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
1c680 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1c690 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50       nPage = (pP
1c6a0 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31  g->pgno - pg1)+1
1c6b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c6c0 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63  (pg1+nPagePerSec
1c6d0 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e  tor-1)>nPageCoun
1c6e0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1c6f0 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d   = nPageCount+1-
1c700 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pg1;.    }else{.
1c710 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50        nPage = nP
1c720 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20  agePerSector;.  
1c730 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e    }.    assert(n
1c740 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73  Page>0);.    ass
1c750 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67  ert(pg1<=pPg->pg
1c760 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  no);.    assert(
1c770 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d  (pg1+nPage)>pPg-
1c780 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72  >pgno);..    for
1c790 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20  (ii=0; ii<nPage 
1c7a0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1c7b0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50  ; ii++){.      P
1c7c0 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b  gno pg = pg1+ii;
1c7d0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
1c7e0 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  age;.      if( p
1c7f0 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20  g==pPg->pgno || 
1c800 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  !sqlite3BitvecTe
1c810 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
1c820 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20  urnal, pg) ){.  
1c830 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
1c840 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1c850 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1c860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c870 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
1c880 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20  , &pPage);.     
1c890 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c8a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c8b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c8c0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1c8d0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1c8e0 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
1c8f0 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 65               nee
1c910 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1c920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c930 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1c940 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1c950 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c960 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c970 20 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61   if( (pPage = pa
1c980 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1c990 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20  r, pg))!=0 ){.  
1c9a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1c9b0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
1c9c0 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20  D_SYNC ){.      
1c9d0 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
1c9e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c9f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ca00 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1ca10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ca20 20 2f 2a 20 49 66 20 74 68 65 20 50 67 48 64 72   /* If the PgHdr
1ca30 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
1ca40 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
1ca50 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
1ca60 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
1ca70 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
1ca80 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
1ca90 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
1caa0 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
1cab0 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
1cac0 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
1cad0 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
1cae0 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
1caf0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1cb00 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
1cb10 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
1cb20 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
1cb30 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
1cb40 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
1cb50 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
1cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1cb70 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
1cb80 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
1cb90 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
1cba0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  MDB && pPager->n
1cbb0 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  oSync==0 );.    
1cbc0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1cbd0 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63  Page && needSync
1cbe0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
1cbf0 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
1cc00 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1cc10 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
1cc20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
1cc30 29 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c  ) pPage->flags |
1cc40 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
1cc50 43 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  C;.        sqlit
1cc60 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
1cc70 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
1cc80 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1cc90 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1cca0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1ccb0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1ccc0 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
1ccd0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1cce0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ccf0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1cd00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
1cd10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cd20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1cd30 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
1cd40 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1cd50 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
1cd60 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
1cd70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1cd80 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
1cd90 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
1cda0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
1cdb0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
1cdc0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1cdd0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
1cde0 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1cdf0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1ce00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1ce10 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61   return pPg->fla
1ce20 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a  gs&PGHDR_DIRTY;.
1ce30 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1ce40 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1ce50 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1ce60 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
1ce70 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1ce80 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
1ce90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
1cea0 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
1ceb0 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
1cec0 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
1ced0 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
1cee0 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 54 68  ed as dirty.  Th
1cef0 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
1cf00 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a  example, when.**
1cf10 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65   the page has be
1cf20 65 6e 20 61 64 64 65 64 20 61 73 20 61 20 6c 65  en added as a le
1cf30 61 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  af of the freeli
1cf40 73 74 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a  st and so its.**
1cf50 20 63 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67   content no long
1cf60 65 72 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a  er matters..**.*
1cf70 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
1cf80 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
1cf90 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1cfa0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
1cfb0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
1cfc0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
1cfd0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
1cfe0 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
1cff0 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
1d000 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
1d010 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
1d020 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
1d030 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
1d040 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
1d050 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
1d060 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
1d070 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62  DontRollback() b
1d080 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
1d090 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
1d0a0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
1d0b0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
1d0c0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
1d0d0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
1d0e0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
1d0f0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1d100 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
1d110 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1d120 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
1d130 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
1d140 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50  alls to sqlite3P
1d150 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d160 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
1d170 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
1d180 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
1d190 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
1d1a0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
1d1b0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
1d1c0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
1d1d0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
1d1e0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1d1f0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
1d200 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1d210 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
1d220 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
1d230 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
1d240 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
1d250 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
1d260 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
1d270 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1d280 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
1d290 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
1d2a0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
1d2b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1d2c0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
1d2d0 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ed,.** the sqlit
1d2e0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d2f0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
1d300 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
1d310 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67  cause the.** pag
1d320 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69  e contains criti
1d330 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
1d340 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
1d350 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f  re it gets.** ro
1d360 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
1d370 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  te of the sqlite
1d380 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1d390 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e  ck() call..*/.in
1d3a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  t sqlite3PagerDo
1d3b0 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
1d3c0 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
1d3d0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1d3e0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1d3f0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1d400 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1d410 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  ( pPg->pgno>pPag
1d420 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1d430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d440 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1d450 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  ( pPager->pAlway
1d460 73 52 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  sRollback==0 ){.
1d470 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d480 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->pInJournal )
1d490 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
1d4a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1d4b0 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
1d4c0 61 74 65 28 70 50 61 67 65 72 2d 3e 6f 72 69 67  ate(pPager->orig
1d4d0 44 62 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  DbSize);.    if(
1d4e0 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79   !pPager->pAlway
1d4f0 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
1d500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d510 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1d520 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1d530 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1d540 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ->pAlwaysRollbac
1d550 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  k, pPg->pgno);..
1d560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d570 5f 4f 4b 20 26 26 20 28 70 50 67 2d 3e 66 6c 61  _OK && (pPg->fla
1d580 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20  gs&PGHDR_DIRTY) 
1d590 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1d5a0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1d5b0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d5c0 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1d5d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1d5e0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d  er->dbSize==pPg-
1d5f0 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
1d600 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
1d610 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
1d620 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
1d630 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
1d640 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
1d650 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
1d660 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
1d670 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
1d680 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1d690 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
1d6a0 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1d6b0 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
1d6c0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1d6d0 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
1d6e0 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
1d6f0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1d700 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
1d710 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
1d720 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
1d730 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
1d740 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
1d750 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
1d760 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
1d770 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
1d780 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d790 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
1d7a0 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
1d7b0 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
1d7c0 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
1d7d0 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
1d7e0 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
1d7f0 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
1d800 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
1d810 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
1d820 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1d830 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1d840 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1d850 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1d860 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1d870 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1d880 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1d890 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1d8a0 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e 66  o)).      pPg->f
1d8b0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f  lags |= PGHDR_DO
1d8c0 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66  NT_WRITE;.#ifdef
1d8d0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1d8e0 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
1d8f0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1d900 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1d910 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1d920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d930 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1d940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1d950 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1d960 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1d970 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1d980 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1d990 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1d9a0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1d9b0 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1d9c0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1d9d0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1d9e0 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1d9f0 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1da00 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1da10 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1da20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  we have not yet 
1da30 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68  actually read th
1da40 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
1da50 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68  s page (if.** th
1da60 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
1da70 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68   flag is set) th
1da80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1da90 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73  acts as a promis
1daa0 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c  e.** that we wil
1dab0 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  l never need to 
1dac0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f  read the page co
1dad0 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74  ntent in the fut
1dae0 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e  ure..** so the n
1daf0 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e  eedRead flag can
1db00 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74   be cleared at t
1db10 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f  his point..*/.vo
1db20 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1db30 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
1db40 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
1db50 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1db60 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65  >pPager;..  asse
1db70 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1db80 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1db90 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  D );..  /* If th
1dba0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1dbb0 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44  s not open, or D
1dbc0 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62  ontWrite() has b
1dbd0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20  een called on.  
1dbe0 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28 44 6f  ** this page (Do
1dbf0 6e 74 57 72 69 74 65 28 29 20 73 65 74 73 20 74  ntWrite() sets t
1dc00 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
1dc10 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68  k flag), then th
1dc20 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1dc30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1dc40 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1dc50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a  journalOpen==0 .
1dc60 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74     || sqlite3Bit
1dc70 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
1dc80 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c  pAlwaysRollback,
1dc90 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c   pPg->pgno).   |
1dca0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
1dcb0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 0a 20  er->origDbSize. 
1dcc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1dcd0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1dce0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
1dcf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 69  .  if( sqlite3Bi
1dd00 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
1dd10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
1dd20 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20 20 20 7c 7c  ->pgno)!=0.   ||
1dd30 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65   pPg->pgno>pPage
1dd40 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
1dd50 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1dd60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
1dd70 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 69   SECURE_DELETE i
1dd80 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1dd90 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
1dda0 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
1ddb0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63  routine can be c
1ddc0 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65 20  alled on a page 
1ddd0 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74 65  for which sqlite
1dde0 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
1ddf0 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62  ).  ** has not b
1de00 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 63  een previously c
1de10 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65  alled during the
1de20 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1de30 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 44  n..  ** And if D
1de40 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 70  ontWrite() has p
1de50 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20 63  reviously been c
1de60 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f  alled, the follo
1de70 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74  wing.  ** condit
1de80 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
1de90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74  ..  **.  ** (Lat
1dea0 65 72 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e 20  er:)  Not true. 
1deb0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1dec0 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 62 79   is corrupted by
1ded0 20 68 61 76 69 6e 67 20 64 75 70 6c 69 63 61 74   having duplicat
1dee0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20  e.  ** pages on 
1def0 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 65 78  the freelist (ex
1df00 3a 20 63 6f 72 72 75 70 74 39 2e 74 65 73 74 29  : corrupt9.test)
1df10 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1df20 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20  ing is not.  ** 
1df30 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75 65  necessarily true
1df40 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65  :.  */.  /* asse
1df50 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  rt( !pPg->inJour
1df60 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
1df70 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1df80 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 20 2a  >origDbSize ); *
1df90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
1dfa0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21  ger->pInJournal!
1dfb0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
1dfc0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
1dfd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67  >pInJournal, pPg
1dfe0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e  ->pgno);.  pPg->
1dff0 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
1e000 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 69 66 28  NEED_READ;.  if(
1e010 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1e020 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  se ){.    assert
1e030 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  ( pPager->stmtSi
1e040 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ze >= pPager->or
1e050 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1e060 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
1e070 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74  (pPager->pInStmt
1e080 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1e090 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28  }.  PAGERTRACE3(
1e0a0 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70  "DONT_ROLLBACK p
1e0b0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1e0c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1e0d0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e0e0 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47  IOTRACE(("GARBAG
1e0f0 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
1e100 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1e110 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
1e120 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e130 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
1e140 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e150 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
1e160 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
1e170 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
1e180 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
1e190 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
1e1a0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
1e1b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
1e1c0 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50  t isDirect){.  P
1e1d0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1e1e0 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1e1f0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1e200 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 6e 64  QLITE_OK;..#ifnd
1e210 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1e220 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20  _ATOMIC_WRITE.  
1e230 61 73 73 65 72 74 28 20 69 73 44 69 72 65 63 74  assert( isDirect
1e240 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44 69 72  ==0 );  /* isDir
1e250 65 63 74 20 69 73 20 6f 6e 6c 79 20 74 72 75 65  ect is only true
1e260 20 66 6f 72 20 61 74 6f 6d 69 63 20 77 72 69 74   for atomic writ
1e270 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  es */.#endif.  i
1e280 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1e290 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1e2a0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1e2b0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1e2c0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1e2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e2e0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1e2f0 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1e300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e310 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
1e320 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65 63      if( !isDirec
1e330 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
1e340 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e350 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20  e(pPgHdr);.     
1e360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
1e380 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e390 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20 20  pPgHdr);.       
1e3a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e3b0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e3c0 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
1e3d0 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20  value just read 
1e3e0 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63  and write it bac
1e3f0 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f  k to byte 24. */
1e400 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
1e410 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ter = sqlite3Get
1e420 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67 65  4byte((u8*)pPage
1e430 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b 0a  r->dbFileVers);.
1e440 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1e450 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1e460 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67 48  its(((char*)pPgH
1e470 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20 63  dr->pData)+24, c
1e480 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1e490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1e4a0 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
1e4b0 54 45 0a 20 20 20 20 69 66 28 20 69 73 44 69 72  TE.    if( isDir
1e4c0 65 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66  ect && pPager->f
1e4d0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  d->pMethods ){. 
1e4e0 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
1e4f0 2a 7a 42 75 66 20 3d 20 70 50 67 48 64 72 2d 3e  *zBuf = pPgHdr->
1e500 70 44 61 74 61 3b 0a 20 20 20 20 20 20 72 63 20  pData;.      rc 
1e510 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1e520 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
1e530 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
1e540 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23  ize, 0);.    }.#
1e550 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
1e560 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1e570 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
1e580 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e590 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
1e5a0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
1e5b0 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
1e5c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e5d0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1e5e0 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
1e5f0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
1e600 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
1e610 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1e620 74 20 72 63 3b 0a 20 20 69 66 28 20 4d 45 4d 44  t rc;.  if( MEMD
1e630 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  B ){.    rc = SQ
1e640 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1e650 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1e660 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1e670 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1e680 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
1e690 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e6a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1e6b0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1e6c0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1e6d0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1e6e0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1e6f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1e700 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1e710 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1e720 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1e730 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1e740 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1e750 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1e760 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1e770 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1e780 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1e790 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1e7a0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1e7b0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1e7c0 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1e7d0 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1e7e0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1e7f0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1e800 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1e810 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1e820 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1e830 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1e840 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1e850 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1e860 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1e870 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1e880 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1e890 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1e8a0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1e8b0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1e8c0 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1e8d0 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1e8e0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1e8f0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1e900 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1e910 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1e920 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1e930 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1e940 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1e950 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1e960 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1e970 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1e980 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1e990 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1e9a0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1e9b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6e 61  *.** If the fina
1e9c0 6c 20 70 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f  l parameter - no
1e9d0 53 79 6e 63 20 2d 20 69 73 20 74 72 75 65 2c 20  Sync - is true, 
1e9e0 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  then the databas
1e9f0 65 20 66 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a  e file itself.**
1ea00 20 69 73 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20   is not synced. 
1ea10 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
1ea20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1ea30 72 53 79 6e 63 28 29 20 64 69 72 65 63 74 6c 79  rSync() directly
1ea40 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20   to.** sync the 
1ea50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
1ea60 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d  fore calling Com
1ea70 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 74 6f  mitPhaseTwo() to
1ea80 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a   delete the.** j
1ea90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74  ournal file in t
1eaa0 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74  his case..*/.int
1eab0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1eac0 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a 20 20 50  mitPhaseOne(.  P
1ead0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
1eae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1eaf0 73 74 65 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54  ster, .  Pgno nT
1eb00 72 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79  runc,.  int noSy
1eb10 6e 63 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  nc.){.  int rc =
1eb20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
1eb30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1eb40 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1eb50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1eb60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
1eb70 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
1eb80 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
1eb90 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
1eba0 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
1ebb0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1ebc0 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
1ebd0 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
1ebe0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1ebf0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1ec00 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
1ec10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
1ec20 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
1ec30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ec40 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1ec50 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
1ec60 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1ec70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1ec80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
1ec90 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
1eca0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
1ecb0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
1ecc0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
1ecd0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
1ece0 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
1ecf0 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
1ed00 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1ed10 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
1ed20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
1ed30 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
1ed40 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1ed50 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1ed60 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
1ed70 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1ed80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1ed90 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
1eda0 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
1edb0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1edc0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1edd0 50 67 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg;..#ifdef SQLI
1ede0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
1edf0 5f 57 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68  _WRITE.    /* Th
1ee00 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
1ee10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20  ptimization can 
1ee20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f  be used if all o
1ee30 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c  f the.    ** fol
1ee40 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
1ee50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1ee60 20 20 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73    + The file-sys
1ee70 74 65 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65  tem supports the
1ee80 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
1ee90 6f 70 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a  operty for.    *
1eea0 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66  *      blocks of
1eeb0 20 73 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c   size page-size,
1eec0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b   and.    **    +
1eed0 20 54 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20   This commit is 
1eee0 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75  not part of a mu
1eef0 6c 74 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63  lti-file transac
1ef00 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  tion, and.    **
1ef10 20 20 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e      + Exactly on
1ef20 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1ef30 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f  modified and sto
1ef40 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
1ef50 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
1ef60 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74     ** If the opt
1ef70 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
1ef80 20 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20   used, then the 
1ef90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
1efa0 6c 20 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62  l never.    ** b
1efb0 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 74 68  e created for th
1efc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
1efd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75      */.    int u
1efe0 73 65 41 74 6f 6d 69 63 57 72 69 74 65 3b 0a 20  seAtomicWrite;. 
1eff0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1f000 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1f010 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1f020 3b 0a 20 20 20 20 75 73 65 41 74 6f 6d 69 63 57  ;.    useAtomicW
1f030 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  rite = (.       
1f040 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20   !zMaster && .  
1f050 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1f060 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20  urnalOpen &&.   
1f070 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1f080 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66  rnalOff==jrnlBuf
1f090 66 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20  ferSize(pPager) 
1f0a0 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75  && .        nTru
1f0b0 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  nc==0 && .      
1f0c0 20 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67    (pPg==0 || pPg
1f0d0 2d 3e 70 44 69 72 74 79 3d 3d 30 29 0a 20 20 20  ->pDirty==0).   
1f0e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1f0f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f100 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  pen || pPager->j
1f110 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
1f120 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1f130 46 20 29 3b 0a 20 20 20 20 69 66 28 20 75 73 65  F );.    if( use
1f140 41 74 6f 6d 69 63 57 72 69 74 65 20 29 7b 0a 20  AtomicWrite ){. 
1f150 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
1f160 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
1f170 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1f180 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
1f190 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d  offset = pPager-
1f1a0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
1f1b0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1f1c0 69 63 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ic);.      asser
1f1d0 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d  t(pPager->nRec==
1f1e0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
1f1f0 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
1f200 72 2d 3e 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  r->jfd, offset, 
1f210 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a  pPager->nRec);..
1f220 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20        /* Update 
1f230 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61 6e  the db file chan
1f240 67 65 20 63 6f 75 6e 74 65 72 2e 20 54 68 65 20  ge counter. The 
1f250 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77  following call w
1f260 69 6c 6c 20 6d 6f 64 69 66 79 0a 20 20 20 20 20  ill modify.     
1f270 20 2a 2a 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   ** the in-memor
1f280 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
1f290 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20 69 6e   of page 1 to in
1f2a0 63 6c 75 64 65 20 74 68 65 20 75 70 64 61 74 65  clude the update
1f2b0 64 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 6e 67  d.      ** chang
1f2c0 65 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68  e counter and th
1f2d0 65 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20  en write page 1 
1f2e0 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
1f2f0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1f300 2a 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  * file. Because 
1f310 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
1f320 69 74 65 20 70 72 6f 70 65 72 74 79 20 6f 66 20  ite property of 
1f330 74 68 65 20 68 6f 73 74 20 66 69 6c 65 2d 73 79  the host file-sy
1f340 73 74 65 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20  stem, .      ** 
1f350 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
1f360 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1f370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f380 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1f390 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1f3a0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20  counter(pPager, 
1f3b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1f3c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f3d0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
1f3e0 43 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  Create(pPager->j
1f3f0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
1f400 69 66 28 20 21 75 73 65 41 74 6f 6d 69 63 57 72  if( !useAtomicWr
1f410 69 74 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ite && rc==SQLIT
1f420 45 5f 4f 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20  E_OK ).#endif.. 
1f430 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65     /* If a maste
1f440 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
1f450 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ame has already 
1f460 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1f470 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
1f480 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  al file, then no
1f490 20 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65   sync is require
1f4a0 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  d. This happens 
1f4b0 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a  when it is.    *
1f4c0 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20  * written, then 
1f4d0 74 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c  the process fail
1f4e0 73 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f  s to upgrade fro
1f4f0 6d 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20  m a RESERVED to 
1f500 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1f510 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65  IVE lock. The ne
1f520 78 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63  xt time the proc
1f530 65 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d  ess tries to com
1f540 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  mit the.    ** t
1f550 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d  ransaction the m
1f560 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76  -j name will hav
1f570 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  e already been w
1f580 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
1f590 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1f5a0 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  setMaster ){.   
1f5b0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
1f5c0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1f5d0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
1f5e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f5f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1f600 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 69 66 28  _exit;.      if(
1f610 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f620 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1f630 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 23  NALMODE_OFF ){.#
1f640 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f650 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f660 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1f670 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1f680 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
1f690 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
1f6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
1f6b0 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
1f6c0 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 20 20  pages.          
1f6d0 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72 64  ** being discard
1f6e0 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63 61  ed by the trunca
1f6f0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69  tion must be wri
1f700 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1f710 6e 61 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nal.          **
1f720 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 20   file..         
1f730 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 50 67   */.          Pg
1f740 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  no i;.          
1f750 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41 47  Pgno iSkip = PAG
1f760 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
1f770 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  r);.          fo
1f780 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
1f790 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1f7a0 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
1f7b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
1f7c0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
1f7d0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1f7e0 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b  al, i) && i!=iSk
1f7f0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
1f800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f810 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1f820 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   i, &pPg);.     
1f830 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f850 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f860 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1f870 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f880 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1f890 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1f8a0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1f8c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f8d0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f8f0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
1f900 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1f910 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
1f920 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
1f930 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
1f940 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f950 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1f960 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1f970 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1f980 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1f990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1f9a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f9b0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1f9c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f9d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f9e0 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1f9f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1fa00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1fa10 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1fa20 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1fa30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fa40 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fa50 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1fa60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1fa70 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1fa80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fa90 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 73  e */.    pPg = s
1faa0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1fab0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1fac0 43 61 63 68 65 29 3b 0a 20 20 20 20 72 63 20 3d  Cache);.    rc =
1fad0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1fae0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
1faf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fb00 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
1fb10 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  t( rc!=SQLITE_IO
1fb20 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20  ERR_BLOCKED );. 
1fb30 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f       /* The erro
1fb40 72 20 6d 69 67 68 74 20 68 61 76 65 20 6c 65 66  r might have lef
1fb50 74 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  t the dirty list
1fb60 20 61 6c 6c 20 66 6f 75 6c 65 64 20 75 70 20 68   all fouled up h
1fb70 65 72 65 2c 0a 20 20 20 20 20 20 2a 2a 20 62 75  ere,.      ** bu
1fb80 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  t that does not 
1fb90 6d 61 74 74 65 72 20 62 65 63 61 75 73 65 20 69  matter because i
1fba0 66 20 74 68 65 20 69 66 20 74 68 65 20 64 69 72  f the if the dir
1fbb0 74 79 20 6c 69 73 74 20 64 69 64 0a 20 20 20 20  ty list did.    
1fbc0 20 20 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74    ** get corrupt
1fbd0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 74 72 61  ed, then the tra
1fbe0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 72 6f  nsaction will ro
1fbf0 6c 6c 20 62 61 63 6b 20 61 6e 64 0a 20 20 20 20  ll back and.    
1fc00 20 20 2a 2a 20 64 69 73 63 61 72 64 20 74 68 65    ** discard the
1fc10 20 64 69 72 74 79 20 6c 69 73 74 2e 20 20 54 68   dirty list.  Th
1fc20 65 72 65 20 69 73 20 61 6e 20 61 73 73 65 72 74  ere is an assert
1fc30 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67   in.      ** pag
1fc40 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1fc50 5f 70 61 67 65 73 28 29 20 74 68 61 74 20 76 65  _pages() that ve
1fc60 72 69 66 69 65 73 20 74 68 61 74 20 6e 6f 20 61  rifies that no a
1fc70 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20  ttempt.      ** 
1fc80 69 73 20 6d 61 64 65 20 74 6f 20 75 73 65 20 61  is made to use a
1fc90 6e 20 69 6e 76 61 6c 69 64 20 64 69 72 74 79 20  n invalid dirty 
1fca0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  list..      */. 
1fcb0 20 20 20 20 20 67 6f 74 6f 20 73 79 6e 63 5f 65       goto sync_e
1fcc0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  xit;.    }.    s
1fcd0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
1fce0 6e 41 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43  nAll(pPager->pPC
1fcf0 61 63 68 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  ache);..    /* S
1fd00 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1fd10 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1fd20 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1fd30 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29 7b 0a  c && !noSync ){.
1fd40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fd50 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
1fd60 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
1fd70 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a  c_flags);.    }.
1fd80 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
1fd90 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
1fda0 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72  er))..    pPager
1fdb0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1fdc0 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SYNCED;.  }else 
1fdd0 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72  if( MEMDB && nTr
1fde0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  unc!=0 ){.    rc
1fdf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
1fe00 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1fe10 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79  nTrunc);.  }..sy
1fe20 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72  nc_exit:.  if( r
1fe30 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1fe40 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f  BLOCKED ){.    /
1fe50 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  * pager_incr_cha
1fe60 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79  ngecounter() may
1fe70 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61   attempt to obta
1fe80 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a  in an exclusive.
1fe90 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73       * lock to s
1fea0 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61  pill the cache a
1feb0 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f  nd return IOERR_
1fec0 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e  BLOCKED. But sin
1fed0 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65  ce .     * there
1fee0 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68   is no chance th
1fef0 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e  e cache is incon
1ff00 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73 0a 20  sistent, it is. 
1ff10 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
1ff20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1ff30 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
1ff40 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ff50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ff60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
1ff70 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
1ff80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ff90 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
1ffa0 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
1ffb0 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
1ffc0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
1ffd0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
1ffe0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1fff0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
20000 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20010 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
20020 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
20030 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20040 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20050 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20060 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
20070 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
20080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
20090 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
200a0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
200b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
200c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
200d0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
200e0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
200f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
20100 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
20110 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
20120 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
20130 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
20140 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
20150 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
20160 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
20170 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
20180 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
20190 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
201a0 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
201b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
201c0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
201d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
201e0 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  }.  PAGERTRACE2(
201f0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
20200 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20210 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20220 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
20230 53 59 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SYNCED || MEMDB 
20240 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
20250 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
20260 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20270 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
20280 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
20290 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
202a0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
202b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
202c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
202d0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
202e0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
202f0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
20300 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
20310 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
20320 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
20330 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
20340 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
20350 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
20360 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
20370 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20380 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
20390 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
203a0 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
203b0 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
203c0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
203d0 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
203e0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
203f0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
20400 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
20410 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
20420 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
20430 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
20440 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
20450 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
20460 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
20470 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
20480 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
20490 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
204a0 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
204b0 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
204c0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
204d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
204e0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
204f0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
20500 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20510 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
20520 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
20530 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
20540 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
20550 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
20560 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
20570 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
20580 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
20590 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ion(pPager, pPag
205a0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a  er->setMaster);.
205b0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
205c0 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
205d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
205e0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
205f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
20600 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
20610 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
20620 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
20630 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
20640 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
20650 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
20660 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
20670 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
20680 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
20690 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 20    int rc2;.     
206a0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
206b0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
206c0 0a 20 20 20 20 20 20 72 63 32 20 3d 20 70 61 67  .      rc2 = pag
206d0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
206e0 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  on(pPager, pPage
206f0 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20  r->setMaster);. 
20700 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
20710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20720 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
20730 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
20740 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
20750 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
20760 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
20770 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
20780 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
20790 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20  zeValid = 0;.   
207a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
207b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
207c0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
207d0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
207e0 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
207f0 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
20800 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72  So call pager_er
20810 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79  ror() on the way
20820 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79   out to make any
20830 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20 70   error .    ** p
20840 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20 2a  ersistent..    *
20850 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
20860 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
20870 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
20880 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
20890 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
208a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
208b0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
208c0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
208d0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
208e0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
208f0 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
20900 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20910 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65  rIsreadonly(Page
20920 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20930 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61  turn pPager->rea
20940 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dOnly;.}../*.** 
20950 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
20960 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20970 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f  to the pager..*/
20980 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20990 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20  rRefcount(Pager 
209a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
209b0 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  rn sqlite3Pcache
209c0 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d  RefCount(pPager-
209d0 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f 2a  >pPCache);.}../*
209e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
209f0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
20a00 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63 69  ces to the speci
20a10 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e  fied page..*/.in
20a20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
20a30 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61 67  geRefcount(DbPag
20a40 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
20a50 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
20a60 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 50  ePageRefcount(pP
20a70 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  age);.}..#ifdef 
20a80 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
20a90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
20aa0 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
20ab0 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
20ac0 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71  only..*/.int *sq
20ad0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
20ae0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20af0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
20b00 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71 6c  1];.  a[0] = sql
20b10 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
20b20 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
20b30 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73 71  he);.  a[1] = sq
20b40 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
20b50 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
20b60 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d 20  ache);.  a[2] = 
20b70 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65 74  sqlite3PcacheGet
20b80 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72  Cachesize(pPager
20b90 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
20ba0 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
20bb0 69 7a 65 56 61 6c 69 64 20 3f 20 28 69 6e 74 29  izeValid ? (int)
20bc0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
20bd0 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  : -1;.  a[4] = p
20be0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
20bf0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
20c00 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
20c10 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
20c20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
20c30 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
20c40 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
20c50 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
20c60 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
20c70 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
20c80 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
20c90 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
20ca0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
20cb0 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
20cc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20cd0 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e  urn MEMDB;.}.#en
20ce0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
20cf0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
20d00 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
20d10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20d20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
20d30 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
20d40 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
20d50 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
20d60 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
20d70 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
20d80 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
20d90 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
20da0 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
20db0 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
20dc0 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
20dd0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
20de0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20df0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
20e00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20e10 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
20e20 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
20e30 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
20e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20e50 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
20e60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20e70 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b  ->dbSizeValid );
20e80 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
20e90 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
20ea0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20eb0 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
20ec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
20ed0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
20ee0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
20ef0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20f00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
20f10 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
20f20 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73  nalOpen );.  ass
20f30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
20f40 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61  Stmt==0 );.  pPa
20f50 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73  ger->pInStmt = s
20f60 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
20f70 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
20f80 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
20f90 2d 3e 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->pInStmt==0 ){.
20fa0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
20fb0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
20fc0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
20fd0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
20fe0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
20ff0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
21000 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ze = pPager->jou
21010 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
21020 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
21030 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
21040 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
21050 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
21060 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50  ->stmtCksum = pP
21070 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b  ager->cksumInit;
21080 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
21090 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
210a0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
210b0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
210c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
210d0 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y ){.      sqlit
210e0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
210f0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
21100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21110 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
21120 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
21130 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  r, pPager->stfd,
21140 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
21150 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20  JOURNAL);.      
21160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
21170 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69    goto stmt_begi
21180 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  n_failed;.      
21190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
211a0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
211b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
211c0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
211d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
211e0 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
211f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
21200 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
21210 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
21220 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  pInStmt ){.    s
21230 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
21240 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
21250 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
21260 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
21270 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21280 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
21290 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
212a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
212b0 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 70 61 67  t rc;.  rc = pag
212c0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
212d0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
212e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
212f0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
21300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21310 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
21320 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
21330 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
21340 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
21350 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
21360 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
21370 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
21380 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
21390 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
213a0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
213b0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
213c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
213d0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
213e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
213f0 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  e = 0;.    if( s
21400 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e  qlite3IsMemJourn
21410 61 6c 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  al(pPager->stfd)
21420 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21430 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
21440 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
21450 20 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72    }.  }.  pPager
21460 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
21470 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
21480 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
21490 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
214a0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
214b0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
214c0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
214d0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
214e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
214f0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21500 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
21510 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
21520 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21530 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  ));.    rc = pag
21540 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
21550 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71  (pPager);.    sq
21560 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
21570 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
21580 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
21590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
215a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
215b0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
215c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
215d0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
215e0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
215f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21600 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
21610 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
21620 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
21630 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
21640 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
21650 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21660 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
21670 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
21680 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
21690 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
216a0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
216b0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
216c0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
216d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
216e0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
216f0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
21700 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
21710 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
21720 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
21730 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
21740 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
21750 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
21760 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
21770 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
21780 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
21790 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
217a0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
217b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
217c0 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
217d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
217e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
217f0 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
21800 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21810 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21820 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
21830 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21840 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
21850 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
21860 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21870 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
21880 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
21890 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
218a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
218b0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
218c0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
218d0 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
218e0 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
218f0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
21900 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
21910 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
21920 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
21930 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21940 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
21950 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21960 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
21970 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
21980 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
21990 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
219a0 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
219b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
219c0 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
219d0 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
219e0 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
219f0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
21a00 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
21a10 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
21a20 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
21a30 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
21a40 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
21a50 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
21a60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
21a80 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
21a90 61 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74  age pPg to locat
21aa0 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
21ab0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  file..**.** Ther
21ac0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
21ad0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
21ae0 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
21af0 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e  ocated at.** pgn
21b00 6f 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c  o (which we call
21b10 20 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20   pPgOld) though 
21b20 74 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c  that page is all
21b30 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e  owed to be.** in
21b40 20 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20   cache.  If the 
21b50 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20  page previously 
21b60 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20  located at pgno 
21b70 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
21b80 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  * in the rollbac
21b90 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73  k journal, it is
21ba0 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62   not put there b
21bb0 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  y by this routin
21bc0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
21bd0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
21be0 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  pPg remain valid
21bf0 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
21c00 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
21c10 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20  ciated with pPg 
21c20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
21c30 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
21c40 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
21c50 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
21c60 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
21c70 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
21c80 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
21c90 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
21ca0 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
21cb0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
21cc0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
21cd0 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
21ce0 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
21cf0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21d00 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
21d10 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
21d20 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
21d30 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
21d40 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
21d50 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
21d60 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
21d70 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
21d80 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a  is active)..**.*
21d90 2a 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20  * If the fourth 
21da0 61 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d  argument, isComm
21db0 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  it, is non-zero,
21dc0 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
21dd0 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65  is being.** move
21de0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64  d as part of a d
21df0 61 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69  atabase reorgani
21e00 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f  zation just befo
21e10 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
21e20 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20  on .** is being 
21e30 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68  committed. In th
21e40 69 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67  is case, it is g
21e50 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
21e60 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
21e70 20 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20   .** pPg refers 
21e80 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77  to will not be w
21e90 72 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20  ritten to again 
21ea0 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e  within this tran
21eb0 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
21ec0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
21ed0 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
21ee0 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
21ef0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20   Pgno pgno, int 
21f00 69 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48  isCommit){.  PgH
21f10 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20  dr *pPgOld;  /* 
21f20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f  The page being o
21f30 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20  verwritten. */. 
21f40 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67   Pgno needSyncPg
21f50 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
21f60 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
21f70 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
21f80 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
21f90 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
21fa0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
21fb0 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
21fc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
21fd0 6f 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50  o, (pPg->flags&P
21fe0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
21ff0 31 3a 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f  1:0, pgno);.  IO
22000 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
22010 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
22020 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
22030 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74  o))..  pager_get
22040 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a  _content(pPg);..
22050 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
22060 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nal needs to be 
22070 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
22080 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63  page pPg->pgno c
22090 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74  an.  ** be writt
220a0 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67  en to, store pPg
220b0 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20  ->pgno in local 
220c0 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e  variable needSyn
220d0 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  cPgno..  **.  **
220e0 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74   If the isCommit
220f0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
22100 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
22110 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
22120 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
22130 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
22140 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
22150 61 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e  abase page pPg->
22160 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62  pgno .  ** can b
22170 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
22180 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
22190 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
221a0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74  t to write to it
221b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50  ..  */.  if( (pP
221c0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
221d0 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73  EED_SYNC) && !is
221e0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65  Commit ){.    ne
221f0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
22200 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
22210 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61  rt( pageInJourna
22220 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70  l(pPg) || pPg->p
22230 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
22240 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
22250 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73  sert( pPg->flags
22260 26 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a  &PGHDR_DIRTY );.
22270 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22280 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
22290 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
222a0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
222b0 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
222c0 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
222d0 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
222e0 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
222f0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
22300 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
22310 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
22320 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
22330 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
22340 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
22350 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
22360 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
22370 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
22380 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73   */.  pPg->flags
22390 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f   &= ~PGHDR_NEED_
223a0 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d  SYNC;.  pPgOld =
223b0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
223c0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
223d0 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c  ssert( !pPgOld |
223e0 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  | pPgOld->nRef==
223f0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  1 );.  if( pPgOl
22400 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c  d ){.    pPg->fl
22410 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e  ags |= (pPgOld->
22420 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
22430 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73  _SYNC);.  }..  s
22440 71 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65  qlite3PcacheMove
22450 28 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  (pPg, pgno);.  i
22460 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
22470 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72   sqlite3PcacheDr
22480 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a  op(pPgOld);.  }.
22490 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
224a0 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
224b0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
224c0 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67  ache = 1;.  pPag
224d0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
224e0 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
224f0 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
22500 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
22510 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
22520 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
22530 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
22540 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
22550 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
22560 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
22570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
22580 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
22590 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
225a0 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
225b0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
225c0 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
225d0 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
225e0 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
225f0 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
22600 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
22610 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
22620 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
22630 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
22640 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
22650 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
22660 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
22670 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
22680 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
22690 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
226a0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
226b0 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
226c0 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
226d0 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
226e0 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
226f0 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
22700 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
22710 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
22720 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
22730 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
22740 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
22750 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
22760 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
22770 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
22780 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22790 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
227a0 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
227b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
227c0 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
227d0 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
227e0 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
227f0 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
22800 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
22810 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
22820 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
22830 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
22840 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
22850 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
22860 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
22870 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
22880 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
22890 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
228a0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
228b0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
228c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
228d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
228e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
228f0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
22900 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
22910 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
22920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22930 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
22940 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
22950 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70   needSyncPgno<=p
22960 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22970 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
22980 69 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28  ite3BitvecClear(
22990 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
229a0 61 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  al, needSyncPgno
229b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
229c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
229d0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
229e0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
229f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22a00 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
22a10 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
22a20 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
22a30 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
22a40 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
22a50 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
22a60 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
22a70 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
22a80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22a90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22aa0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
22ab0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22ac0 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
22ad0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22ae0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22af0 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
22b00 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
22b10 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
22b20 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
22b30 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
22b40 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
22b50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22b60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
22b70 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
22b80 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
22b90 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
22ba0 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
22bb0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
22bc0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
22bd0 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
22be0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
22bf0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22c00 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
22c10 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e  rn (pPager?pPg->
22c20 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a  pExtra:0);.}../*
22c30 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
22c40 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
22c50 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
22c60 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
22c70 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
22c80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22c90 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
22ca0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22cb0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
22cc0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
22cd0 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
22ce0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
22cf0 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
22d00 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
22d10 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
22d20 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
22d30 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
22d40 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
22d50 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22d60 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
22d70 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22d80 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
22d90 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
22da0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
22db0 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
22dc0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
22dd0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
22de0 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
22df0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
22e00 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
22e10 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
22e20 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
22e30 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
22e40 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22e50 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
22e60 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
22e70 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22e80 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
22e90 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
22ea0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
22eb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
22ec0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22ed0 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
22ee0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22ef0 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
22f00 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
22f10 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
22f20 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
22f30 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
22f40 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20   = eMode;.  }.  
22f50 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
22f60 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
22f70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
22f80 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
22f90 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
22fa0 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
22fb0 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
22fc0 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
22fd0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
22fe0 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
22ff0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
23000 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
23010 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
23020 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
23030 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
23040 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
23050 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
23060 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  F.**.** If the p
23070 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
23080 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
23090 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
230a0 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
230b0 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
230c0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
230d0 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
230e0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
230f0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f  y updated).** jo
23100 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
23110 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
23120 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
23130 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
23140 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d  ode){.  if( !MEM
23150 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
23160 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
23170 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
23180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
23190 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
231a0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
231b0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
231c0 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
231d0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
231e0 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
231f0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
23200 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
23210 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
23220 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
23230 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23240 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
23250 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
23260 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23270 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73  MEMORY );.    as
23280 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
23290 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
232a0 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
232b0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  >=0 ){.      pPa
232c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
232d0 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65   = eMode;.    }e
232e0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
232f0 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
23300 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
23310 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Y );.    }.  }. 
23320 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
23330 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
23340 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
23350 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
23360 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
23370 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
23380 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  les..*/.i64 sqli
23390 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
233a0 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
233b0 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
233c0 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
233d0 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
233e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
233f0 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
23400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
23410 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23420 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66  Limit;.}..#endif
23430 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
23440 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.