/ Hex Artifact Content
Login

Artifact fd11076a5a2f46a831688f036f03c57bd730dff5:


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 34 39  : pager.c,v 1.49
0350: 38 20 32 30 30 38 2f 31 30 2f 31 37 20 31 38 3a  8 2008/10/17 18:
0360: 35 31 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37  51: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 33 32 20 76 66 73 46 6c 61   */.  u32 vfsFla
2040: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
2050: 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73    /* Flags for s
2060: 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
2070: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  () */.  int errC
2080: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
2090: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
20a0: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
20b0: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64  rrors */.  int d
20c0: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
20d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20e0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
20f0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
2100: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
2110: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
2120: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
2130: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2140: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2160: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2170: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2180: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2190: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
21c0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
21d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
21e0: 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20  ksumInit;       
21f0: 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d         /* Quasi-
2200: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64  random value add
2210: 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63  ed to every chec
2220: 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ksum */.  int st
2230: 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20  mtNRec;         
2240: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2250: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74  of records in st
2260: 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  mt subjournal */
2270: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20  .  int nExtra;  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2290: 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20  * Add this many 
22a0: 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e  bytes to each in
22b0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a  -memory page */.
22c0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
22f0: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
2300: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
2310: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2320: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2330: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2340: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2370: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
2380: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
2390: 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20   Pgno mxPgno;   
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b0: 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20  Maximum allowed 
23c0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
23d0: 62 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  base */.  Bitvec
23e0: 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *pInJournal;   
23f0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
2400: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
2410: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2420: 69 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ile */.  Bitvec 
2430: 2a 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *pInStmt;       
2440: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2450: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2460: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2470: 0a 20 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61  .  Bitvec *pAlwa
2480: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f  ysRollback;    /
2490: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
24a0: 63 68 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  ch page marked a
24b0: 6c 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a  lways-rollback *
24c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
24d0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
24e0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
24f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2500: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2520: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2540: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
2560: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
2570: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
2580: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c  l files */.  sql
2590: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a  ite3_file *fd, *
25a0: 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65  jfd;     /* File
25b0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
25c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
25d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74  urnal */.  sqlit
25e0: 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20 20  e3_file *stfd;  
25f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2600: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2610: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2620: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48  ournal*/.  BusyH
2630: 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
2640: 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65  dler;  /* Pointe
2650: 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79  r to sqlite.busy
2660: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 36 34  Handler */.  i64
2670: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
2690: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
26a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
26b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
26c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
26d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
26e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
26f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
2700: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
2710: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
2720: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
2730: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
2740: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
2750: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
2760: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2770: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
2780: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
2790: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
27a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
27b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
27c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
27d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
27e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
2810: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
2820: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
2830: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
2840: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
2850: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
2860: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
2870: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
2880: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
2890: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
28a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
28b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
28c0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
28d0: 44 62 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c  DbPage*); /* Cal
28e0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  l this routine w
28f0: 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61  hen reloading pa
2900: 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ges */.#ifdef SQ
2910: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
2920: 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29   void *(*xCodec)
2930: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2940: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2950: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2960: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2970: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2980: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2990: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
29a0: 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69 66  odec() */.#endif
29b0: 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61  .  char *pTmpSpa
29c0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ce;            /
29d0: 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65  * Pager.pageSize
29e0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
29f0: 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20  for tmp use */. 
2a00: 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
2a10: 5b 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  [16];        /* 
2a20: 43 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72  Changes whenever
2a30: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
2a40: 68 61 6e 67 65 73 20 2a 2f 0a 20 20 69 36 34 20  hanges */.  i64 
2a50: 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  journalSizeLimit
2a60: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
2a70: 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73  limit for persis
2a80: 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  tent journal fil
2a90: 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20 2a  es */.  PCache *
2aa0: 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  pPCache;        
2ab0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ac0: 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62 6a  o page cache obj
2ad0: 65 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ect */.};../*.**
2ae0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
2af0: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
2b00: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
2b10: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
2b20: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
2b30: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
2b40: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
2b50: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
2b60: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
2b70: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
2b80: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
2b90: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ba0: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2bb0: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
2bc0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
2bd0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
2be0: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
2bf0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c00: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2c10: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
2c20: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
2c30: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
2c40: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
2c50: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
2c60: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
2c70: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
2c80: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
2c90: 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41  l */.# define PA
2ca0: 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b  GER_INCR(v)  v++
2cb0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2cc0: 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65  PAGER_INCR(v).#e
2cd0: 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ndif..../*.** Jo
2ce0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
2cf0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
2d00: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
2d10: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
2d20: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2d30: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
2d40: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
2d50: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
2d60: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
2d70: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
2d80: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
2d90: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
2da0: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
2db0: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
2dc0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
2dd0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
2de0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
2df0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
2e00: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
2e10: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
2e20: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
2e30: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
2e40: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
2e50: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
2e60: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
2e70: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
2e80: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
2e90: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
2ea0: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
2eb0: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
2ec0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
2ed0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
2ee0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
2ef0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
2f00: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
2f10: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
2f20: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
2f30: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
2f40: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
2f50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
2f60: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
2f70: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
2f80: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
2f90: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
2fa0: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
2fb0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2fc0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
2fd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
2fe0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
2ff0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
3000: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
3010: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3020: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3030: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3040: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3050: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3060: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3070: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3080: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3090: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
30a0: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
30b0: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
30c0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
30d0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
30e0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
30f0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
3100: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
3110: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3120: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3130: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3140: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3150: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3160: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3170: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3180: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3190: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
31a0: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
31b0: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
31c0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
31d0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
31e0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
31f0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
3200: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
3210: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3220: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3230: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3240: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3250: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3260: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3270: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3280: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3290: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
32a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
32b0: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
32c0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
32d0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
32e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
32f0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3300: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3310: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3320: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3330: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3340: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3350: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3360: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3370: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3380: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3390: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
33a0: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
33b0: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
33c0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
33d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
33e0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
33f0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3400: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3410: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3420: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3430: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3440: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3450: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3460: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3470: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3480: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3490: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
34a0: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
34b0: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
34c0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
34d0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
34e0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
34f0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3500: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3510: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3520: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3530: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3540: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3550: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3560: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3570: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3580: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3590: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
35a0: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
35b0: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
35c0: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
35d0: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
35e0: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
35f0: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
3600: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
3610: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
3620: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3630: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
3640: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
3650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
3660: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
3670: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
3680: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
3690: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
36a0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
36b0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
36c0: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
36d0: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
36e0: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
36f0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
3700: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
3710: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3720: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
3730: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
3740: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
3750: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
3760: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
3770: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
3780: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
3790: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
37a0: 37 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  7../*.** Return 
37b0: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
37c0: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
37d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
37e0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
37f0: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
3800: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
3810: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
3820: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
3830: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
3840: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
3850: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
3860: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
3870: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
3880: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
3890: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
38a0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
38b0: 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  st(pPager->pInSt
38c0: 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  mt, pPg->pgno);.
38d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
38e0: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66  32-bit integer f
38f0: 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69  rom the given fi
3900: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
3910: 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65  Store the intege
3920: 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61  r.** that is rea
3930: 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74  d in *pRes.  Ret
3940: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
3950: 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b   everything work
3960: 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72  ed, or an.** err
3970: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
3980: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
3990: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65  .**.** All value
39a0: 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20  s are stored on 
39b0: 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69  disk as big-endi
39c0: 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
39d0: 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71 6c  t read32bits(sql
39e0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
39f0: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 2a  64 offset, u32 *
3a00: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
3a10: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
3a20: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
3a30: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
3a40: 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73 65  izeof(ac), offse
3a50: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
3a60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
3a70: 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47 65  pRes = sqlite3Ge
3a80: 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d 0a  t4byte(ac);.  }.
3a90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3aa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32  /*.** Write a 32
3ab0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74  -bit integer int
3ac0: 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66 65  o a string buffe
3ad0: 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20  r in big-endian 
3ae0: 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23  byte order..*/.#
3af0: 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74 73  define put32bits
3b00: 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50 75  (A,B)  sqlite3Pu
3b10: 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42 29  t4byte((u8*)A,B)
3b20: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
3b30: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
3b40: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
3b50: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
3b60: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
3b70: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
3b80: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
3b90: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
3ba0: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
3bb0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
3bc0: 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ts(sqlite3_file 
3bd0: 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c  *fd, i64 offset,
3be0: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68 61   u32 val){.  cha
3bf0: 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33 32  r ac[4];.  put32
3c00: 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a 20  bits(ac, val);. 
3c10: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
3c20: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
3c30: 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a  , offset);.}../*
3c40: 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20  .** If file pFd 
3c50: 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71  is open, call sq
3c60: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20  lite3OsUnlock() 
3c70: 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  on it..*/.static
3c80: 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71   int osUnlock(sq
3c90: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c  lite3_file *pFd,
3ca0: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
3cb0: 66 28 20 21 70 46 64 2d 3e 70 4d 65 74 68 6f 64  f( !pFd->pMethod
3cc0: 73 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  s ){.    return 
3cd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
3ce0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
3cf0: 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20 65 4c 6f  sUnlock(pFd, eLo
3d00: 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ck);.}../*.** Th
3d10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65  is function dete
3d20: 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72 20 6f  rmines whether o
3d30: 72 20 6e 6f 74 20 74 68 65 20 61 74 6f 6d 69 63  r not the atomic
3d40: 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74  -write optimizat
3d50: 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ion.** can be us
3d60: 65 64 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ed with this pag
3d70: 65 72 2e 20 54 68 65 20 6f 70 74 69 6d 69 7a 61  er. The optimiza
3d80: 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
3d90: 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20   if:.**.**  (a) 
3da0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
3db0: 65 64 20 62 79 20 4f 73 44 65 76 69 63 65 43 68  ed by OsDeviceCh
3dc0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 29 20  aracteristics() 
3dd0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 0a 2a  indicates that.*
3de0: 2a 20 20 20 20 20 20 61 20 64 61 74 61 62 61 73  *      a databas
3df0: 65 20 70 61 67 65 20 6d 61 79 20 62 65 20 77 72  e page may be wr
3e00: 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
3e10: 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29 20 74 68  , and.**  (b) th
3e20: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
3e30: 20 62 79 20 4f 73 53 65 63 74 6f 72 53 69 7a 65   by OsSectorSize
3e40: 28 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  () is less than 
3e50: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20 20 20 20  or equal.**     
3e60: 20 74 6f 20 74 68 65 20 70 61 67 65 20 73 69 7a   to the page siz
3e70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
3e80: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
3e90: 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20 69  not be used, 0 i
3ea0: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69  s returned. If i
3eb0: 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a 2a  t can be used,.*
3ec0: 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  * then the value
3ed0: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
3ee0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
3ef0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 69  rnal file when i
3f00: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72 6f  t.** contains ro
3f10: 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72 20  llback data for 
3f20: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  exactly one page
3f30: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
3f40: 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
3f50: 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69 6e  _WRITE.static in
3f60: 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  t jrnlBufferSize
3f70: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
3f80: 0a 20 20 69 6e 74 20 64 63 3b 20 20 20 20 20 20  .  int dc;      
3f90: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 63       /* Device c
3fa0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
3fb0: 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74 6f 72 3b  /.  int nSector;
3fc0: 20 20 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20        /* Sector 
3fd0: 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  size */.  int sz
3fe0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Page;        /* 
3ff0: 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 73  Page size */.  s
4000: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
4010: 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 0a 20  = pPager->fd;.. 
4020: 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64   if( fd->pMethod
4030: 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20 73 71  s ){.    dc = sq
4040: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
4050: 72 61 63 74 65 72 69 73 74 69 63 73 28 66 64 29  racteristics(fd)
4060: 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20  ;.    nSector = 
4070: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
4080: 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 73 7a 50  ize(fd);.    szP
4090: 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  age = pPager->pa
40a0: 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 61  geSize;.  }..  a
40b0: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
40c0: 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
40d0: 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65 72  12>>8));.  asser
40e0: 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
40f0: 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36  TOMIC64K==(65536
4100: 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21 66  >>8));..  if( !f
4110: 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20 0a  d->pMethods || .
4120: 20 20 20 20 20 20 20 28 64 63 20 26 20 28 53 51         (dc & (SQ
4130: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
4140: 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29 29 20 26  C|(szPage>>8)) &
4150: 26 20 6e 53 65 63 74 6f 72 3c 3d 73 7a 50 61 67  & nSector<=szPag
4160: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
4170: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
4180: 70 50 61 67 65 72 29 20 2b 20 4a 4f 55 52 4e 41  pPager) + JOURNA
4190: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
41a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
41b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
41c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
41d0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
41e0: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
41f0: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
4200: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54  pager.** code. T
4210: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4220: 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  t is a pointer t
4230: 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75  o the pager stru
4240: 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65  cture, the.** se
4250: 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63  cond the error-c
4260: 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20  ode about to be 
4270: 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61  returned by a pa
4280: 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ger API function
4290: 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  . .** The value 
42a0: 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f  returned is a co
42b0: 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64  py of the second
42c0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
42d0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
42e0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
42f0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
4300: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
4310: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
4320: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
4330: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
4340: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
4350: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
4360: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
4370: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
4380: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
4390: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
43a0: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
43b0: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
43c0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
43d0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
43e0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
43f0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
4400: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
4410: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
4420: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
4430: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
4440: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
4450: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
4460: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
4470: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
4480: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
4490: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
44a0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
44b0: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2c  t error occured,
44c0: 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61   then the rollba
44d0: 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 6e  ck journal may n
44e0: 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65 70  eed.** to be rep
44f0: 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  layed..*/.static
4500: 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f   void pager_unlo
4510: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
4520: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  );.static int pa
4530: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4540: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4550: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
4560: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
4570: 74 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  t(.       pPager
4580: 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
4590: 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
45a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
45b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20  ==SQLITE_OK ||. 
45c0: 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
45d0: 72 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d  rrCode & 0xff)==
45e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29  SQLITE_IOERR.  )
45f0: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
4600: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
4610: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
4620: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
4630: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
4640: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
4650: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
4660: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
4670: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
4680: 4f 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c  OCK .     && sql
4690: 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75  ite3PcacheRefCou
46a0: 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
46b0: 68 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20  he)==0 .    ){. 
46c0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
46d0: 61 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20  ager is already 
46e0: 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70  unlocked, call p
46f0: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f  ager_unlock() no
4700: 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c  w to.      ** cl
4710: 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ear the error st
4720: 61 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74  ate and ensure t
4730: 68 61 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  hat the pager-ca
4740: 63 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a  che is .      **
4750: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
4760: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
4770: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
4780: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
4790: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
47a0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ../*.** If SQLIT
47b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73  E_CHECK_PAGES is
47c0: 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65   defined then we
47d0: 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20   do some sanity 
47e0: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74  checking.** on t
47f0: 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61  he cache using a
4800: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20   hash function. 
4810: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f   This is used fo
4820: 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64  r testing.** and
4830: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
4840: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4850: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
4860: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
4870: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
4880: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
4890: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
48a0: 33 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  32 pager_datahas
48b0: 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73  h(int nByte, uns
48c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74  igned char *pDat
48d0: 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  a){.  u32 hash =
48e0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
48f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b  or(i=0; i<nByte;
4900: 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20   i++){.    hash 
4910: 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20  = (hash*1039) + 
4920: 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  pData[i];.  }.  
4930: 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73  return hash;.}.s
4940: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
4950: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
4960: 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e  pPage){.  return
4970: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
4980: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
4990: 61 67 65 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e  ageSize, (unsign
49a0: 65 64 20 63 68 61 72 20 2a 29 70 50 61 67 65 2d  ed char *)pPage-
49b0: 3e 70 44 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69  >pData);.}.stati
49c0: 63 20 75 33 32 20 70 61 67 65 72 5f 73 65 74 5f  c u32 pager_set_
49d0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
49e0: 70 50 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d  pPage){.  pPage-
49f0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
4a00: 72 5f 70 61 67 65 68 61 73 68 28 70 50 61 67 65  r_pagehash(pPage
4a10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
4a20: 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f  CHECK_PAGE macro
4a30: 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20   takes a PgHdr* 
4a40: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20  as an argument. 
4a50: 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  If SQLITE_CHECK_
4a60: 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69  PAGES.** is defi
4a70: 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20  ned, and NDEBUG 
4a80: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20  is not defined, 
4a90: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
4aa0: 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20  ement checks.** 
4ab0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
4ac0: 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72   either dirty or
4ad0: 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74   still matches t
4ae0: 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61  he calculated pa
4af0: 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66  ge-hash..*/.#def
4b00: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
4b10: 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73  ) checkPage(x).s
4b20: 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
4b30: 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
4b40: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
4b50: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4b60: 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d  .  assert( !pPg-
4b70: 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61  >pageHash || pPa
4b80: 67 65 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ger->errCode.   
4b90: 20 20 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67     || (pPg->flag
4ba0: 73 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c  s&PGHDR_DIRTY) |
4bb0: 7c 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d  | pPg->pageHash=
4bc0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
4bd0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
4be0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64  .#define pager_d
4bf0: 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a  atahash(X,Y)  0.
4c00: 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61  #define pager_pa
4c10: 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64 65  gehash(X)  0.#de
4c20: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
4c30: 78 29 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51  x).#endif  /* SQ
4c40: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4c50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20   */../*.** When 
4c60: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
4c70: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4c80: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
4c90: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
4ca0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
4cb0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4cc0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
4cd0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
4ce0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
4cf0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
4d00: 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  lied by the call
4d10: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  er. .**.** zMast
4d20: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
4d30: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
4d40: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
4d50: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
4d60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
4d70: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
4d80: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
4d90: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
4da0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
4db0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
4dc0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
4dd0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
4de0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
4df0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
4e00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
4e10: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
4e20: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
4e30: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
4e40: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
4e50: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
4e60: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
4e70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
4e80: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
4e90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
4ea0: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
4eb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
4ec0: 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73   is present zMas
4ed0: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
4ee0: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
4ef0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
4f00: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4f10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
4f20: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
4f30: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
4f40: 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a  , int nMaster){.
4f50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
4f60: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
4f70: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 75    u32 cksum;.  u
4f80: 33 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  32 u;           
4f90: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
4fa0: 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
4fb0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
4fc0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
4fd0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
4fe0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
4ff0: 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65  der */..  zMaste
5000: 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  r[0] = '\0';..  
5010: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
5020: 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73  leSize(pJrnl, &s
5030: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
5040: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c  QLITE_OK || szJ<
5050: 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  16 ) return rc;.
5060: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5070: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
5080: 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  , &len);.  if( r
5090: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
50a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
50b0: 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b   len>=nMaster ){
50c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
50d0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
50e0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
50f0: 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b  rnl, szJ-12, &ck
5100: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5110: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5120: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5130: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
5140: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73  nl, aMagic, 8, s
5150: 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21  zJ-8);.  if( rc!
5160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65  =SQLITE_OK || me
5170: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
5180: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29  urnalMagic, 8) )
5190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
51a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
51b0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
51c0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
51d0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
51e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
51f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
5200: 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27  zMaster[len] = '
5210: 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69  \0';..  /* See i
5220: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5230: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5240: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5250: 2f 0a 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c  /.  for(u=0; u<l
5260: 65 6e 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; u++){.    ck
5270: 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75  sum -= zMaster[u
5280: 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b  ];.   }.  if( ck
5290: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
52a0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
52b0: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
52c0: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
52d0: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
52e0: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
52f0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
5300: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
5310: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
5320: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
5330: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
5340: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5360: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5370: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5380: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5390: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  e..    */.    zM
53a0: 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b  aster[0] = '\0';
53b0: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
53c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
53d0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
53e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
53f0: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5400: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5410: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5420: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5430: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5440: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5450: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5460: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5470: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
5480: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
5490: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
54a0: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
54b0: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
54c0: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
54d0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5540: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5550: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5560: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5570: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
5580: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
5590: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
55a0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
55b0: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
55c0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
55d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
55e0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
55f0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
5600: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5610: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
5620: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5630: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
5640: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
5650: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5660: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5670: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
5680: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
5690: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
56a0: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
56b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
56c0: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f  f = offset;.}../
56d0: 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72 6f 73  *.** Write zeros
56e0: 20 6f 76 65 72 20 74 68 65 20 68 65 61 64 65 72   over the header
56f0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
5700: 66 69 6c 65 2e 20 20 54 68 69 73 20 68 61 73 20  file.  This has 
5710: 74 68 65 0a 2a 2a 20 65 66 66 65 63 74 20 6f 66  the.** effect of
5720: 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68   invalidating th
5730: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5740: 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68  nd committing th
5750: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
5760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5770: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 50  zeroJournalHdr(P
5780: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
5790: 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a 20  t doTruncate){. 
57a0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
57b0: 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  _OK;.  static co
57c0: 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48 64 72  nst char zeroHdr
57d0: 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 0a 20 20 69  [28] = {0};..  i
57e0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
57f0: 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 69 36 34  alOff ){.    i64
5800: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
5810: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
5820: 69 74 3b 0a 0a 20 20 20 20 49 4f 54 52 41 43 45  it;..    IOTRACE
5830: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
5840: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
5850: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 7c  if( doTruncate |
5860: 7c 20 69 4c 69 6d 69 74 3d 3d 30 20 29 7b 0a 20  | iLimit==0 ){. 
5870: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5880: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
5890: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
58a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
58b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
58c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
58d0: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
58e0: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
58f0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
5900: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
5910: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
5920: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5930: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
5940: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
5950: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
5960: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
5970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
5980: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
5990: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
59a0: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
59b0: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
59c0: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
59d0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
59e0: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
59f0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
5a00: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
5a10: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
5a20: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
5a30: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
5a40: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
5a50: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
5a60: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
5a70: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
5a80: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
5a90: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
5aa0: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
5ab0: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
5ac0: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
5ad0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
5ae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
5af0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
5b00: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
5b10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5b20: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
5b30: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
5b40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5b50: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
5b60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
5b70: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
5b80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
5b90: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
5ba0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5bb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
5bc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
5bd0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
5be0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5bf0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
5c00: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
5c10: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
5c20: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
5c30: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
5c40: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
5c50: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
5c60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
5c70: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
5c80: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
5c90: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
5ca0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
5cb0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
5cc0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
5cd0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
5ce0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
5cf0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
5d00: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
5d10: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
5d20: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
5d30: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
5d40: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
5d50: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
5d60: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
5d70: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
5d80: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
5d90: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
5da0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
5db0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
5dc0: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
5dd0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
5de0: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
5df0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
5e00: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
5e10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5e20: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
5e30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5e40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
5e50: 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 48  E_OK;.  char *zH
5e60: 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  eader = pPager->
5e70: 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e 74  pTmpSpace;.  int
5e80: 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
5e90: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
5ea0: 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69 66  nt nWrite;..  if
5eb0: 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41  ( nHeader>JOURNA
5ec0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5ed0: 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
5ee0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
5ef0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
5f00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5f10: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5f20: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5f30: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5f40: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a  ournalOff;.  }..
5f50: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
5f60: 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
5f70: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
5f80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f90: 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28 7a  Off;..  memcpy(z
5fa0: 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c  Header, aJournal
5fb0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
5fc0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a  ournalMagic));..
5fd0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
5fe0: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
5ff0: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
6000: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
6010: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
6020: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
6030: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
6040: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
6050: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
6060: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
6070: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
6080: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
6090: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
60a0: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
60b0: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
60c0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
60d0: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
60e0: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
60f0: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
6100: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
6110: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
6120: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
6130: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
6140: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
6150: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
6160: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
6170: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
6180: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
6190: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
61a0: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
61b0: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
61c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
61d0: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
61e0: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
61f0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
6200: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
6210: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
6220: 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
6230: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
6240: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
6250: 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   it may contain 
6260: 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61 74  some garbage dat
6270: 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  a. There are two
6280: 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a 20   scenarios.  ** 
6290: 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b 20  where this risk 
62a0: 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a 0a  can be ignored:.
62b0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68    **.  **   * Wh
62c0: 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73 20  en the pager is 
62d0: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
62e0: 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e 20   Corruption can 
62f0: 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20 20  follow a.  **   
6300: 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20    power failure 
6310: 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e 79  in this case any
6320: 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  way..  **.  **  
6330: 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c 49   * When the SQLI
6340: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
6350: 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74  PEND flag is set
6360: 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65  . This guarantee
6370: 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74 20  s.  **     that 
6380: 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73 20  garbage data is 
6390: 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20 74  never appended t
63a0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
63b0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  le..  */.  asser
63c0: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
63d0: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
63e0: 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20 28  noSync);.  if( (
63f0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 20  pPager->noSync) 
6400: 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
6410: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
6420: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
6430: 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65  Y).   || (sqlite
6440: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
6450: 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
6460: 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  >fd)&SQLITE_IOCA
6470: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a  P_SAFE_APPEND) .
6480: 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69    ){.    put32bi
6490: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
64a0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
64b0: 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b  )], 0xffffffff);
64c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75  .  }else{.    pu
64d0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
64e0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
64f0: 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d  Magic)], 0);.  }
6500: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ..  /* The rando
6510: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6520: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6530: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
6540: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
6550: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
6560: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6570: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
6580: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
6590: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c  ournalMagic)+4],
65a0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
65b0: 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e  it);.  /* The in
65c0: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73  itial database s
65d0: 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ize */.  put32bi
65e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
65f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6600: 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62  )+8], pPager->db
6610: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
6620: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
6630: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
6640: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
6650: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6660: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6670: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
6680: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
6690: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
66a0: 61 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20  alHdr==0 ){.    
66b0: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
66c0: 20 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74   */.    put32bit
66d0: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
66e0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
66f0: 2b 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61  +16], pPager->pa
6700: 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
6710: 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63  for(nWrite=0; rc
6720: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72  ==SQLITE_OK&&nWr
6730: 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ite<JOURNAL_HDR_
6740: 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69  SZ(pPager); nWri
6750: 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20  te+=nHeader){.  
6760: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52    IOTRACE(("JHDR
6770: 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %p %lld %d\n", 
6780: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
6790: 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61  journalHdr, nHea
67a0: 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73  der)).    rc = s
67b0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
67c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
67d0: 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61  er, nHeader, pPa
67e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
67f0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
6800: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61  urnalOff += nHea
6810: 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
6820: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6830: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6840: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6850: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
6860: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
6870: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
6880: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6890: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
68a0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
68b0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
68c0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
68d0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
68e0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
68f0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
6900: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
6910: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6920: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
6930: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
6940: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
6950: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
6960: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
6970: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
6980: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
6990: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
69a0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
69b0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
69c0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
69d0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
69e0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
69f0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
6a00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
6a10: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
6a20: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
6a30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6a40: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
6a50: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
6a60: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
6a70: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
6a80: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
6a90: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
6aa0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
6ab0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
6ac0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
6ad0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
6ae0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
6af0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
6b00: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
6b10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
6b20: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
6b30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
6b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
6b50: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
6b60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
6b70: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
6b80: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
6b90: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
6ba0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
6bb0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
6bc0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
6bd0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
6be0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20  agic header */. 
6bf0: 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
6c00: 69 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a  int iPageSize;..
6c10: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
6c20: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
6c30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6c40: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
6c50: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
6c60: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
6c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6c80: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
6c90: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6ca0: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
6cb0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
6cc0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6cd0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6ce0: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
6cf0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6d00: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
6d10: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
6d20: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
6d30: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
6d40: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6d50: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
6d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6d70: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
6d80: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
6d90: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
6da0: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6db0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6dc0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6dd0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
6de0: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
6df0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6e00: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6e10: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6e20: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6e30: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
6e40: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6e50: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6e60: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6e70: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72  (pPager->jfd, jr
6e80: 6e 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a  nlOff+16, (u32 *
6e90: 29 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20  )&iPageSize);.  
6ea0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
6eb0: 4b 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69  K .   && iPageSi
6ec0: 7a 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69  ze>=512 .   && i
6ed0: 50 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  PageSize<=SQLITE
6ee0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
6ef0: 20 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a     && ((iPageSiz
6f00: 65 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d  e-1)&iPageSize)=
6f10: 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36  =0 .  ){.    u16
6f20: 20 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67   pagesize = iPag
6f30: 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  eSize;.    rc = 
6f40: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
6f50: 61 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20  agesize(pPager, 
6f60: 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a  &pagesize);.  }.
6f70: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6f80: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
6f90: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
6fa0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
6fb0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
6fc0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
6fd0: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
6fe0: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
6ff0: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7000: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7010: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7020: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7030: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7040: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
7050: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
7060: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
7070: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
7080: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
7090: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
70a0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
70b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
70c0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
70d0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
70e0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
70f0: 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32  jrnlOff+12, (u32
7100: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
7110: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
7120: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7130: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7140: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
7150: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
7160: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7170: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  OK;.}.../*.** Wr
7180: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
7190: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
71a0: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
71b0: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
71c0: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
71d0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
71e0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
71f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
7200: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
7210: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
7220: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
7230: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
7240: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
7250: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
7260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
7270: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
7280: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
7290: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
72a0: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
72b0: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
72c0: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
72d0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
72e0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
72f0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
7300: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
7310: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
7320: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
7330: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
7340: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
7350: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
7360: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
7370: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
7380: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
7390: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
73a0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
73b0: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
73c0: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
73d0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73  e..**.** If zMas
73e0: 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ter is a NULL po
73f0: 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f  inter (occurs fo
7400: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
7410: 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
7420: 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  , .** this call 
7430: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
7440: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
7450: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
7460: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
7470: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
7480: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
7490: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
74a0: 20 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b   .  i64 jrnlOff;
74b0: 0a 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b  .  i64 jrnlSize;
74c0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
74d0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69  ;.  char zBuf[si
74e0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
74f0: 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28  ic)+2*4];..  if(
7500: 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61   !zMaster || pPa
7510: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
7520: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7530: 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  K;.  if( pPager-
7540: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7550: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7560: 4d 45 4d 4f 52 59 20 29 20 72 65 74 75 72 6e 20  MEMORY ) return 
7570: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
7580: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
7590: 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72   1;..  len = str
75a0: 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  len(zMaster);.  
75b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
75c0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
75d0: 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20  += zMaster[i];. 
75e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
75f0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
7600: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
7610: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
7620: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
7630: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
7640: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
7650: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
7660: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
7670: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
7680: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
7690: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
76a0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
76b0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
76c0: 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61  {.    seekJourna
76d0: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
76e0: 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50  }.  jrnlOff = pP
76f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
7700: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
7710: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
7720: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
7730: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
7740: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41  jfd, jrnlOff, PA
7750: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
7760: 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  er));.  if( rc!=
7770: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7780: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
7790: 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73   += 4;..  rc = s
77a0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
77b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
77c0: 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66  er, len, jrnlOff
77d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
77e0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
77f0: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
7800: 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69   len;..  put32bi
7810: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
7820: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
7830: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7840: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7850: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7860: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7870: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7880: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7890: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
78a0: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
78b0: 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66  lMagic), jrnlOff
78c0: 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  );.  jrnlOff += 
78d0: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
78e0: 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50 61 67 65  lMagic);.  pPage
78f0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
7900: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a  Pager->noSync;..
7910: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
7920: 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65 6e  r is in peristen
7930: 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20  t-journal mode, 
7940: 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63 61  then the physica
7950: 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d  l .  ** journal-
7960: 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64 20  file may extend 
7970: 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
7980: 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
7990: 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64  al name.  ** and
79a0: 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67 69   8 bytes of magi
79b0: 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69 74  c data just writ
79c0: 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ten to the file.
79d0: 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20 64   This is .  ** d
79e0: 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73 65  angerous because
79f0: 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c   the code to rol
7a00: 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72  lback a hot-jour
7a10: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69  nal file.  ** wi
7a20: 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
7a30: 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74 65  o find the maste
7a40: 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74  r-journal name t
7a50: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
7a60: 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * whether or not
7a70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
7a80: 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  hot. .  **.  ** 
7a90: 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74 6f  Easiest thing to
7aa0: 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65 6e   do in this scen
7ab0: 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e 63  ario is to trunc
7ac0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
7ad0: 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68  .  ** file to th
7ae0: 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65 2e  e required size.
7af0: 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 28 72 63  .  */ .  if( (rc
7b00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20  ==SQLITE_OK).   
7b10: 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  && (rc = sqlite3
7b20: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
7b30: 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a  r->jfd, &jrnlSiz
7b40: 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))==SQLITE_OK. 
7b50: 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72    && jrnlSize>jr
7b60: 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20 20 20 72  nlOff.  ){.    r
7b70: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
7b80: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
7b90: 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d  d, jrnlOff);.  }
7ba0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7bb0: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
7bc0: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
7bd0: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7be0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7bf0: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7c00: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
7c10: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
7c20: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
7c30: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
7c40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7c50: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
7c60: 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  Hdr *p;.  sqlite
7c70: 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
7c80: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
7c90: 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65  no, 0, &p);.  re
7ca0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7cb0: 20 43 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65   Clear the in-me
7cc0: 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69  mory cache.  Thi
7cd0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74  s routine.** set
7ce0: 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  s the state of t
7cf0: 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f  he pager back to
7d00: 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65   what it was whe
7d10: 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a  n it was first.*
7d20: 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f  * opened.  Any o
7d30: 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73  utstanding pages
7d40: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7d50: 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
7d60: 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61  attempts.** to a
7d70: 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65  ccess those page
7d80: 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  s will likely re
7d90: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
7da0: 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mp..*/.static vo
7db0: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
7dc0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7dd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
7de0: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7df0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
7e00: 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ear(pPager->pPCa
7e10: 63 68 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  che);.}../*.** U
7e20: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7e30: 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  se file. .**.** 
7e40: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
7e50: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65 72 72  currently in err
7e60: 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63 61 72  or state, discar
7e70: 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  d the contents o
7e80: 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20  f .** the cache 
7e90: 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 61  and reset the Pa
7ea0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 69 6e  ger structure in
7eb0: 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20 49 66  ternal state. If
7ec0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20   there is.** an 
7ed0: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c  open journal-fil
7ee0: 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65 78 74  e, then the next
7ef0: 20 74 69 6d 65 20 61 20 73 68 61 72 65 64 2d 6c   time a shared-l
7f00: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ock is obtained.
7f10: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65 72 20  ** on the pager 
7f20: 66 69 6c 65 20 28 62 79 20 74 68 69 73 20 6f 72  file (by this or
7f30: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
7f40: 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62 65 0a  ss), it will be.
7f50: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 61 20  ** treated as a 
7f60: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  hot-journal and 
7f70: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
7f80: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7f90: 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a  r_unlock(Pager *
7fa0: 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21  pPager){.  if( !
7fb0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
7fc0: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  eMode ){.    int
7fd0: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
7fe0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7ff0: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  CK);.    if( rc 
8000: 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ) pPager->errCod
8010: 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50 61 67  e = rc;.    pPag
8020: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
8030: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55  .    IOTRACE(("U
8040: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
8050: 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20 41 6c  ger))..    /* Al
8060: 77 61 79 73 20 63 6c 6f 73 65 20 74 68 65 20 6a  ways close the j
8070: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
8080: 20 64 72 6f 70 70 69 6e 67 20 74 68 65 20 64 61   dropping the da
8090: 74 61 62 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20  tabase lock..   
80a0: 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61   ** Otherwise, a
80b0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
80c0: 6e 20 77 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d  n with journal_m
80d0: 6f 64 65 3d 64 65 6c 65 74 65 20 6d 69 67 68 74  ode=delete might
80e0: 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 20 74  .    ** delete t
80f0: 68 65 20 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d  he file out from
8100: 20 75 6e 64 65 72 20 75 73 2e 0a 20 20 20 20 2a   under us..    *
8110: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
8120: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8140: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
8150: 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  d);.      pPager
8160: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
8170: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
8180: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
8190: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
81a0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
81b0: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >pInJournal = 0;
81c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69  .      sqlite3Bi
81d0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
81e0: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
81f0: 61 63 6b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ack);.      pPag
8200: 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
8210: 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ack = 0;.    }..
8220: 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72 2e      /* If Pager.
8230: 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c 20  errCode is set, 
8240: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
8250: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8260: 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 2a 2a  cannot be.    **
8270: 20 74 72 75 73 74 65 64 2e 20 4e 6f 77 20 74 68   trusted. Now th
8280: 61 74 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  at the pager fil
8290: 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 74  e is unlocked, t
82a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
82b0: 68 65 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 20  he.    ** cache 
82c0: 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
82d0: 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63   and the error c
82e0: 6f 64 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72  ode safely clear
82f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
8300: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
8310: 64 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  de ){.      if( 
8320: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
8330: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8340: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
8350: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
8360: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
8370: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
8380: 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  en ){.        sq
8390: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
83a0: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
83b0: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
83c0: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
83d0: 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >pInStmt);.     
83e0: 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74     pPager->pInSt
83f0: 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
8400: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
8410: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  mtOpen = 0;.    
8420: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
8430: 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Use = 0;.      p
8440: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8450: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
8460: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
8470: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
8480: 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
8490: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  pen = 0;.      p
84a0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
84b0: 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
84c0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
84d0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
84e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
84f0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
8500: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
8510: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
8520: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
8530: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
8540: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
8550: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
8560: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
8570: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
8580: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
8590: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  .** do not attem
85a0: 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  pt the rollback.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
85c0: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
85d0: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
85e0: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
85f0: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de==SQLITE_OK &&
8600: 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52   p->state>=PAGER
8610: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
8620: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
8630: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
8640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
8650: 6c 62 61 63 6b 28 70 29 3b 0a 20 20 20 20 73 71  lback(p);.    sq
8660: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
8670: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61  lloc();.  }.  pa
8680: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 7d  ger_unlock(p);.}
8690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
86a0: 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e  tine ends a tran
86b0: 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e  saction.  A tran
86c0: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
86d0: 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20   by either.** a 
86e0: 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c  COMMIT or a ROLL
86f0: 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  BACK..**.** When
8700: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8710: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
8720: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
8730: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
8740: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
8750: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
8760: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
8770: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8780: 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20  will release.** 
8790: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
87a0: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
87b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
87c0: 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61  its place if tha
87d0: 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72  t is.** the appr
87e0: 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f  opriate thing to
87f0: 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f   do.  Release lo
8800: 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61  cks usually is a
8810: 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75  ppropriate,.** u
8820: 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20  nless we are in 
8830: 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
8840: 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20   mode or unless 
8850: 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f  this is a .** CO
8860: 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f  MMIT AND BEGIN o
8870: 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42  r ROLLBACK AND B
8880: 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  EGIN operation..
8890: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
88a0: 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72  l file is either
88b0: 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e   deleted or trun
88c0: 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  cated..**.** TOD
88d0: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
88e0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
88f0: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
8900: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
8910: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
8920: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
8930: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
8940: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
8950: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
8960: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
8970: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
8980: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
8990: 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
89a0: 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
89b0: 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72 29 7b   int hasMaster){
89c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
89d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
89e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
89f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8a00: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
8a10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8a20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8a30: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8a40: 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
8a50: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8a60: 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65  mtOpen && !pPage
8a70: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
8a80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
8a90: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73  sClose(pPager->s
8aa0: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
8ab0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
8ac0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
8ad0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
8ae0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8af0: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
8b00: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
8b10: 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
8b20: 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75 72  int isMemoryJour
8b30: 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73 4d  nal = sqlite3IsM
8b40: 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  emJournal(pPager
8b50: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73 71  ->jfd);.      sq
8b60: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
8b70: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
8b80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8b90: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
8ba0: 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f 75  if( !isMemoryJou
8bb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  rnal ){.        
8bc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
8bd0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66  lete(pPager->pVf
8be0: 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
8bf0: 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  nal, 0);.      }
8c00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
8c10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8c20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8c30: 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20  LMODE_TRUNCATE. 
8c40: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
8c50: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
8c60: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8c70: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
8c80: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
8c90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8ca0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8cb0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8cc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8cd0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8ce0: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
8cf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
8d00: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
8d10: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
8d20: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
8d30: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
8d40: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
8d50: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
8d60: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
8d70: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8d80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8d90: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8da0: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8db0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8dc0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8dd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
8de0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
8df0: 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20 29  E_DELETE || rc )
8e00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8e10: 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
8e20: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8e30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8e40: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8e50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
8e60: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
8e70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
8e80: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
8e90: 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70  (pPager->pVfs, p
8ea0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
8eb0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
8ec0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69   }.    sqlite3Bi
8ed0: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
8ee0: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->pInJournal);
8ef0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
8f00: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8f10: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8f20: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41  stroy(pPager->pA
8f30: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a  lwaysRollback);.
8f40: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
8f50: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8f60: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
8f70: 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
8f80: 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 23 69 66  r->pPCache);.#if
8f90: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
8fa0: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
8fb0: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 28  e3PcacheIterate(
8fc0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
8fd0: 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 68   pager_set_pageh
8fe0: 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ash);.#endif.   
8ff0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c   sqlite3PcacheCl
9000: 65 61 72 46 6c 61 67 73 28 70 50 61 67 65 72 2d  earFlags(pPager-
9010: 3e 70 50 43 61 63 68 65 2c 0a 20 20 20 20 20 20  >pPCache,.      
9020: 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41   PGHDR_IN_JOURNA
9030: 4c 20 7c 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  L | PGHDR_NEED_S
9040: 59 4e 43 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  YNC.    );.    p
9050: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
9060: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
9070: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
9080: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9090: 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
90a0: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  rnal==0 );.  }..
90b0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
90c0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
90d0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
90e0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
90f0: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
9100: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
9110: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
9120: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
9130: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
9140: 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50  SYNCED ){.    pP
9150: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
9160: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
9170: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
9180: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  gDbSize = 0;.  p
9190: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
91a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
91b0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
91c0: 2f 2a 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72  /* lruListSetFir
91d0: 73 74 53 79 6e 63 65 64 28 70 50 61 67 65 72 29  stSynced(pPager)
91e0: 3b 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44  ; */.  if( !MEMD
91f0: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
9200: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
9210: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  }.  pPager->dbMo
9220: 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72  dified = 0;..  r
9230: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
9240: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
9250: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
9260: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
9270: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
9280: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
9290: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
92a0: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
92b0: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
92c0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
92d0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
92e0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
92f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
9300: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
9310: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
9320: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
9330: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
9340: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
9350: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
9360: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
9370: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
9380: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
9390: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
93a0: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
93b0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
93c0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
93d0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
93e0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
93f0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
9400: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
9410: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
9420: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
9430: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
9440: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
9450: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
9460: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
9470: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
9480: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9490: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
94a0: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
94b0: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
94c0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
94d0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
94e0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
94f0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
9500: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
9510: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
9520: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
9530: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
9540: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
9550: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
9560: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
9570: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
9580: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9590: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
95a0: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
95b0: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
95c0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
95d0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
95e0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
95f0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
9600: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
9610: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
9620: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
9630: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
9640: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
9650: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
9660: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
9670: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
9680: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
9690: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
96a0: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
96b0: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
96c0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
96d0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
96e0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
96f0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
9700: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
9710: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9720: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
9730: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
9740: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9750: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9760: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9770: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9790: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
97a0: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
97b0: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
97c0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
97d0: 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c  * The isMainJrnl
97e0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
97f0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   this is the mai
9800: 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  n rollback journ
9810: 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20  al and.** false 
9820: 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  for the statemen
9830: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20  t journal.  The 
9840: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  main rollback jo
9850: 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68  urnal uses.** ch
9860: 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74  ecksums - the st
9870: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
9880: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  does not..*/.sta
9890: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
98a0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
98b0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
98c0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ,       /* The p
98d0: 61 67 65 72 20 62 65 69 6e 67 20 70 6c 61 79 65  ager being playe
98e0: 64 20 62 61 63 6b 20 2a 2f 0a 20 20 73 71 6c 69  d back */.  sqli
98f0: 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 20 20  te3_file *jfd,  
9900: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 74 68 61   /* The file tha
9910: 74 20 69 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t is the journal
9920: 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
9930: 63 6b 20 2a 2f 0a 20 20 69 36 34 20 6f 66 66 73  ck */.  i64 offs
9940: 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
9950: 4f 66 66 73 65 74 20 6f 66 20 74 68 65 20 70 61  Offset of the pa
9960: 67 65 20 77 69 74 68 69 6e 20 74 68 65 20 6a 6f  ge within the jo
9970: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
9980: 73 4d 61 69 6e 4a 72 6e 6c 20 20 20 20 20 20 20  sMainJrnl       
9990: 2f 2a 20 54 72 75 65 20 66 6f 72 20 6d 61 69 6e  /* True for main
99a0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
99b0: 6c 2e 20 46 61 6c 73 65 20 66 6f 72 20 53 74 6d  l. False for Stm
99c0: 74 20 6a 72 6e 6c 20 2a 2f 0a 29 7b 0a 20 20 69  t jrnl */.){.  i
99d0: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
99e0: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
99f0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
9a00: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
9a10: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
9a20: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
9a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
9a50: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
9a60: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
9a70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9a80: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
9a90: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
9aa0: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
9ab0: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
9ac0: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
9ad0: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
9ae0: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
9af0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 69 73 4d 61 69  e */..  /* isMai
9b00: 6e 4a 72 6e 6c 20 73 68 6f 75 6c 64 20 62 65 20  nJrnl should be 
9b10: 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69  true for the mai
9b20: 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61  n journal and fa
9b30: 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61  lse for.  ** sta
9b40: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e  tement journals.
9b50: 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
9b60: 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  is is always the
9b70: 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73   case.  */.  ass
9b80: 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 69 73 4d  ert( jfd == (isM
9b90: 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72  ainJrnl ? pPager
9ba0: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
9bb0: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
9bc0: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
9bd0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
9be0: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
9bf0: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
9c00: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9c10: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
9c20: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
9c30: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
9c40: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
9c50: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9c60: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
9c70: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
9c80: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
9c90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
9ca0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
9cb0: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
9cc0: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
9cd0: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
9ce0: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
9cf0: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
9d00: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
9d10: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
9d20: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
9d30: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
9d40: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
9d50: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
9d60: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
9d70: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
9d80: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
9d90: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
9da0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
9db0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
9dc0: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
9dd0: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
9de0: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
9df0: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
9e00: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9e10: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
9e20: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
9e30: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
9e40: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
9e50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9e60: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
9e70: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
9e80: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66  d32bits(jfd, off
9e90: 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65  set+pPager->page
9ea0: 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b  Size+4, &cksum);
9eb0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
9ec0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
9ed0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9ee0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
9ef0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
9f00: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
9f10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9f20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
9f30: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
9f40: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
9f50: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
9f60: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
9f70: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9f80: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
9f90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
9fa0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
9fb0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
9fc0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
9fd0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
9fe0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
9ff0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
a000: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
a010: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
a020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a030: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
a040: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
a050: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
a060: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63    **.  ** An exc
a070: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62  eption to the ab
a080: 6f 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65  ove rule: If the
a090: 20 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20   database is in 
a0a0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a  no-sync mode.  *
a0b0: 2a 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20  * and a page is 
a0c0: 6d 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20  moved during an 
a0d0: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
a0e0: 75 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  um then the page
a0f0: 20 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65   may.  ** not be
a100: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
a110: 63 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61  che. Later: if a
a120: 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20   malloc() or IO 
a130: 65 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a  error occurs.  *
a140: 2a 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70  * during a Movep
a150: 61 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e  age() call, then
a160: 20 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f   the page may no
a170: 74 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68  t be in the cach
a180: 65 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53  e.  ** either. S
a190: 6f 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  o the condition 
a1a0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
a1b0: 20 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68   above paragraph
a1c0: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73   is not.  ** ass
a1d0: 65 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ert()able..  **.
a1e0: 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55    ** If in EXCLU
a1f0: 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e  SIVE state, then
a200: 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70   we update the p
a210: 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74  ager cache if it
a220: 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64   exists.  ** and
a230: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20   the main file. 
a240: 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e  The page is then
a250: 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74   marked not dirt
a260: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63  y..  **.  ** Tic
a270: 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20  ket #1171:  The 
a280: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a290: 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  l might contain 
a2a0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61  page content tha
a2b0: 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72  t is.  ** differ
a2c0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ent from the pag
a2d0: 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65  e content at the
a2e0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72   start of the tr
a2f0: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  ansaction..  ** 
a300: 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e  This occurs when
a310: 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67   a page is chang
a320: 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20  ed prior to the 
a330: 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65  start of a state
a340: 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63  ment.  ** then c
a350: 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74  hanged again wit
a360: 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
a370: 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67  t.  When rolling
a380: 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a   back such a.  *
a390: 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d  * statement we m
a3a0: 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f  ust not write to
a3b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
a3c0: 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65  tabase unless we
a3d0: 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63   know.  ** for c
a3e0: 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67  ertain that orig
a3f0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
a400: 74 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e  ts are synced in
a410: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
a420: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
a430: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61  l.  Otherwise, a
a440: 20 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68   power loss migh
a450: 74 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64  t leave modified
a460: 20 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a   data in the.  *
a470: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
a480: 77 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79  without an entry
a490: 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
a4a0: 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61   journal that ca
a4b0: 6e 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74  n.  ** restore t
a4c0: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
a4d0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d  ts original form
a4e0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
a4f0: 73 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d  s must be.  ** m
a500: 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  et before writin
a510: 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
a520: 65 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  e files. (1) the
a530: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
a540: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20  e.  ** locked.  
a550: 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  (2) we know that
a560: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
a570: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75  ge content is fu
a580: 6c 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  lly synced.  ** 
a590: 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  in the main jour
a5a0: 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75  nal either becau
a5b0: 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  se the page is n
a5c0: 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65  ot in cache or e
a5d0: 6c 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  lse.  ** the pag
a5e0: 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  e is marked as n
a5f0: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a  eedSync==0..  **
a600: 0a 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34  .  ** 2008-04-14
a610: 3a 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69  :  When attempti
a620: 6e 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63  ng to vacuum a c
a630: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
a640: 66 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73  file, it.  ** is
a650: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69   possible to fai
a660: 6c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  l a statement on
a670: 20 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74   a database that
a680: 20 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78   does not yet ex
a690: 69 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74  ist..  ** Do not
a6a0: 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
a6b0: 65 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69  e if database fi
a6c0: 6c 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65  le has never bee
a6d0: 6e 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20  n opened..  */. 
a6e0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
a6f0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
a700: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
a710: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
a720: 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
a730: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
a740: 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
a750: 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72  er), pgno, pager
a760: 5f 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72  _datahash(pPager
a770: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74  ->pageSize, aDat
a780: 61 29 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67  a));.  if( (pPag
a790: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
a7a0: 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 26  _EXCLUSIVE).   &
a7b0: 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d  & (pPg==0 || 0==
a7c0: 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
a7d0: 52 5f 4e 45 45 44 5f 53 59 4e 43 29 29 0a 20 20  R_NEED_SYNC)).  
a7e0: 20 26 26 20 28 70 50 61 67 65 72 2d 3e 66 64 2d   && (pPager->fd-
a7f0: 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 29 7b 0a  >pMethods).  ){.
a800: 20 20 20 20 69 36 34 20 6f 66 73 74 20 3d 20 28      i64 ofst = (
a810: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
a820: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
a830: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
a840: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
a850: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
a860: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74  ->pageSize, ofst
a870: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
a880: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
a890: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
a8a0: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
a8b0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
a8c0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
a8d0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
a8e0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
a8f0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
a900: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
a910: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
a920: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
a930: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
a940: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
a950: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
a960: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
a970: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
a980: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
a990: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
a9a0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
a9b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
a9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
a9d0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 70 44 61 74  *pData;.    pDat
a9e0: 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
a9f0: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
aa00: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
aa10: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
aa20: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
aa30: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
aa40: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
aa50: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
aa60: 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   if( isMainJrnl 
aa70: 29 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  ) makeClean(pPg)
aa80: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
aa90: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
aaa0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
aab0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
aac0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
aad0: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
aae0: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
aaf0: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
ab00: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
ab10: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
ab20: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
ab30: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
ab40: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
ab50: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
ab60: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
ab70: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
ab80: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
ab90: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
aba0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
abb0: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
abc0: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
abd0: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
abe0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
abf0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
ac00: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
ac10: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
ac20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ac30: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
ac40: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
ac50: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
ac60: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
ac70: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
ac80: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
ac90: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
aca0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
acb0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
acc0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
acd0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
ace0: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
acf0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
ad00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ad10: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
ad20: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
ad30: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
ad40: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
ad50: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
ad60: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
ad70: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
ad80: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
ad90: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
ada0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  tion..**.**.** T
adb0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
adc0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
add0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
ade0: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
adf0: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
ae00: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
ae10: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
ae20: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
ae30: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
ae40: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
ae50: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
ae60: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
ae70: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
ae80: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
ae90: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
aea0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
aeb0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
aec0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
aed0: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
aee0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
aef0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
af00: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
af10: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
af20: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
af30: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
af40: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
af50: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
af60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
af70: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
af80: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
af90: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
afa0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
afb0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
afc0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
afd0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
afe0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
aff0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
b000: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
b010: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
b020: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
b030: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
b040: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
b050: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
b060: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
b070: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
b080: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
b090: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
b0a0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b0b0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
b0c0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
b0d0: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
b0e0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
b0f0: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
b100: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
b110: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
b120: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
b130: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b140: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
b150: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
b160: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
b170: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
b180: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
b190: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
b1a0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
b1b0: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
b1c0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
b1d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
b1e0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
b1f0: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
b200: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
b210: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
b220: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
b230: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
b240: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b250: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b260: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
b270: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
b280: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
b290: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
b2a0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
b2b0: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
b2c0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
b2d0: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
b2e0: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
b2f0: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
b300: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
b310: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
b320: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
b330: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
b340: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
b350: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
b360: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
b370: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
b380: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
b390: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
b3a0: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
b3b0: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
b3c0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
b3d0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
b3e0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
b3f0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
b400: 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72  }.    zMasterPtr
b410: 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
b420: 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
b430: 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l];.    rc = sql
b440: 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
b450: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
b460: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
b470: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
b480: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b490: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
b4a0: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
b4b0: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
b4c0: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
b4d0: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
b4e0: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
b4f0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
b500: 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
b510: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
b520: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
b530: 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
b540: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
b550: 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
b560: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b570: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
b580: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b5a0: 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
b5b0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
b5c0: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
b5d0: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
b5e0: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
b5f0: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
b600: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
b610: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
b620: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b630: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
b640: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
b650: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
b660: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b670: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
b680: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
b690: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
b6a0: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
b6b0: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
b6c0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
b6d0: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
b6e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
b6f0: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
b700: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
b710: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
b720: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b730: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
b740: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b750: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
b760: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
b770: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
b780: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
b790: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
b7a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
b7b0: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
b7c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
b7d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b7e0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
b7f0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
b800: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
b810: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
b820: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
b830: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
b840: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
b850: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
b860: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
b870: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
b880: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
b890: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
b8a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
b8b0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
b8c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b8d0: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
b8e0: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
b8f0: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
b900: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
b910: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
b920: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
b930: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
b940: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
b950: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
b960: 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
b970: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
b980: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
b990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
b9a0: 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b 0a  Close(pMaster);.
b9b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
b9c0: 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ee(pMaster);.  r
b9d0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
b9e0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
b9f0: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
ba00: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
ba10: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
ba20: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
ba30: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
ba40: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
ba50: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
ba60: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
ba70: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
ba80: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
ba90: 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
baa0: 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  Might might be t
bab0: 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
bac0: 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
bad0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e 50   smaller than nP
bae0: 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61 6e  age..** This can
baf0: 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78 61   happen, for exa
bb00: 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65 20  mple, if we are 
bb10: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
bb20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
bb30: 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74 65  * which has exte
bb40: 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73 69  nded the file si
bb50: 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20 70  ze and the new p
bb60: 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20 61  ages are still a
bb70: 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63 61  ll held.** in ca
bb80: 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e 53  che, then an INS
bb90: 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64 6f  ERT or UPDATE do
bba0: 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 72  es a statement r
bbb0: 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a 2a  ollback.  Some.*
bbc0: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
bbd0: 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  em implementatio
bbe0: 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66 75  ns can get confu
bbf0: 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20 74  sed if you try t
bc00: 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20  o.** truncate a 
bc10: 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69 7a  file to some siz
bc20: 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  e that is larger
bc30: 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e 74   than it current
bc40: 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65 74  ly is,.** so det
bc50: 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61 6e  ect this case an
bc60: 64 20 77 72 69 74 65 20 61 20 73 69 6e 67 6c 65  d write a single
bc70: 20 7a 65 72 6f 20 62 79 74 65 20 74 6f 20 74 68   zero byte to th
bc80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6e 65 77  e end of the new
bc90: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
bca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bcb0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50  pager_truncate(P
bcc0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
bcd0: 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
bce0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
bcf0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
bd00: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
bd10: 53 49 56 45 20 26 26 20 70 50 61 67 65 72 2d 3e  SIVE && pPager->
bd20: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
bd30: 20 20 20 20 69 36 34 20 63 75 72 72 65 6e 74 53      i64 currentS
bd40: 69 7a 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20  ize, newSize;.  
bd50: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd60: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bd70: 3e 66 64 2c 20 26 63 75 72 72 65 6e 74 53 69 7a  >fd, &currentSiz
bd80: 65 29 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65 20  e);.    newSize 
bd90: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
bda0: 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 3b 0a 20  ze*(i64)nPage;. 
bdb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bdc0: 45 5f 4f 4b 20 26 26 20 63 75 72 72 65 6e 74 53  E_OK && currentS
bdd0: 69 7a 65 21 3d 6e 65 77 53 69 7a 65 20 29 7b 0a  ize!=newSize ){.
bde0: 20 20 20 20 20 20 69 66 28 20 63 75 72 72 65 6e        if( curren
bdf0: 74 53 69 7a 65 3e 6e 65 77 53 69 7a 65 20 29 7b  tSize>newSize ){
be00: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
be10: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
be20: 70 50 61 67 65 72 2d 3e 66 64 2c 20 6e 65 77 53  pPager->fd, newS
be30: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
be40: 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
be50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
be60: 50 61 67 65 72 2d 3e 66 64 2c 20 22 22 2c 20 31  Pager->fd, "", 1
be70: 2c 20 6e 65 77 53 69 7a 65 2d 31 29 3b 0a 20 20  , newSize-1);.  
be80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
be90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
beb0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
bec0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
bed0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
bee0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
bef0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
bf00: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
bf10: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
bf20: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
bf30: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
bf40: 61 74 20 6c 65 61 73 74 20 61 73 20 62 69 67 20  at least as big 
bf50: 61 73 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  as the sector si
bf60: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
bf70: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
bf80: 72 53 69 7a 65 28 29 2e 20 20 54 68 65 20 6d 69  rSize().  The mi
bf90: 6e 69 6d 75 6d 20 73 65 63 74 6f 72 20 73 69 7a  nimum sector siz
bfa0: 65 20 69 73 20 35 31 32 2e 0a 2a 2f 0a 73 74 61  e is 512..*/.sta
bfb0: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
bfc0: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
bfd0: 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28  ager){.  assert(
bfe0: 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
bff0: 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
c000: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
c010: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c020: 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63 74 6f   ){.    /* Secto
c030: 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74 20 6d  r size doesn't m
c040: 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70 6f 72  atter for tempor
c050: 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73 6f 2c  ary files. Also,
c060: 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
c070: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 62 65   may not have be
c080: 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c 20 69  en opened yet, i
c090: 6e 20 77 68 63 69 68 20 63 61 73 65 20 74 68 65  n whcih case the
c0a0: 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a   OsSectorSize().
c0b0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c      ** call will
c0c0: 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20 20 2a   segfault..    *
c0d0: 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  /.    pPager->se
c0e0: 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74  ctorSize = sqlit
c0f0: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70  e3OsSectorSize(p
c100: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a  Pager->fd);.  }.
c110: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65    if( pPager->se
c120: 63 74 6f 72 53 69 7a 65 3c 35 31 32 20 29 7b 0a  ctorSize<512 ){.
c130: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
c140: 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  orSize = 512;.  
c150: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
c160: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
c170: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
c180: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c190: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
c1a0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
c1b0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
c1c0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
c1d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c1e0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
c1f0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
c200: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
c210: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
c220: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
c230: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
c240: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
c250: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c260: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c270: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
c280: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
c290: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
c2a0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
c2b0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
c2c0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
c2d0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
c2e0: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
c2f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
c300: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
c310: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c320: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c330: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c340: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
c350: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
c360: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
c370: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
c380: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c390: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
c3a0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
c3b0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
c3c0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
c3d0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
c3e0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
c3f0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
c400: 73 65 63 74 6f 72 20 73 69 7a 65 2e 20 20 54 68  sector size.  Th
c410: 65 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  e header.**     
c420: 20 20 69 73 20 74 68 69 73 20 6d 61 6e 79 20 62    is this many b
c430: 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
c440: 20 20 28 36 29 20 20 34 20 62 79 74 65 20 62 69    (6)  4 byte bi
c450: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
c460: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70 61   which is the pa
c470: 67 65 20 63 61 73 65 2e 0a 2a 2a 20 20 28 37 29  ge case..**  (7)
c480: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
c490: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
c4a0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
c4b0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
c4c0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
c4d0: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
c4e0: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
c4f0: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
c500: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
c510: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
c520: 2a 20 20 28 38 29 20 20 4e 20 62 79 74 65 73 20  *  (8)  N bytes 
c530: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
c540: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
c550: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
c560: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
c570: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
c580: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
c590: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
c5a0: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
c5b0: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
c5c0: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
c5d0: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
c5e0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
c5f0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
c600: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
c610: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
c620: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
c630: 2a 2a 20 20 28 39 29 20 20 5a 65 72 6f 20 6f 72  **  (9)  Zero or
c640: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
c650: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
c660: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
c670: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
c680: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
c690: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
c6a0: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
c6b0: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
c6c0: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
c6d0: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
c6e0: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
c6f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
c700: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
c710: 38 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  8 items above..*
c720: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
c730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
c740: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
c750: 65 20 39 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 9th item..**.*
c760: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
c770: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
c780: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
c790: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
c7a0: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
c7b0: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
c7c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
c7d0: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
c7e0: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
c7f0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
c800: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
c810: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
c820: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
c830: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
c840: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
c850: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
c860: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
c870: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
c880: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
c890: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c8a0: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
c8b0: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
c8c0: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
c8d0: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
c8e0: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
c8f0: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
c900: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
c910: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
c920: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
c930: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
c940: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
c950: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
c960: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
c970: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
c980: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
c990: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
c9a0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
c9b0: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
c9c0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
c9d0: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
c9e0: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
c9f0: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
ca00: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
ca10: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
ca20: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
ca30: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
ca40: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
ca50: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
ca60: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
ca70: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
ca80: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
ca90: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
caa0: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
cab0: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
cac0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
cad0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
cae0: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
caf0: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
cb00: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
cb10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
cb20: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
cb30: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
cb40: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
cb50: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
cb60: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
cb70: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
cb80: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
cb90: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
cba0: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
cbb0: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
cbc0: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
cbd0: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
cbe0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
cbf0: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
cc00: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
cc10: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
cc20: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
cc30: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
cc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
cc50: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
cc60: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
cc70: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
cc80: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
cc90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
cca0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
ccb0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ccc0: 20 69 73 48 6f 74 29 7b 0a 20 20 73 71 6c 69 74   isHot){.  sqlit
ccd0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
cce0: 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
ccf0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cd00: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cd10: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
cd20: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
cd30: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
cd40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cd50: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cd60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
cd70: 2f 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  /.  u32 u;      
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd90: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
cda0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
cdb0: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
cdc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cdd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
cde0: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
cdf0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
ce10: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
ce20: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
ce30: 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20  res = 1;        
ce40: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
ce50: 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
ce60: 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
ce70: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
ce80: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
ce90: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
cea0: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
ceb0: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
cec0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
ced0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
cee0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
cef0: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
cf00: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
cf10: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
cf20: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cf30: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
cf40: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
cf50: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
cf60: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
cf70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
cf80: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
cf90: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
cfa0: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
cfb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
cfc0: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
cfd0: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
cfe0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
cff0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
d000: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
d010: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
d020: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
d030: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
d040: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
d050: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
d060: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
d070: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
d080: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
d090: 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
d0a0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
d0b0: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
d0c0: 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
d0d0: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
d0e0: 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
d0f0: 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
d100: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
d110: 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
d120: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d130: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
d140: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
d150: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
d160: 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
d170: 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
d180: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
d190: 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
d1a0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
d1b0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
d1c0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
d1d0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
d1e0: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
d1f0: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
d200: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
d210: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
d220: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
d230: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
d240: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
d250: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
d260: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
d270: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
d280: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
d290: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
d2a0: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
d2b0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
d2c0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
d2d0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
d2e0: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
d2f0: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
d300: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
d310: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
d320: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
d330: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
d340: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
d350: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
d360: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
d370: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d380: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d390: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
d3a0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d3b0: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
d3c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d3d0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
d3e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
d400: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d410: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d420: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
d430: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
d440: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
d450: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
d460: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
d470: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
d480: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
d490: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
d4a0: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
d4b0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
d4c0: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
d4d0: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
d4e0: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
d4f0: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
d500: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
d510: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
d520: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
d530: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
d540: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
d550: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d560: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
d570: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
d580: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
d590: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
d5a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
d5b0: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
d5c0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
d5d0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
d5e0: 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c  s 0 and this rol
d5f0: 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72  lback is of a tr
d600: 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65  ansaction create
d610: 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a  d by this.    **
d620: 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66 20   process and if 
d630: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e 61  this is the fina
d640: 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 20  l header in the 
d650: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69 74  journal, then it
d660: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
d670: 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66 20  at this part of 
d680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  the journal was 
d690: 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75 74  being filled but
d6a0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
d6b0: 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64 20  n.    ** synced 
d6c0: 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75 74  to disk.  Comput
d6d0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
d6e0: 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20 74  pages based on t
d6f0: 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20 20  he remaining.   
d700: 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20   ** size of the 
d710: 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
d720: 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74 65   ** The third te
d730: 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20 77  rm of the test w
d740: 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78 20  as added to fix 
d750: 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20 20  ticket #2565..  
d760: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
d770: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26  c==0 && !isHot &
d780: 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  &.        pPager
d790: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55  ->journalHdr+JOU
d7a0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d7b0: 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  er)==pPager->jou
d7c0: 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20  rnalOff ){.     
d7d0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70   nRec = (szJ - p
d7e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d7f0: 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  f) / JOURNAL_PG_
d800: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
d810: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
d820: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68  s is the first h
d830: 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20  eader read from 
d840: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75  the journal, tru
d850: 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  ncate the.    **
d860: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
d870: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
d880: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
d890: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
d8a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
d8b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d8c0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
d8d0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
d8e0: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
d8f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
d900: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d910: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
d920: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
d930: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
d940: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
d950: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
d960: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
d970: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
d980: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
d990: 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20  or(u=0; u<nRec; 
d9a0: 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  u++){.      rc =
d9b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d9c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d9d0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50   pPager->jfd, pP
d9e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d9f0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
da00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
da10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
da20: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
da30: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
da40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
da50: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
da60: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
da70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
da80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
da90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
daa0: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72   are unable to r
dab0: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
dac0: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 70 72  e database is pr
dad0: 6f 62 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20  obably.         
dae0: 20 2a 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64   ** going to end
daf0: 20 75 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70   up being corrup
db00: 74 2e 20 20 49 74 20 69 73 20 63 6f 72 72 75 70  t.  It is corrup
db10: 74 20 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e  t to us, anyhow.
db20: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65  .          ** Pe
db30: 72 68 61 70 73 20 74 68 65 20 6e 65 78 74 20 70  rhaps the next p
db40: 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61  rocess to come a
db50: 6c 6f 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e  long can fix it.
db60: 2e 2e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ....          */
db70: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
db80: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
db90: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
dba0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
dbb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dbc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
dbd0: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
dbe0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
dbf0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
dc00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
dc10: 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
dc20: 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
dc30: 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
dc40: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
dc50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
dc60: 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
dc70: 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
dc80: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
dc90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dca0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
dcb0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
dcc0: 67 65 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21  ger, zMaster[0]!
dcd0: 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66  ='\0');.  }.  if
dce0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dcf0: 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26  && zMaster[0] &&
dd00: 20 72 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49   res ){.    /* I
dd10: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
dd20: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
dd30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
dd40: 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65 73  ll return succes
dd50: 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66  s,.    ** see if
dd60: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
dd70: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
dd80: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster journal..  
dd90: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61    */.    rc = pa
dda0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50  ger_delmaster(pP
ddb0: 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
ddc0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
ddd0: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
dde0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
ddf0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
de00: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
de10: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
de20: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
de30: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
de40: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
de50: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
de60: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
de70: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
de80: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
de90: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
dea0: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
deb0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
dec0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
ded0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
dee0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
def0: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
df00: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
df10: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
df20: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
df30: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
df40: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
df50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
df60: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
df70: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
df80: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
df90: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
dfa0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
dfb0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
dfc0: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
dfd0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
dfe0: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
dff0: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
e000: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
e010: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
e020: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
e030: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
e040: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
e050: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e060: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
e070: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
e080: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
e090: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
e0a0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
e0b0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
e0c0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
e0d0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
e0e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
e0f0: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
e100: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
e110: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
e140: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
e150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e160: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
e170: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
e180: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
e190: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
e1a0: 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f  /* Set hdrOff to
e1b0: 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a   be the offset j
e1c0: 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e  ust after the en
e1d0: 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f  d of the last jo
e1e0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  urnal.  ** page 
e1f0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74  written before t
e200: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e210: 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73  -header for this
e220: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
e230: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
e240: 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20  written, or the 
e250: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
e260: 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20  if no journal.  
e270: 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72  ** header was wr
e280: 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64  itten..  */.  hd
e290: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  rOff = pPager->s
e2a0: 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73  tmtHdrOff;.  ass
e2b0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c  ert( pPager->ful
e2c0: 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66  lSync || !hdrOff
e2d0: 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66   );.  if( !hdrOf
e2e0: 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20  f ){.    hdrOff 
e2f0: 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20  = szJ;.  }.  .  
e300: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
e310: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
e320: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
e330: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
e340: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
e350: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
e360: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65  tmtSize);.  asse
e370: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
e380: 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
e390: 29 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  );..  /* Figure 
e3a0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
e3b0: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
e3c0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e3d0: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
e3e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
e3f0: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
e400: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
e410: 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  nRec = pPager->s
e420: 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a  tmtNRec;.  .  /*
e430: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
e440: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
e450: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
e460: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
e470: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
e480: 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68  e file.  Note th
e490: 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
e4a0: 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63   journal omits c
e4b0: 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20  hecksums from.  
e4c0: 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73  ** each record s
e4d0: 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75  ince power-failu
e4e0: 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e  re recovery is n
e4f0: 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  ot important to 
e500: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a  statement.  ** j
e510: 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20  ournals..  */.  
e520: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b  for(i=0; i<nRec;
e530: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f   i++){.    i64 o
e540: 66 66 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61  ffset = i*(4+pPa
e550: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e560: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e570: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e580: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e590: 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30  >stfd, offset, 0
e5a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e5b0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e5c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e5d0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e5e0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e5f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
e600: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
e610: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
e620: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
e630: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
e640: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
e650: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
e660: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
e670: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
e680: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
e690: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
e6a0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
e6b0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
e6c0: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
e6d0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
e6e0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
e6f0: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
e700: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
e710: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
e720: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
e730: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
e740: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
e750: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
e760: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
e770: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
e780: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
e790: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ion..  */.  pPag
e7a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
e7b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
e7c0: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
e7d0: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
e7e0: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
e7f0: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
e800: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
e810: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
e820: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
e830: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
e840: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
e850: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31  r->journalOff, 1
e860: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e870: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e880: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
e890: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e8a0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e8b0: 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
e8c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e8d0: 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20  ff < szJ ){.    
e8e0: 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20  u32 nJRec;      
e8f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e900: 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20  Journal Records 
e910: 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  */.    u32 dummy
e920: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
e930: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
e940: 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
e950: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
e960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e970: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
e980: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
e990: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
e9a0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e9b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a      }.    if( nJ
e9c0: 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rec==0 ){.      
e9d0: 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70  nJRec = (szJ - p
e9e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e9f0: 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61  f) / (pPager->pa
ea00: 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d  geSize+8);.    }
ea10: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63  .    for(i=nJRec
ea20: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
ea30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ea40: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
ea50: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
ea60: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
ea70: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
ea80: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
ea90: 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20  nalOff, 1);.    
eaa0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
eab0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
eac0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ead0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
eae0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
eaf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
eb00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
eb10: 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d   szJ;.  .end_stm
eb20: 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  t_playback:.  if
eb30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ( rc==SQLITE_OK)
eb40: 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a   {.    pPager->j
eb50: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
eb60: 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65  .    /* pager_re
eb70: 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
eb80: 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  r); */.  }.  ret
eb90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
eba0: 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69   Change the maxi
ebb0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  mum number of in
ebc0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68  -memory pages th
ebd0: 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a  at are allowed..
ebe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
ebf0: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
ec00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ec10: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 73  int mxPage){.  s
ec20: 71 6c 69 74 65 33 50 63 61 63 68 65 53 65 74 43  qlite3PcacheSetC
ec30: 61 63 68 65 73 69 7a 65 28 70 50 61 67 65 72 2d  achesize(pPager-
ec40: 3e 70 50 43 61 63 68 65 2c 20 6d 78 50 61 67 65  >pPCache, mxPage
ec50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75  );.}../*.** Adju
ec60: 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73  st the robustnes
ec70: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
ec80: 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20  e to damage due 
ec90: 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a  to OS crashes.**
eca0: 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
ecb0: 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74  es by changing t
ecc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e  he number of syn
ecd0: 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69  cs()s when writi
ece0: 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  ng.** the rollba
ecf0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  ck journal.  The
ed00: 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76  re are three lev
ed10: 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46  els:.**.**    OF
ed20: 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  F       sqlite3O
ed30: 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72  sSync() is never
ed40: 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69   called.  This i
ed50: 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a  s the default.**
ed60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
ed70: 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20  r temporary and 
ed80: 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e  transient files.
ed90: 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c  .**.**    NORMAL
eda0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
edb0: 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62  is synced once b
edc0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
edd0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
ede0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
edf0: 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  se.  This is nor
ee00: 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70  mally adequate p
ee10: 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a  rotection, but.*
ee20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
ee30: 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c  t is theoretical
ee40: 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f  ly possible, tho
ee50: 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c  ugh very unlikel
ee60: 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  y,.**           
ee70: 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65     that an inope
ee80: 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c  rtune power fail
ee90: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20  ure could leave 
eea0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  the journal.**  
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61              in a
eec0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75   state which wou
eed0: 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20  ld cause damage 
eee0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
eef0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ef00: 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65  when it is rolle
ef10: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
ef20: 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a   FULL      The j
ef30: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
ef40: 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72   twice before wr
ef50: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
ef60: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
ef70: 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68    database (with
ef80: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
ef90: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74   information - t
efa0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a  he nRec field.**
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
efc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
efd0: 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74  der - being writ
efe0: 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74  ten in between t
eff0: 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20  he two.**       
f000: 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20         syncs).  
f010: 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61  If we assume tha
f020: 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20  t writing a.**  
f030: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67              sing
f040: 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69  le disk sector i
f050: 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74  s atomic, then t
f060: 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65  his mode provide
f070: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  s.**            
f080: 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74    assurance that
f090: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c   the journal wil
f0a0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
f0b0: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  ed to the.**    
f0c0: 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20            point 
f0d0: 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67  of causing damag
f0e0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
f0f0: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
f100: 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63  k..**.** Numeric
f110: 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74   values associat
f120: 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74  ed with these st
f130: 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c  ates are OFF==1,
f140: 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e   NORMAL=2,.** an
f150: 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66  d FULL=3..*/.#if
f160: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f170: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76  _PAGER_PRAGMAS.v
f180: 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
f190: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50  SetSafetyLevel(P
f1a0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
f1b0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 62 46 75  t level, int bFu
f1c0: 6c 6c 46 73 79 6e 63 29 7b 0a 20 20 70 50 61 67  llFsync){.  pPag
f1d0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
f1e0: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
f1f0: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
f200: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
f210: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
f220: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
f230: 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66    pPager->sync_f
f240: 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46 73 79  lags = (bFullFsy
f250: 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  nc?SQLITE_SYNC_F
f260: 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL:SQLITE_SYNC_
f270: 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70  NORMAL);.  if( p
f280: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
f290: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
f2a0: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
f2b0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
f2c0: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
f2d0: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
f2e0: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
f2f0: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
f300: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
f310: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
f320: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
f330: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
f340: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
f350: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
f360: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
f370: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
f380: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
f390: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
f3a0: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
f3b0: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
f3c0: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
f3d0: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
f3e0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
f3f0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
f400: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
f410: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
f420: 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69   fail. The OS wi
f430: 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ll automatically
f440: 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70   delete the temp
f450: 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68  orary.** file wh
f460: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
f470: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f480: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
f490: 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a 70 50  emp(.  Pager *pP
f4a0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  ager,        /* 
f4b0: 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  The pager object
f4c0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f4d0: 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a 20 57  le *pFile,  /* W
f4e0: 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65  rite the file de
f4f0: 73 63 72 69 70 74 6f 72 20 68 65 72 65 20 2a 2f  scriptor here */
f500: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
f510: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
f520: 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
f530: 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f 0a 29   to the VFS */.)
f540: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
f550: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f560: 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65    sqlite3_opente
f570: 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20  mp_count++;  /* 
f580: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
f590: 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
f5a0: 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ly */.#endif..  
f5b0: 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53 51 4c  vfsFlags |=  SQL
f5c0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
f5d0: 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
f5e0: 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20  _CREATE |.      
f5f0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
f600: 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20 53 51  N_EXCLUSIVE | SQ
f610: 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
f620: 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20 3d 20  ONCLOSE;.  rc = 
f630: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 50  sqlite3OsOpen(pP
f640: 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c 20 70  ager->pVfs, 0, p
f650: 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73 2c 20  File, vfsFlags, 
f660: 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
f670: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
f680: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
f690: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f6a0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  ..static int pag
f6b0: 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a 2c  erStress(void *,
f6c0: 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  PgHdr *);../*.**
f6d0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
f6e0: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
f6f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
f700: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
f710: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
f720: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
f730: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
f740: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
f750: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
f760: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
f770: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
f780: 65 72 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f  erGet() and is o
f790: 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e  nly held open un
f7a0: 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20  til the.** last 
f7b0: 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
f7c0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61   using sqlite3Pa
f7d0: 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a  gerUnref()..**.*
f7e0: 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
f7f0: 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61  s NULL then a ra
f800: 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d  ndomly-named tem
f810: 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 63  porary file is c
f820: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73  reated.** and us
f830: 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20 74  ed as the file t
f840: 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20 54 68  o be cached.  Th
f850: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64  e file will be d
f860: 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61  eleted.** automa
f870: 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20  tically when it 
f880: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
f890: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
f8a0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
f8b0: 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
f8c0: 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68   is held in cach
f8d0: 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65  e..** It is neve
f8e0: 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  r written to dis
f8f0: 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  k.  This can be 
f900: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
f910: 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  t an.** in-memor
f920: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  y database..*/.i
f930: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f  nt sqlite3PagerO
f940: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
f950: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
f960: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 66  /* The virtual f
f970: 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20 75 73  ile system to us
f980: 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 2a 70  e */.  Pager **p
f990: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20  pPager,         
f9a0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61  /* Return the Pa
f9b0: 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65  ger structure he
f9c0: 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
f9d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
f9e0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
f9f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
fa00: 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
fa10: 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20  Extra,          
fa20: 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74      /* Extra byt
fa30: 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63  es append to eac
fa40: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
fa50: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa70: 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c  * flags controll
fa80: 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f  ing this file */
fa90: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
fab0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
fac0: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
fad0: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
fae0: 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50  .  u8 *pPtr;.  P
faf0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
fb00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
fb10: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
fb20: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
fb30: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
fb40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
fb50: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Only = 0;.  int 
fb60: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c  useJournal = (fl
fb70: 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54  ags & PAGER_OMIT
fb80: 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20  _JOURNAL)==0;.  
fb90: 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  int noReadlock =
fba0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
fbb0: 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b  NO_READLOCK)!=0;
fbc0: 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69  .  int journalFi
fbd0: 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20 70 63  leSize;.  int pc
fbe0: 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  acheSize = sqlit
fbf0: 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 3b 0a  e3PcacheSize();.
fc00: 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66 6c 74    int szPageDflt
fc10: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
fc20: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
fc30: 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 20 3d  har *zPathname =
fc40: 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e   0;.  int nPathn
fc50: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ame = 0;..  if( 
fc60: 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53 69  sqlite3JournalSi
fc70: 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74 65 33  ze(pVfs)>sqlite3
fc80: 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 29  MemJournalSize()
fc90: 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   ){.    journalF
fca0: 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
fcb0: 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
fcc0: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
fcd0: 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
fce0: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75   = sqlite3MemJou
fcf0: 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20 7d 0a  rnalSize();.  }.
fd00: 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
fd10: 74 20 72 65 74 75 72 6e 20 69 73 20 61 20 4e 55  t return is a NU
fd20: 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  LL pointer */.  
fd30: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20  *ppPager = 0;.. 
fd40: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20   /* Compute and 
fd50: 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70  store the full p
fd60: 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c  athname in an al
fd70: 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 20 70  located buffer p
fd80: 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62  ointed.  ** to b
fd90: 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e  y zPathname, len
fda0: 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f  gth nPathname. O
fdb0: 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20  r, if this is a 
fdc0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a  temporary file,.
fdd0: 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20    ** leave both 
fde0: 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50  nPathname and zP
fdf0: 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30  athname set to 0
fe00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
fe10: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
fe20: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50  ame[0] ){.    nP
fe30: 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
fe40: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
fe50: 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71    zPathname = sq
fe60: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74  lite3Malloc(nPat
fe70: 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66  hname*2);.    if
fe80: 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29  ( zPathname==0 )
fe90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
fea0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
feb0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
fec0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
fed0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
fee0: 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72  Filename,":memor
fef0: 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  y:")==0 ){.     
ff00: 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20   memDb = 1;.    
ff10: 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d    zPathname[0] =
ff20: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65   0;.    }else.#e
ff30: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
ff40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
ff50: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
ff60: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61  , zFilename, nPa
ff70: 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
ff80: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
ff90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ffa0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ffb0: 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
ffc0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
ffd0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  c;.    }.    nPa
ffe0: 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28  thname = strlen(
fff0: 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zPathname);.  }.
10000 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
10010 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70 61  emory for the pa
10020 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ger structure */
10030 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69  .  pPager = sqli
10040 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20  te3MallocZero(. 
10050 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65     sizeof(*pPage
10060 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  r) +           /
10070 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  * Pager structur
10080 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65 53  e */.    pcacheS
10090 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20 20  ize      +      
100a0 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20 6f       /* PCache o
100b0 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f 75  bject */.    jou
100c0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20  rnalFileSize +  
100d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
100e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72  journal file str
100f0 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70  ucture */ .    p
10100 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20 2b  Vfs->szOsFile  +
10110 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10120 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20 2a  e main db file *
10130 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c  /.    journalFil
10140 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20 20  eSize * 2 +     
10150 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75    /* The two jou
10160 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20  rnal files */ . 
10170 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20 2b     3*nPathname +
10180 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f   40            /
10190 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69  * zFilename, zDi
101a0 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61  rectory, zJourna
101b0 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  l */.  );.  if( 
101c0 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73  !pPager ){.    s
101d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
101e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  hname);.    retu
101f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
10200 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
10210 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68 65  PCache = (PCache
10220 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20   *)&pPager[1];. 
10230 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29 26   pPtr = ((u8 *)&
10240 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63 61  pPager[1]) + pca
10250 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  cheSize;.  pPage
10260 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76 66  r->vfsFlags = vf
10270 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65 72  sFlags;.  pPager
10280 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  ->fd = (sqlite3_
10290 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
102a0 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a 20  ->szOsFile*0];. 
102b0 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d 20   pPager->stfd = 
102c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
102d0 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
102e0 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile];.  pPager->
102f0 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66  jfd = (sqlite3_f
10300 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d  ile*)&pPtr[pVfs-
10310 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e 61  >szOsFile+journa
10320 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  lFileSize];.  pP
10330 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
10340 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b 70  = (char*)&pPtr[p
10350 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32 2a  Vfs->szOsFile+2*
10360 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 5d  journalFileSize]
10370 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  ;.  pPager->zDir
10380 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72  ectory = &pPager
10390 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61 74  ->zFilename[nPat
103a0 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
103b0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
103c0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
103d0 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b  ry[nPathname+1];
103e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
103f0 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a 50  = pVfs;.  if( zP
10400 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6d  athname ){.    m
10410 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46  emcpy(pPager->zF
10420 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61  ilename, zPathna
10430 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
10440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10450 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
10460 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
10470 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20 20  e pager file..  
10480 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
10490 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
104a0 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b 0a  0] && !memDb ){.
104b0 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61 6d      if( nPathnam
104c0 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e>(pVfs->mxPathn
104d0 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d 6a  ame - sizeof("-j
104e0 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
104f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10500 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
10510 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
10520 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
10530 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
10540 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
10550 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
10560 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
10570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10580 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
10590 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
105a0 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
105b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
105c0 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
105d0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
105e0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
105f0 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
10600 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
10610 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
10620 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
10630 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
10640 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
10650 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10660 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
10670 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
10680 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
10690 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
106a0 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
106b0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
106c0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
106d0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
106e0 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
106f0 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
10700 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
10710 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
10720 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
10730 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
10740 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
10750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10760 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
10770 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
10780 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
10790 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
107a0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
107b0 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
107c0 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
107d0 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
107e0 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53 69  Dflt = iSectorSi
107f0 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
10800 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10810 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
10820 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
10830 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
10840 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
10850 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
10860 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10870 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
10880 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
10890 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
108a0 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
108b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
108c0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
108d0 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
108e0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
108f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
10900 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
10910 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
10920 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
10930 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
10940 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
10950 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
10960 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
10970 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
10980 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
10990 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65  ii>>8)) ) szPage
109a0 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
109b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
109c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
109d0 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53  if( szPageDflt>S
109e0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
109f0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
10a00 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
10a10 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
10a20 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10a30 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
10a40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
10a50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
10a60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10a70 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
10a80 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
10a90 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
10aa0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10ab0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
10ac0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
10ad0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
10ae0 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
10af0 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
10b00 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
10b10 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
10b20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
10b30 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
10b40 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
10b50 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
10b60 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
10b70 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
10b80 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
10b90 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
10ba0 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
10bb0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
10bc0 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
10bd0 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
10be0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
10bf0 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
10c00 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
10c10 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
10c20 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
10c30 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
10c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10c50 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10c60 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
10c70 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c  Malloc(szPageDfl
10c80 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
10c90 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
10ca0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
10cb0 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
10cc0 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
10cd0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
10ce0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
10cf0 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
10d00 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
10d10 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
10d20 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
10d30 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
10d40 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
10d50 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
10d60 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
10d70 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
10d80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10d90 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
10da0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10db0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
10dc0 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
10dd0 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
10de0 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45  EM:rc);.  }.  nE
10df0 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
10e00 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
10e10 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
10e20 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
10e30 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e50 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
10e60 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
10e70 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
10e80 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
10e90 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
10ea0 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
10eb0 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
10ec0 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
10ed0 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
10ee0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
10ef0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
10f00 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
10f10 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
10f20 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
10f30 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
10f40 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
10f50 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
10f60 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
10f70 3b 0a 20 20 66 6f 72 28 69 3d 73 74 72 6c 65 6e  ;.  for(i=strlen
10f80 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
10f90 6f 72 79 29 3b 20 69 3e 30 20 26 26 20 70 50 61  ory); i>0 && pPa
10fa0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
10fb0 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
10fc0 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
10fd0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10fe0 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
10ff0 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
11000 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69  Journal[] */.  i
11010 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
11020 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
11030 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
11040 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
11050 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
11060 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
11070 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
11080 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
11090 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   9);.  }else{.  
110a0 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
110b0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  al = 0;.  }..  /
110c0 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
110d0 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
110e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
110f0 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 3b  al = useJournal;
11100 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  .  pPager->noRea
11110 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f  dlock = noReadlo
11120 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a  ck && readOnly;.
11130 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
11140 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
11150 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
11160 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
11170 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
11180 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
11190 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
111a0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
111b0 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65 44 66  eSize = szPageDf
111c0 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  lt;.  /* pPager-
111d0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
111e0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
111f0 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
11200 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
11210 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
11220 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
11230 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
11240 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
11250 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
11260 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
11270 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
11280 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11290 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
112a0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
112b0 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
112c0 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
112d0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
112e0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
112f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
11300 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
11310 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
11320 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
11330 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
11340 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
11350 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
11360 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
11370 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
11380 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
11390 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
113a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
113b0 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
113c0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
113d0 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
113e0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
113f0 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
11400 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
11410 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
11420 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
11430 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
11440 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
11450 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
11460 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
11470 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
11480 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
11490 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
114a0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
114b0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
114c0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
114d0 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
114e0 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
114f0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11500 2d 3e 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72  ->nExtra = nExtr
11510 61 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  a;.  pPager->jou
11520 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
11530 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a  SQLITE_DEFAULT_J
11540 4f 55 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49  OURNAL_SIZE_LIMI
11550 54 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67  T;.  assert(pPag
11560 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
11570 7c 7c 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73  ||tempFile);.  s
11580 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
11590 67 65 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44  ger);.  if( memD
115a0 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
115b0 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50  >journalMode = P
115c0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
115d0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f  _MEMORY;.  }.  /
115e0 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
115f0 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20  andler = 0; */. 
11600 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65   /* memset(pPage
11610 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
11620 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
11630 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67  h)); */.  *ppPag
11640 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
11650 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
11670 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11680 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
11690 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
116a0 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65  Busyhandler(Page
116b0 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48  r *pPager, BusyH
116c0 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e  andler *pBusyHan
116d0 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  dler){.  pPager-
116e0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
116f0 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a  pBusyHandler;.}.
11700 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
11710 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
11720 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
11730 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
11740 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
11750 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
11760 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
11770 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
11780 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
11790 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
117a0 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
117b0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
117c0 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
117d0 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
117e0 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
117f0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
11800 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
11810 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
11820 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
11830 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
11840 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
11850 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
11860 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
11870 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
11880 65 2a 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  e*)){.  pPager->
11890 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
118a0 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
118b0 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
118c0 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
118d0 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
118e0 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
118f0 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
11900 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
11910 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
11920 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
11930 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
11940 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
11950 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
11960 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
11970 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
11980 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
11990 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
119a0 64 65 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  de;.  if( rc==SQ
119b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
119c0 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70  16 pageSize = *p
119d0 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73  PageSize;.    as
119e0 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d  sert( pageSize==
119f0 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d  0 || (pageSize>=
11a00 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
11a10 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
11a20 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66  _SIZE) );.    if
11a30 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
11a40 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
11a50 70 61 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26  pageSize .     &
11a60 26 20 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  & (pPager->memDb
11a70 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64  ==0 || pPager->d
11a80 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26  bSize==0).     &
11a90 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
11aa0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
11ab0 70 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20  pPCache)==0 .   
11ac0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
11ad0 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73  pNew = (char *)s
11ae0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
11af0 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
11b00 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20    if( !pNew ){. 
11b10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11b20 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11b30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
11b40 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
11b50 72 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  r);.        pPag
11b60 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
11b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
11b80 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65   if( !pPager->me
11b90 6d 44 62 20 29 20 73 65 74 53 65 63 74 6f 72 53  mDb ) setSectorS
11ba0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
11bb0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
11bc0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
11bd0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20  pSpace);.       
11be0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
11bf0 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ce = pNew;.     
11c00 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
11c10 53 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67  SetPageSize(pPag
11c20 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
11c30 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
11c40 20 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65      }.    *pPage
11c50 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
11c60 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72  ageSize;.  }.  r
11c70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11c80 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
11c90 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
11ca0 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
11cb0 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
11cc0 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
11cd0 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
11ce0 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
11cf0 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
11d00 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
11d10 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
11d20 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
11d30 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
11d40 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
11d50 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
11d60 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
11d70 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
11d80 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
11d90 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
11da0 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
11db0 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
11dc0 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
11dd0 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
11de0 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
11df0 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
11e00 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
11e10 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
11e20 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
11e30 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
11e40 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
11e50 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
11e60 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
11e70 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
11e80 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
11e90 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
11ea0 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
11eb0 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
11ec0 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
11ed0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
11ee0 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
11ef0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
11f00 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
11f10 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
11f20 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
11f30 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
11f40 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
11f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11f60 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
11f70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11f80 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
11f90 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
11fa0 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
11fb0 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
11fc0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
11fd0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
11fe0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
11ff0 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
12000 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
12010 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
12020 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
12030 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
12040 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
12050 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
12060 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
12070 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
12080 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
12090 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
120a0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
120b0 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
120c0 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
120d0 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
120e0 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
120f0 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
12100 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
12110 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
12120 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
12130 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
12140 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
12150 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
12160 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
12170 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
12180 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
12190 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
121a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
121b0 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
121c0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
121d0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
121e0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
121f0 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
12200 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
12210 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12220 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
12230 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
12240 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
12250 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
12260 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
12270 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
12280 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
12290 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
122a0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
122b0 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
122c0 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
122d0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
122e0 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
122f0 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
12300 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
12310 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
12320 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
12330 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
12340 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
12350 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
12360 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
12370 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
12380 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12390 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
123a0 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
123b0 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
123c0 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
123d0 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
123e0 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
123f0 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
12400 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
12410 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
12420 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
12430 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
12440 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
12450 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
12460 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
12470 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
12480 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
12490 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
124a0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
124b0 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
124c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
124d0 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
124e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
124f0 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
12500 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  ;.  assert(pPage
12510 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
12520 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
12530 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
12540 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
12550 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  {.    IOTRACE(("
12560 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
12570 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
12580 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12590 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
125a0 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20   pDest, N, 0);. 
125b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
125c0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
125d0 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
125e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
125f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
12600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12610 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
12620 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
12630 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
12640 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
12650 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
12660 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
12670 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
12680 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
12690 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
126a0 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
126b0 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
126c0 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
126d0 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
126e0 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
126f0 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
12700 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
12710 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
12720 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
12730 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
12740 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
12750 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
12760 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
12770 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
12780 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
12790 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65  ger, int *pnPage
127a0 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a  ){.  i64 n = 0;.
127b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
127c0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
127d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
127e0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
127f0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
12800 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  de;.    return r
12810 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
12820 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
12830 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
12840 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
12850 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74 28  se {.    assert(
12860 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
12870 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
12880 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  mpFile);.    if(
12890 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   (pPager->fd->pM
128a0 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26 20  ethods).     && 
128b0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
128c0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
128d0 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45  fd, &n))!=SQLITE
128e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
128f0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
12900 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75   rc);.      retu
12910 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
12920 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
12930 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
12940 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
12950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12960 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
12970 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
12980 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
12990 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
129a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
129b0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
129c0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
129d0 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
129e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
129f0 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
12a00 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d  .  if( n>pPager-
12a10 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70  >mxPgno ){.    p
12a20 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
12a30 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 50  n;.  }.  if( pnP
12a40 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61  age ){.    *pnPa
12a50 67 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65  ge = n;.  }.  re
12a60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12a70 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  }../*.** Forward
12a80 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
12a90 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
12aa0 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
12ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12ac0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 74  ine is used to t
12ad0 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68  runcate the cach
12ae0 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73  e when a databas
12af0 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74 65  e.** is truncate
12b00 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74 68  d.  Drop from th
12b10 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67 65  e cache all page
12b20 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 0a  s whose pgno is.
12b30 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  ** larger than p
12b40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
12b50 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
12b60 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  d..**.** Referen
12b70 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65 72  ced pages larger
12b80 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
12b90 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  Size are zeroed.
12ba0 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  .**.** Actually,
12bb0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   at the point th
12bc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12bd0 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20 62  lled, it would b
12be0 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f  e.** an error to
12bf0 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e 63   have a referenc
12c00 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72 61  ed page.  But ra
12c10 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74 65  ther than delete
12c20 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61 6e  .** that page an
12c30 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73 75  d guarantee a su
12c40 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75 6c  bsequent segfaul
12c50 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74 74  t, it seems bett
12c60 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69 74  er.** to zero it
12c70 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20 77   and hope that w
12c80 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e 65  e error out sane
12c90 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
12ca0 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
12cb0 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
12cc0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
12cd0 33 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28  3PcacheTruncate(
12ce0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
12cf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
12d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
12d10 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
12d20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
12d30 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
12d40 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
12d50 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
12d60 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
12d70 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
12d80 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
12d90 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
12da0 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
12db0 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
12dc0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
12dd0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
12de0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
12df0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
12e00 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
12e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12e20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12e30 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
12e40 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
12e50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
12e60 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
12e70 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
12e80 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
12e90 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
12ea0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
12eb0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
12ec0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
12ed0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
12ee0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
12ef0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
12f00 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
12f10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
12f20 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
12f30 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
12f40 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
12f50 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
12f60 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
12f70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
12f80 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
12f90 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
12fa0 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  <0 );..  if( pPa
12fb0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
12fc0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
12fd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
12fe0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
12ff0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
13000 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75 73  r ) pPager->pBus
13010 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79 20  yHandler->nBusy 
13020 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  = 0;.    do {.  
13030 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13040 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
13050 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
13060 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
13070 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
13080 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
13090 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
130a0 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
130b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
130c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
130d0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
130e0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
130f0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
13100 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
13110 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
13120 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
13130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
13140 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
13150 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
13160 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
13170 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
13180 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
13190 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
131a0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
131b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
131c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
131d0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
131e0 44 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  D );..  sqlite3P
131f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
13200 61 67 65 72 2c 20 30 29 3b 0a 20 20 69 66 28 20  ager, 0);.  if( 
13210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
13220 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
13230 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
13240 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3c 28  else if( nPage<(
13250 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
13260 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
13270 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
13280 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
132a0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
132b0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
132c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
132d0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
132e0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ng. */.      rc 
132f0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
13300 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
13310 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
13320 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
13330 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13340 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
13350 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
13360 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
13370 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
13380 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
13390 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
133a0 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
133b0 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
133c0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
133d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
133e0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
133f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
13400 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
13410 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
13420 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
13430 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
13440 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
13450 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
13460 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
13470 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
13480 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
13490 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
134a0 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
134b0 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
134c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
134d0 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
134e0 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
134f0 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
13500 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
13510 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
13520 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
13530 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
13540 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
13550 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
13560 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
13570 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
13580 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
13590 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
135a0 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
135b0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
135c0 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
135d0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
135e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
135f0 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
13600 65 72 29 7b 0a 0a 20 20 64 69 73 61 62 6c 65 5f  er){..  disable_
13610 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
13620 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
13630 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
13640 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  c();.  pPager->e
13650 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
13660 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
13670 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
13680 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
13690 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
136a0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
136b0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
136c0 72 29 3b 0a 20 20 7d 0a 20 20 65 6e 61 62 6c 65  r);.  }.  enable
136d0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
136e0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
136f0 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
13700 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  ();.  PAGERTRACE
13710 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
13720 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
13730 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
13740 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
13750 72 29 29 0a 20 20 69 66 28 20 70 50 61 67 65 72  r)).  if( pPager
13760 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
13770 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
13780 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
13790 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
137a0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
137b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
137c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
137d0 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
137e0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
137f0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
13800 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
13810 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
13820 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
13830 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c   }.  sqlite3OsCl
13840 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
13850 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
13860 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
13870 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
13880 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
13890 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
138a0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
138b0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
138c0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
138d0 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69  * }.  */..  sqli
138e0 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67  te3PageFree(pPag
138f0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
13900 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
13910 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43  lose(pPager->pPC
13920 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  ache);.  sqlite3
13930 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  _free(pPager);. 
13940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13950 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  K;.}..#if !defin
13960 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65  ed(NDEBUG) || de
13970 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
13980 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
13990 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
139a0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
139b0 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f  ge data..*/.Pgno
139c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
139d0 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a  enumber(DbPage *
139e0 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  p){.  return p->
139f0 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  pgno;.}.#endif..
13a00 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
13a10 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
13a20 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
13a30 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
13a40 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
13a50 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
13a60 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
13a70 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
13a80 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71  Page *pPg){.  sq
13a90 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70  lite3PcacheRef(p
13aa0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
13ab0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13ac0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
13ad0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
13ae0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
13af0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
13b00 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
13b10 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
13b20 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
13b30 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
13b40 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
13b50 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
13b60 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
13b70 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
13b80 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
13b90 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
13ba0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
13bb0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
13bc0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13bd0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
13be0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
13bf0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
13c00 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
13c10 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
13c20 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
13c30 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
13c40 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
13c50 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
13c60 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
13c70 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
13c80 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
13c90 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13ca0 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
13cb0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13cc0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
13cd0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13ce0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
13cf0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
13d00 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
13d10 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
13d20 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
13d30 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13d40 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
13d50 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
13d60 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
13d70 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
13d80 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
13d90 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
13da0 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
13db0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13dc0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
13dd0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
13de0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
13df0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
13e00 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
13e10 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
13e20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
13e30 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
13e40 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
13e50 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
13e60 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
13e70 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
13e80 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
13e90 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
13ea0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
13eb0 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
13ec0 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
13ed0 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
13ee0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
13ef0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
13f00 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
13f10 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
13f20 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
13f30 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
13f40 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
13f50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
13f60 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
13f70 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
13f80 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
13f90 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
13fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13fb0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
13fc0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
13fd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13fe0 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20  ..  /* Sync the 
13ff0 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d  journal before m
14000 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69  odifying the mai
14010 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
14020 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20  (assuming there 
14030 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  is a journal and
14040 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
14050 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20  synced.).  */.  
14060 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  if( pPager->need
14070 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73 73 65  Sync ){.    asse
14080 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  rt( !pPager->tem
14090 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69 66 28  pFile );.    if(
140a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
140b0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
140c0 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
140d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
140e0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
140f0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
14100 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
14110 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14120 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14130 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
14140 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
14150 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
14160 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
14170 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
14180 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
14190 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
141a0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
141b0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
141c0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
141d0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
141e0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
141f0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
14200 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
14210 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
14220 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
14230 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
14240 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
14250 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
14260 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
14270 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
14280 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
14290 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
142a0 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
142b0 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
142c0 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
142d0 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
142e0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
142f0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
14300 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
14310 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
14320 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
14330 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
14340 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
14350 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
14360 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
14370 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
14380 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
14390 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
143a0 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
143b0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
143c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
143d0 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
143e0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
143f0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
14400 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
14410 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
14420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
14430 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
14440 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
14450 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
14470 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
14480 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
14490 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
144a0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
144b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
144c0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
144d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
144e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
144f0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
14500 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
14510 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
14520 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
14530 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  gic);.        IO
14540 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
14550 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
14560 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29  er, jrnlOff, 4))
14570 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
14580 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
14590 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
145a0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
145b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
145c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
145d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
145e0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
145f0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
14600 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
14610 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
14620 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
14630 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
14640 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
14650 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
14660 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
14670 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
14680 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
14690 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
146a0 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
146b0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
146c0 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
146d0 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
146e0 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
146f0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
14700 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
14710 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14720 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
14730 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
14740 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
14750 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
14760 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
14770 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
14780 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
14790 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
147a0 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 46  ite3PcacheClearF
147b0 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50 43  lags(pPager->pPC
147c0 61 63 68 65 2c 20 50 47 48 44 52 5f 4e 45 45 44  ache, PGHDR_NEED
147d0 5f 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 23 69 66  _SYNC);.  }..#if
147e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
147f0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
14800 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
14810 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
14820 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
14830 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
14840 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
14850 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
14860 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
14870 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
14880 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
14890 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
148a0 65 41 73 73 65 72 74 46 6c 61 67 73 28 70 50 61  eAssertFlags(pPa
148b0 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 30 2c  ger->pPCache, 0,
148c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
148d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
148e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
148f0 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73  *.** Given a lis
14900 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e  t of pages (conn
14910 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48  ected by the PgH
14920 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65  dr.pDirty pointe
14930 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72  r) write.** ever
14940 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  y one of those p
14950 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20  ages out to the 
14960 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
14970 6f 20 63 61 6c 6c 73 20 61 72 65 20 6d 61 64 65  o calls are made
14980 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2d  .** to the page-
14990 63 61 63 68 65 20 74 6f 20 6d 61 72 6b 20 74 68  cache to mark th
149a0 65 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e  e pages as clean
149b0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
149c0 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 6f 66  onsibility.** of
149d0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 75   the caller to u
149e0 73 65 20 50 63 61 63 68 65 43 6c 65 61 6e 41 6c  se PcacheCleanAl
149f0 6c 28 29 20 6f 72 20 50 63 61 63 68 65 4d 61 6b  l() or PcacheMak
14a00 65 43 6c 65 61 6e 28 29 20 74 6f 20 6d 61 72 6b  eClean() to mark
14a10 0a 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 73  .** the pages as
14a20 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
14a30 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
14a40 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
14a50 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
14a60 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
14a70 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
14a80 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
14a90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
14aa0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
14ab0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
14ac0 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
14ad0 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
14ae0 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
14af0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
14b00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
14b10 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
14b20 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
14b30 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
14b40 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
14b50 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
14b60 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
14b70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
14b80 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
14b90 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
14ba0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
14bb0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
14bc0 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
14bd0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
14be0 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
14bf0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
14c00 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
14c10 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
14c20 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
14c30 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
14c40 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
14c50 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
14c60 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
14c70 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
14c80 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
14c90 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
14ca0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
14cb0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
14cc0 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
14cd0 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
14ce0 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
14cf0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
14d00 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
14d10 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14d20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
14d30 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
14d40 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
14d50 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
14d60 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
14d70 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
14d80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
14d90 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
14da0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
14db0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
14dc0 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
14dd0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
14de0 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
14df0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
14e00 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
14e10 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
14e20 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
14e30 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14e40 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
14e50 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
14e60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14e70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14e80 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c    }..  while( pL
14e90 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 49  ist ){..    /* I
14ea0 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 6e  f the file has n
14eb0 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
14ec0 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
14ed0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
14ee0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14ef0 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  s ){.      asser
14f00 74 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  t(pPager->tempFi
14f10 6c 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  le);.      rc = 
14f20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
14f30 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61  temp(pPager, pPa
14f40 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
14f50 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20  >vfsFlags);.    
14f60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14f70 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
14f80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
14f90 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
14fa0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
14fb0 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
14fc0 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
14fd0 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
14fe0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
14ff0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
15000 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
15010 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
15020 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
15030 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
15040 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
15050 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
15060 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
15070 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
15080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15090 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
150a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20  ager->dbSize && 
150b0 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73  0==(pList->flags
150c0 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54  &PGHDR_DONT_WRIT
150d0 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  E) ){.      i64 
150e0 6f 66 66 73 65 74 20 3d 20 28 70 4c 69 73 74 2d  offset = (pList-
150f0 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  >pgno-1)*(i64)pP
15100 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
15110 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
15120 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
15130 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
15140 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
15150 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
15160 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE4("STORE %d pa
15170 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
15180 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15190 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
151a0 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
151b0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
151c0 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20  hash(pList));.  
151d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
151e0 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
151f0 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
15200 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
15210 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
15220 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
15230 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15240 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
15250 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
15260 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
15270 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
15280 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
15290 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
152a0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
152b0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
152c0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
152d0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
152e0 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
152f0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
15300 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
15310 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
15320 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
15330 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
15340 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
15350 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
15360 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
15370 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
15380 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
15390 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64   return rc;.#ifd
153a0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
153b0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
153c0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
153d0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
153e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
153f0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
15400 72 74 79 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  rty;.  }..  retu
15410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
15430 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
15440 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
15450 65 72 20 77 68 65 6e 20 69 74 20 68 61 73 20 72  er when it has r
15460 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a 2a 20 73  eached some.** s
15470 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69 6d 69 74  oft memory limit
15480 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  . The argument i
15490 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
154a0 20 70 75 72 67 65 61 62 6c 65 20 50 61 67 65 72   purgeable Pager
154b0 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69   .** object. Thi
154c0 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
154d0 70 74 73 20 74 6f 20 6d 61 6b 65 20 61 20 73 69  pts to make a si
154e0 6e 67 6c 65 20 64 69 72 74 79 20 70 61 67 65 20  ngle dirty page 
154f0 74 68 61 74 20 68 61 73 20 6e 6f 0a 2a 2a 20 6f  that has no.** o
15500 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
15510 65 6e 63 65 73 20 28 69 66 20 6f 6e 65 20 65 78  ences (if one ex
15520 69 73 74 73 29 20 63 6c 65 61 6e 20 73 6f 20 74  ists) clean so t
15530 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
15540 63 79 63 6c 65 64 20 0a 2a 2a 20 62 79 20 74 68  cycled .** by th
15550 65 20 70 63 61 63 68 65 20 6c 61 79 65 72 2e 0a  e pcache layer..
15560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
15570 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
15580 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
15590 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
155a0 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
155b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
155c0 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  OK;..  if( pPage
155d0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 29 7b 0a  r->doNotSync ){.
155e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
155f0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  E_OK;.  }..  ass
15600 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
15610 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
15620 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
15630 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
15640 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
15650 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
15660 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 72  _SYNC ){.      r
15670 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
15680 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
15690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
156a0 20 26 26 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c   && pPager->full
156b0 53 79 6e 63 20 26 26 20 0a 20 20 20 20 20 20 20  Sync && .       
156c0 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   !(pPager->journ
156d0 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
156e0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
156f0 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 28 73  ) &&.        !(s
15700 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
15710 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
15720 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
15730 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
15740 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ND).      ){.   
15750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
15760 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  c = 0;.        r
15770 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
15780 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
15790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
157a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
157b0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
157c0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
157d0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
157e0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
157f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
15800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15810 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
15820 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
15830 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
15840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15850 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
15860 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
15870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
15880 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
15890 75 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 69  urn 1 if there i
158a0 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  s a hot journal 
158b0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
158c0 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75  er..** A hot jou
158d0 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74  rnal is one that
158e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
158f0 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  yed back..**.** 
15900 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  If the current s
15910 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
15920 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75  ase file is 0 bu
15930 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  t a journal file
15940 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74  .** exists, that
15950 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20   is probably an 
15960 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74  old journal left
15970 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69   over from a pri
15980 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77  or.** database w
15990 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
159a0 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20  e.  Just delete 
159b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
159c0 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  ** Return negati
159d0 76 65 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20  ve if unable to 
159e0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 73 74  determine the st
159f0 61 74 75 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  atus of the jour
15a00 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
15a10 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
15a20 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   open the journa
15a30 6c 20 66 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e  l file to examin
15a40 65 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74  e its.** content
15a50 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 6a 6f  .  Hence, the jo
15a60 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74  urnal might cont
15a70 61 69 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ain the name of 
15a80 61 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  a master.** jour
15a90 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 68 61  nal file that ha
15aa0 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
15ab0 61 6e 64 20 68 65 6e 63 65 20 6e 6f 74 20 62 65  and hence not be
15ac0 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a 20 74 68 65   hot.  Or.** the
15ad0 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
15ae0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 62 65 20  ournal might be 
15af0 7a 65 72 6f 65 64 20 6f 75 74 2e 20 20 54 68 69  zeroed out.  Thi
15b00 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 64 6f 65  s routine.** doe
15b10 73 20 6e 6f 74 20 64 69 73 63 6f 76 65 72 20 74  s not discover t
15b20 68 65 73 65 20 63 61 73 65 73 20 6f 66 20 61 20  hese cases of a 
15b30 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  non-hot journal 
15b40 2d 20 69 66 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  - if the.** jour
15b50 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20  nal file exists 
15b60 61 6e 64 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  and is not empty
15b70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 73   this routine as
15b80 73 75 6d 65 73 20 69 74 0a 2a 2a 20 69 73 20 68  sumes it.** is h
15b90 6f 74 2e 20 20 54 68 65 20 70 61 67 65 72 5f 70  ot.  The pager_p
15ba0 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
15bb0 65 20 77 69 6c 6c 20 64 69 73 63 6f 76 65 72 20  e will discover 
15bc0 74 68 61 74 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  that the.** jour
15bd0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
15be0 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e 64 20 77  really hot and w
15bf0 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ill no-op..*/.st
15c00 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
15c10 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
15c20 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
15c30 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
15c40 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
15c50 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
15c60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
15c70 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 69   int exists;.  i
15c80 6e 74 20 6c 6f 63 6b 65 64 3b 0a 20 20 61 73 73  nt locked;.  ass
15c90 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
15ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15cb0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
15cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15cd0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
15ce0 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73 20 3d   );.  *pExists =
15cf0 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
15d00 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
15d10 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
15d20 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
15d30 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73  _EXISTS, &exists
15d40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
15d50 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73  ITE_OK && exists
15d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15d70 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
15d80 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
15d90 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20  fd, &locked);.  
15da0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
15db0 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20  TE_OK && exists 
15dc0 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  && !locked ){.  
15dd0 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20    int nPage;.   
15de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15df0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15e00 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
15e10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15e20 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28 20 6e  OK ){.     if( n
15e30 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
15e40 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
15e50 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
15e60 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
15e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15e80 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31      *pExists = 1
15e90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15ea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  .}../*.** Read t
15ec0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
15ed0 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
15ee0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15ef0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
15f00 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
15f10 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
15f20 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
15f30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
15f40 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
15f50 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
15f60 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
15f70 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
15f80 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
15f90 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
15fa0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
15fb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15fc0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
15fd0 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
15fe0 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
15ff0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
16000 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
16010 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
16020 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20  fd, pPg->pData, 
16030 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16040 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50 41 47  , offset);.  PAG
16050 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
16060 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
16070 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
16080 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
16090 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
160a0 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
160b0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 69  ger, pgno));.  i
160c0 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
160d0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
160e0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
160f0 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74 61 29  (u8*)pPg->pData)
16100 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16130 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
16140 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
16150 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
16160 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61 74 61  ager, pPg->pData
16170 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
16180 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
16190 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
161a0 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a   hash(%08x)\n",.
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
161c0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
161d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72  pPg->pgno, pager
161e0 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
161f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16210 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16220 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73 68  to obtain the sh
16230 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69 72  ared lock requir
16240 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61 74  ed before.** dat
16250 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66 72  a may be read fr
16260 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
16270 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72 65  he. If the share
16280 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65 61  d lock has alrea
16290 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61 69  dy.** been obtai
162a0 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ned, this functi
162b0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
162c0 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c 79  *.** Immediately
162d0 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e 67   after obtaining
162e0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
162f0 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c 20   (if required), 
16300 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
16310 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68 6f   checks for a ho
16320 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  t-journal file. 
16330 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64 2c  If one is found,
16340 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f   an emergency ro
16350 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65 72  llback.** is per
16360 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74 65  formed immediate
16370 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
16380 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
16390 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
163a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
163b0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 73  ITE_OK;.  int is
163c0 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30 3b 0a  ErrorReset = 0;.
163d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
163e0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
163f0 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61   for exclusive a
16400 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75  ccess, has no ou
16410 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
16420 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73 20  page references 
16430 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72  and is in an err
16440 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73  or-state, now is
16450 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63   the chance to c
16460 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72  lear.  ** the er
16470 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68 65  ror. Discard the
16480 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
16490 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
164a0 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20   treat any.  ** 
164b0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
164c0 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e as a hot-journ
164d0 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  al..  */.  if( !
164e0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
164f0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
16500 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
16510 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
16520 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
16530 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
16540 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  de .  ){.    if(
16550 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16560 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
16570 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31 3b 0a  ErrorReset = 1;.
16580 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
16590 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
165a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67 65 72  TE_OK;.    pager
165b0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
165c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
165d0 20 70 61 67 65 72 20 69 73 20 73 74 69 6c 6c 20   pager is still 
165e0 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74 61 74  in an error stat
165f0 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63 65 65  e, do not procee
16600 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a 20 20  d. The error .  
16610 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20 62 65  ** state will be
16620 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f 6d 65   cleared at some
16630 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
16640 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20 70 61  ture when all pa
16650 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e  ge .  ** referen
16660 63 65 73 20 61 72 65 20 64 72 6f 70 70 65 64 20  ces are dropped 
16670 61 6e 64 20 74 68 65 20 63 61 63 68 65 20 63 61  and the cache ca
16680 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 2e 0a  n be discarded..
16690 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
166a0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
166b0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
166c0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
166d0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
166e0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20  >errCode;.  }.. 
166f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16700 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
16710 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73 65 74   || isErrorReset
16720 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16730 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
16740 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 61 73  er->pVfs;.    as
16750 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
16760 20 20 20 20 69 6e 74 20 69 73 48 6f 74 4a 6f 75      int isHotJou
16770 72 6e 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74  rnal;.    assert
16780 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
16790 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
167a0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
167b0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
167c0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
167d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
167e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
167f0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
16800 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16820 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16830 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
16840 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
16850 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
16860 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16870 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
16880 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16890 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
168a0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  LOCK );.    }.. 
168b0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
168c0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
168d0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
168e0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
168f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
16900 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16910 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16920 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16930 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16940 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
16950 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
16960 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
16970 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
16980 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  isHotJournal);. 
16990 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
169a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
169b0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
169c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
169d0 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65   if( isErrorRese
169e0 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61  t || isHotJourna
169f0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
16a00 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16a10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16a20 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16a30 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16a40 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
16a50 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
16a60 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16a70 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16a80 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16a90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16aa0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
16ab0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
16ac0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
16ad0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16ae0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16af0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
16b00 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
16b10 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
16b20 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
16b30 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
16b40 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
16b50 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
16b60 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
16b70 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
16b80 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
16b90 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
16ba0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
16bb0 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
16bc0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
16bd0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
16be0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
16bf0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
16c00 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74   to.      ** obt
16c10 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
16c20 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16c30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16c40 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16c50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16c60 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
16c70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16c80 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
16c90 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
16ca0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
16cb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16cc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16cd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
16ce0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16cf0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
16d00 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
16d10 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16d20 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16d30 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
16d40 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
16d50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
16d60 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
16d70 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
16d80 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
16d90 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
16da0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
16db0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
16dc0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
16dd0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
16de0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
16df0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
16e00 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
16e10 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
16e20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
16e30 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
16e40 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
16e50 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
16e60 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
16e70 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
16e80 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
16e90 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
16ea0 52 65 73 65 74 20 26 26 20 70 50 61 67 65 72 2d  Reset && pPager-
16eb0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
16ec0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
16ed0 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
16ee0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
16ef0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
16f00 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
16f10 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
16f20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16f40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
16f50 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
16f60 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
16f70 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
16f80 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
16f90 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
16fa0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
16fb0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
16fc0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
16fd0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
16fe0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16ff0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
17000 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
17010 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
17020 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
17030 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
17040 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
17050 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
17060 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
17070 20 20 20 20 20 69 66 28 20 66 6f 75 74 26 53 51       if( fout&SQ
17080 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
17090 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
170a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
170b0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
170c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
170d0 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
170e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
170f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
17100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17110 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 64 6f  f the journal do
17120 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
17130 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20 6f 74  at means some ot
17140 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 20 20  her process.    
17150 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 61          ** has a
17160 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20 69 74  lready rolled it
17170 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   back */.       
17180 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17190 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
171a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
171b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
171c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
171d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
171e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
171f0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
17200 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20  _UNLOCK .       
17210 20 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f    && rc!=SQLITE_
17220 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20 20  IOERR_NOMEM .   
17230 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17240 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17250 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  SY;.        }.  
17260 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
17270 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
17280 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17290 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
172a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
172b0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
172c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
172d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
172e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
172f0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  r = 0;.      pPa
17300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
17310 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20  = 0;. .      /* 
17320 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
17330 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
17340 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
17350 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
17360 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63  ** lock and reac
17370 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
17380 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ock..      */.  
17390 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
173a0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
173b0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
173c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
173d0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
173e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
173f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  rc);.        got
17400 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
17410 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  }.      assert(p
17420 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17430 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20  GER_SHARED || . 
17440 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
17450 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
17460 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
17470 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  >PAGER_SHARED). 
17480 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
17490 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
174a0 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
174b0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
174c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
174d0 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
174e0 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
174f0 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
17500 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  ase file.      *
17510 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
17520 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
17530 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
17540 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
17550 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
17560 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
17570 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
17580 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
17590 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e       ** has been
175a0 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66 20 74   modified.  If t
175b0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20  he database has 
175c0 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68 20 74  changed, flush t
175d0 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 63 68  he.      ** cach
175e0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
175f0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
17600 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
17610 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
17620 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
17630 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  ng.      ** at o
17640 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
17650 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
17660 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
17670 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
17680 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
17690 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
176a0 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
176b0 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
176c0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
176d0 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
176e0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
176f0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
17700 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
17710 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
17720 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54    ** .      ** T
17730 68 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68  here is a vanish
17740 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e  ingly small chan
17750 63 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65  ce that a change
17760 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20   will not be .  
17770 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e      ** detected.
17780 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20    The chance of 
17790 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68  an undetected ch
177a0 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c  ange is so small
177b0 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 69   that.      ** i
177c0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
177d0 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
177e0 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
177f0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
17800 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
17810 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17820 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17830 65 72 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 69  er, 0);..      i
17840 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
17850 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  de ){.        rc
17860 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
17870 64 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  de;.        goto
17880 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
17890 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
178a0 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
178b0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
178c0 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
178d0 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
178e0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
178f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17900 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
17910 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
17920 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
17930 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
17940 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17960 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
17970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
17980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17990 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
179a0 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
179b0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
179c0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
179d0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
179e0 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
179f0 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
17a00 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
17a10 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
17a20 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
17a30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17a40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17a50 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
17a60 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
17a70 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
17a80 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17a90 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
17aa0 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
17ab0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17ac0 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
17ad0 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20    }.. failed:.  
17ae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17af0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  K ){.    /* page
17b00 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20  r_unlock() is a 
17b10 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73  no-op for exclus
17b20 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d  ive mode and in-
17b30 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
17b40 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75  . */.    pager_u
17b50 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
17b60 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17b70 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
17b80 72 65 20 77 65 20 68 61 76 65 20 74 68 65 20 63  re we have the c
17b90 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67  ontent for a pag
17ba0 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
17bb0 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c  was.** previousl
17bc0 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
17bd0 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
17be0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  en the content w
17bf0 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69  as.** just initi
17c00 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20  alized to zeros 
17c10 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67  instead of being
17c20 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
17c30 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e  .** But now we n
17c40 65 65 64 20 74 68 65 20 72 65 61 6c 20 64 61 74  eed the real dat
17c50 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20  a off of disk.  
17c60 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a  So make sure we.
17c70 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65 61  ** have it.  Rea
17c80 64 20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f  d it in if we do
17c90 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72   not have it alr
17ca0 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eady..*/.static 
17cb0 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  int pager_get_co
17cc0 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ntent(PgHdr *pPg
17cd0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  ){.  if( pPg->fl
17ce0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 52  ags&PGHDR_NEED_R
17cf0 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  EAD ){.    int r
17d00 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
17d10 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
17d20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
17d30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
17d50 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
17d60 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20  _NEED_READ;.    
17d70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
17d80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17d90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17da0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
17db0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
17dc0 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63 68 65  count has reache
17dd0 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68 65 20  d zero, and the 
17de0 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20  pager is not in 
17df0 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20 6f 66  the.** middle of
17e00 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
17e10 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64 20 69  tion or opened i
17e20 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
17e30 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20  , unlock it..*/ 
17e40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
17e50 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64  erUnlockIfUnused
17e60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17e70 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33 50  .  if( (sqlite3P
17e80 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17e90 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17ea0 30 29 0a 20 20 20 20 26 26 20 28 21 70 50 61 67  0).    && (!pPag
17eb0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
17ec0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
17ed0 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
17ee0 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
17ef0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
17f00 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
17f10 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66 72  * Drop a page fr
17f20 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73 69  om the cache usi
17f30 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
17f40 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Drop()..**.** If
17f50 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72   this means ther
17f60 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67  e are now no pag
17f70 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e 63  es with referenc
17f80 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f  es to them, a ro
17f90 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
17fa0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
17fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
17fc0 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61   removed..*/.sta
17fd0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44 72  tic void pagerDr
17fe0 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  opPage(DbPage *p
17ff0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
18000 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
18010 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  er;.  sqlite3Pca
18020 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
18030 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
18040 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  sed(pPager);.}..
18050 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
18060 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65  page..**.** A re
18070 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
18080 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61  isk file is obta
18090 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66 69  ined when the fi
180a0 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71 75  rst page is acqu
180b0 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72  ired. .** This r
180c0 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70  ead lock is drop
180d0 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ped when the las
180e0 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
180f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
18100 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
18110 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
18120 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
18130 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
18140 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
18150 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
18160 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
18170 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
18180 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
18190 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
181a0 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
181b0 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
181c0 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
181d0 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
181e0 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
181f0 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
18200 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
18210 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
18220 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
18230 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
18240 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
18250 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
18260 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
18270 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
18280 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
18290 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
182a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
182b0 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
182c0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
182d0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
182e0 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
182f0 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
18300 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70  utine and Lookup
18310 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
18320 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
18330 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
18340 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
18350 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
18360 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
18370 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
18380 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
18390 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
183a0 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a  reas Lookup().**
183b0 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e   just returns 0.
183c0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61    This routine a
183d0 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c  cquires a read-l
183e0 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69  ock the first ti
183f0 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20  me it.** has to 
18400 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20  go to disk, and 
18410 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62  could also playb
18420 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  ack an old journ
18430 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  al if necessary.
18440 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70  .** Since Lookup
18450 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
18460 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
18470 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
18480 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
18490 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a  rnal files..**.*
184a0 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69  * If noContent i
184b0 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67  s false, the pag
184c0 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61  e contents are a
184d0 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
184e0 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f  m disk..** If no
184f0 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
18500 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
18510 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
18520 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
18530 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
18540 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f  at this time, so
18550 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73   do not do a dis
18560 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69  k read.  Just fi
18570 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ll in the.** pag
18580 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
18590 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20  eros.  But mark 
185a0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65  the fact that we
185b0 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74   have not read t
185c0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79  he.** content by
185d0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
185e0 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67  dr.needRead flag
185f0 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20  .  Later on, if 
18600 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
18610 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  Write() is calle
18620 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f  d on this page o
18630 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
18640 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61  e is.** called a
18650 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74  gain with noCont
18660 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61  ent==0, that mea
18670 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
18680 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ent is needed.**
18690 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65   and the disk re
186a0 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
186b0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
186c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
186d0 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
186e0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
186f0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
18700 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
18710 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
18720 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
18730 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
18740 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
18750 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
18760 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
18770 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
18780 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
18790 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
187a0 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
187b0 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
187c0 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
187d0 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20  e */.){.  PgHdr 
187e0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20  *pPg = 0;.  int 
187f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
18800 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
18810 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20  GER_UNLOCK .    
18820 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61     || sqlite3Pca
18830 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
18840 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a  er->pPCache)>0 .
18850 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d         || pgno==
18860 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  1.  );..  /* The
18870 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75   maximum page nu
18880 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65  mber is 2^31. Re
18890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
188a0 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20  UPT if a page.  
188b0 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ** number greate
188c0 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20  r than this, or 
188d0 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74  zero, is request
188e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
188f0 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47  gno>PAGER_MAX_PG
18900 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c  NO || pgno==0 ||
18910 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
18920 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
18930 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18940 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18950 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
18960 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20  ure we have not 
18970 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c  hit any critical
18980 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20   errors..  */ . 
18990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
189a0 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  =0 );.  *ppPage 
189b0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  = 0;..  /* If th
189c0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
189d0 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
189e0 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
189f0 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
18a00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18a10 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
18a20 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  () is a no-op if
18a30 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73   .  ** a databas
18a40 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64  e lock is alread
18a50 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72  y held..  */.  r
18a60 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c  c = pagerSharedL
18a70 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ock(pPager);.  i
18a80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18a90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
18aa0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
18ab0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
18ac0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
18ad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
18ae0 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
18af0 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
18b00 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  , 1, &pPg);.  if
18b10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18b20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
18b30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
18b40 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20  >pPager==0 ){.  
18b50 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63    /* The pager c
18b60 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64  ache has created
18b70 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73   a new page. Its
18b80 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74   content needs t
18b90 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69  o .    ** be ini
18ba0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f  tialized..    */
18bb0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
18bc0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
18bd0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
18be0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
18bf0 70 50 61 67 65 72 3b 0a 20 20 20 20 69 66 28 20  pPager;.    if( 
18c00 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
18c10 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
18c20 72 6e 61 6c 2c 20 70 67 6e 6f 29 20 29 7b 0a 20  rnal, pgno) ){. 
18c30 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20       pPg->flags 
18c40 7c 3d 20 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  |= PGHDR_IN_JOUR
18c50 4e 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  NAL;.    }.    m
18c60 65 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72  emset(pPg->pExtr
18c70 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  a, 0, pPager->nE
18c80 78 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d  xtra);..    rc =
18c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
18ca0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
18cb0 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
18cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18ce0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
18cf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18d00 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
18d10 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
18d20 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
18d30 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
18d40 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
18d50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
18d60 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
18d70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
18d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
18d90 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
18da0 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61   memset(pPg->pDa
18db0 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  ta, 0, pPager->p
18dc0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
18dd0 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b  if( noContent ){
18de0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c  .        pPg->fl
18df0 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45  ags |= PGHDR_NEE
18e00 44 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a  D_READ;.      }.
18e10 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
18e20 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
18e30 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
18e40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e50 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
18e60 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
18e70 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
18e80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
18e90 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
18ea0 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
18eb0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
18ec0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
18ed0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65   */.        page
18ee0 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
18ef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18f00 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
18f10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
18f20 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
18f30 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
18f40 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
18f50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
18f60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
18f70 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
18f80 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
18f90 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  he. */.    asser
18fa0 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  t(sqlite3PcacheR
18fb0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
18fc0 70 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67  pPCache)>0 || pg
18fd0 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
18fe0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
18ff0 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
19000 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
19010 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
19020 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
19030 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
19040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
19050 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
19060 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19080 20 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d    }..  *ppPage =
19090 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
190a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
190b0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
190c0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
190d0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
190e0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
190f0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
19100 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
19110 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
19120 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
19130 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
19140 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
19150 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
19160 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
19170 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
19180 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
19190 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
191a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
191b0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
191c0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
191d0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
191e0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
191f0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19200 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
19210 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
19220 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
19230 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19240 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
19250 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
19260 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
19270 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
19280 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
19290 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
192a0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
192b0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
192c0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
192d0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
192e0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
192f0 3b 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72  ;..  if( (pPager
19300 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
19310 4e 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50  NLOCK).   && (pP
19320 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
19330 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
19340 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
19350 49 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20  ITE_FULL).  ){. 
19360 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
19370 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50  Fetch(pPager->pP
19380 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20  Cache, pgno, 0, 
19390 26 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  &pPg);.  }..  re
193a0 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a  turn pPg;.}../*.
193b0 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67  ** Release a pag
193c0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
193d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
193e0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
193f0 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74   drop to zero, t
19400 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  hen the.** page 
19410 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
19420 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20  LRU list.  When 
19430 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74  all references t
19440 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61  o all pages.** a
19450 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72  re released, a r
19460 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61  ollback occurs a
19470 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  nd the lock on t
19480 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a  he database is.*
19490 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  * removed..*/.in
194a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  t sqlite3PagerUn
194b0 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  ref(DbPage *pPg)
194c0 7b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  {.  if( pPg ){. 
194d0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
194e0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
194f0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
19500 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20  eRelease(pPg);. 
19510 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66     pagerUnlockIf
19520 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a  Unused(pPager);.
19530 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19540 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19550 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
19560 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
19570 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
19580 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
19590 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
195a0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
195b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
195c0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
195d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
195e0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
195f0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
19600 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
19610 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
19620 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
19630 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
19640 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
19650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19660 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
19670 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19680 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
19690 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
196a0 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
196b0 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
196c0 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
196d0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
196e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
196f0 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
19700 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19710 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
19720 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
19730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
19740 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
19750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
19760 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
19770 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19780 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29  count(pPager, 0)
19790 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ;.  pPager->pInJ
197a0 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
197b0 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61  BitvecCreate(pPa
197c0 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
197d0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  if( pPager->pInJ
197e0 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
197f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
19800 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
19810 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
19820 6e 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nal;.  }..  if( 
19830 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19840 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  pen==0 ){.    if
19850 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
19860 6c 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  le ){.      flag
19870 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
19880 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c  N_DELETEONCLOSE|
19890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
198a0 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
198b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67  else{.      flag
198c0 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  s |= (SQLITE_OPE
198d0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b  N_MAIN_JOURNAL);
198e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
198f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
19900 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
19910 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a  LMODE_MEMORY ){.
19920 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d        sqlite3Mem
19930 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67  JournalOpen(pPag
19940 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
19950 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19960 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65      }else{.#ifde
19970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19980 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
19990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
199a0 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20  ournalOpen(.    
199b0 20 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67        pVfs, pPag
199c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50  er->zJournal, pP
199d0 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73  ager->jfd, flags
199e0 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  , jrnlBufferSize
199f0 28 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29  (pPager).      )
19a00 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
19a10 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
19a20 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
19a30 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
19a40 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b  >jfd, flags, 0);
19a50 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19a60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
19a70 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
19a80 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73  r->jfd->pMethods
19a90 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
19aa0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
19ab0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
19ac0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  aster = 0;.    p
19ad0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
19ae0 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
19af0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19b00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19b10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
19b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
19b30 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67  elete(pVfs, pPag
19b40 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
19b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19b60 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
19b70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  pen_journal;.   
19b80 20 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d   }.  }.  pPager-
19b90 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
19ba0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
19bb0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
19bc0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
19bd0 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
19be0 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
19bf0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
19c00 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
19c10 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
19c20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
19c30 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
19c40 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
19c50 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
19c60 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
19c70 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
19c80 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
19c90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
19ca0 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
19cb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19cc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19cd0 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
19ce0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
19cf0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
19d00 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
19d10 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
19d20 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
19d30 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
19d40 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
19d50 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
19d60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19d70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19d80 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
19d90 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
19da0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
19db0 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
19dc0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
19dd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
19de0 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
19df0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
19e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19e10 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
19e20 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
19e30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
19e40 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
19e50 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
19e60 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
19e70 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
19e80 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19e90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
19ea0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
19eb0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
19ec0 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
19ed0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
19ee0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
19ef0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19f00 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19f10 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
19f20 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
19f30 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
19f40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
19f50 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
19f60 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19f70 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
19f80 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
19f90 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
19fa0 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
19fb0 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
19fc0 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
19fd0 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
19fe0 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
19ff0 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1a000 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
1a010 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
1a020 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
1a030 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1a040 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1a050 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1a060 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1a070 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1a080 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1a090 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1a0a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1a0b0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1a0c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1a0d0 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1a0e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1a0f0 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1a100 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1a110 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a120 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1a130 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1a140 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1a150 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1a160 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1a170 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1a180 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1a190 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1a1a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1a1b0 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1a1c0 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1a1d0 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1a1e0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a1f0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1a200 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1a210 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1a220 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a230 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1a240 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1a250 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1a260 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1a270 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1a280 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1a290 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1a2a0 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a2b0 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1a2c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a2d0 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1a2e0 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1a2f0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a300 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1a310 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a330 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1a340 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a350 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a360 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1a370 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1a380 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1a390 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1a3a0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1a3b0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1a3c0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1a3d0 63 61 63 68 65 41 73 73 65 72 74 46 6c 61 67 73  cacheAssertFlags
1a3e0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
1a3f0 2c 20 30 2c 20 50 47 48 44 52 5f 49 4e 5f 4a 4f  , 0, PGHDR_IN_JO
1a400 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d  URNAL);.    rc =
1a410 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1a420 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1a430 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  VED_LOCK);.    i
1a440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1a450 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a460 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1a470 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
1a480 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
1a490 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1a4a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1a4b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
1a4c0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
1a4d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
1a4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a4f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a500 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1a510 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
1a520 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
1a530 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64  ("TRANSACTION %d
1a540 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1a550 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ger));.    if( p
1a560 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1a570 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  l && !pPager->te
1a580 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20 20 20  mpFile.         
1a590 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1a5a0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1a5b0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1a5c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1a5d0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1a5e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1a5f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1a600 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a610 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1a620 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
1a630 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
1a640 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
1a650 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
1a660 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
1a670 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
1a680 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
1a690 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
1a6a0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
1a6b0 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
1a6c0 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
1a6d0 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
1a6e0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
1a6f0 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
1a700 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
1a710 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
1a720 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
1a730 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
1a740 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
1a750 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
1a760 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
1a770 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a780 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
1a790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a7a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
1a7b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a7c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
1a7d0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  l==0 );.    sqli
1a7e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1a7f0 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  t(pPager, 0);.  
1a800 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
1a810 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  rnal = sqlite3Bi
1a820 74 76 65 63 43 72 65 61 74 65 28 20 70 50 61 67  tvecCreate( pPag
1a830 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20 20  er->dbSize );.  
1a840 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70    if( !pPager->p
1a850 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  InJournal ){.   
1a860 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1a870 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
1a880 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1a890 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1a8a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a8b0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1a8c0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1a8d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1a8e0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  rt( !pPager->jou
1a8f0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
1a900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30  er->journalOff>0
1a910 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1a920 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  K );.  return rc
1a930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1a940 61 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53  a page dirty.  S
1a950 65 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61  et its dirty fla
1a960 67 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20  g and add it to 
1a970 74 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67  the dirty.** pag
1a980 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1a990 63 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79  c void makeDirty
1a9a0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1a9b0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
1a9c0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 7d 0a 0a  eDirty(pPg);.}..
1a9d0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67  /*.** Make a pag
1a9e0 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20  e clean.  Clear 
1a9f0 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61 6e  its dirty bit an
1aa00 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  d remove it from
1aa10 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70 61   the.** dirty pa
1aa20 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ge list..*/.stat
1aa30 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61  ic void makeClea
1aa40 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  n(PgHdr *pPg){. 
1aa50 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
1aa60 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 7d 0a  keClean(pPg);.}.
1aa70 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
1aa80 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
1aa90 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
1aaa0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1aab0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
1aac0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1aad0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
1aae0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
1aaf0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
1ab00 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
1ab10 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
1ab20 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1ab30 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1ab40 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
1ab50 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
1ab60 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
1ab70 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
1ab80 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
1ab90 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
1aba0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
1abb0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
1abc0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
1abd0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1abe0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
1abf0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
1ac00 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
1ac10 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
1ac20 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
1ac30 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
1ac40 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
1ac50 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
1ac60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1ac70 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1ac80 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1ac90 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
1aca0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
1acb0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
1acc0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
1acd0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ace0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
1acf0 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
1ad00 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
1ad10 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
1ad20 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
1ad30 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
1ad40 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
1ad50 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
1ad60 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1ad70 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
1ad80 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1ad90 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
1ada0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1adb0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
1adc0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
1add0 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b  ta = pPg->pData;
1ade0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1adf0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1ae00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ae10 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
1ae20 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
1ae30 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1ae40 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
1ae50 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1ae60 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1ae70 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
1ae80 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
1ae90 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
1aea0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
1aeb0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1aec0 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
1aed0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (pPg);..  /* If 
1aee0 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72  this page was pr
1aef0 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65  eviously acquire
1af00 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  d with noContent
1af10 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  ==1, that means.
1af20 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72    ** we didn't r
1af30 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68  eally read in th
1af40 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1af50 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e   page.  This can
1af60 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f   happen.  ** (fo
1af70 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20  r example) when 
1af80 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
1af90 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  g moved to the f
1afa0 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20  reelist.  But.  
1afb0 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70  ** now we are (p
1afc0 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74  erhaps) moving t
1afd0 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74  he page off of t
1afe0 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a  he freelist for.
1aff0 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77    ** reuse and w
1b000 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  e need to know i
1b010 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74  ts original cont
1b020 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74  ent so that cont
1b030 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  ent.  ** can be 
1b040 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f  stored in the ro
1b050 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
1b060 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20   So do the read 
1b070 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d  at this.  ** tim
1b080 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
1b090 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1b0a0 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20  (pPg);.  if( rc 
1b0b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1b0c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b  ;.  }..  /* Mark
1b0d0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
1b0e0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
1b0f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b100 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
1b110 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
1b120 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
1b130 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
1b140 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50  /.  makeDirty(pP
1b150 67 29 3b 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  g);.  if( (pPg->
1b160 66 6c 61 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a  flags&PGHDR_IN_J
1b170 4f 55 52 4e 41 4c 29 0a 20 20 20 26 26 20 28 70  OURNAL).   && (p
1b180 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70  ageInStatement(p
1b190 50 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  Pg) || pPager->s
1b1a0 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 0a 20 20  tmtInUse==0) .  
1b1b0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1b1c0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1b1d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64     pPager->dbMod
1b1e0 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  ified = 1;.  }el
1b1f0 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
1b200 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
1b210 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
1b220 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
1b230 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
1b240 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
1b250 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
1b260 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
1b270 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
1b280 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
1b290 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
1b2a0 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that the
1b2b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1b2c0 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
1b2d0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
1b2e0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
1b2f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1b300 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b310 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1b320 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1b330 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
1b340 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
1b350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b360 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b370 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1b380 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b390 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1b3a0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1b3b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b3c0 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
1b3d0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
1b3e0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1b3f0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
1b400 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
1b410 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1b420 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1b430 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1b440 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b450 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b460 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1b470 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1b480 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
1b490 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a 20  dified = 1;.  . 
1b4a0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1b4b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1b4c0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1b4d0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1b4e0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1b4f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1b500 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1b510 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1b520 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1b530 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1b540 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1b550 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1b560 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1b570 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 28 70 50   */.    if( !(pP
1b580 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 49  g->flags&PGHDR_I
1b590 4e 5f 4a 4f 55 52 4e 41 4c 29 20 26 26 20 70 50  N_JOURNAL) && pP
1b5a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b5b0 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  n ){.      if( (
1b5c0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1b5d0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1b5e0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
1b5f0 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
1b600 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
1b610 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
1b620 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1b630 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1b640 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1b650 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
1b660 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1b670 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1b680 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1b690 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1b6a0 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
1b6b0 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
1b6c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1b6d0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1b6e0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1b6f0 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f       pData2 = CO
1b700 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1b710 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1b720 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
1b730 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
1b740 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74  Pager, (u8*)pDat
1b750 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  a2);.        rc 
1b760 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
1b770 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
1b780 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
1b790 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1b7a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b7b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b7d0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
1b7e0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1b7f0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b820 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20  r->journalOff + 
1b830 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  4);.          pP
1b840 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b850 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
1b860 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20  Size+4;.        
1b870 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1b880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b890 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
1b8a0 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1b8b0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
1b8c0 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d  ournalOff, cksum
1b8d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1b8e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1b8f0 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a  += 4;.        }.
1b900 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1b910 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1b920 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1b930 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
1b950 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b960 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b970 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ze));.        PA
1b980 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1b990 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1b9a0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41  unt);.        PA
1b9b0 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
1b9c0 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
1b9d0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
1b9e0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
1b9f0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1ba00 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ba10 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1ba20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  ((pPg->flags&PGH
1ba30 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
1ba40 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  0), pager_pageha
1ba50 73 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20  sh(pPg));..     
1ba60 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68     /* An error h
1ba70 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69  as occured writi
1ba80 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
1ba90 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20  l file. The .   
1baa0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1bab0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
1bac0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
1bad0 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
1bae0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1baf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1bb10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1bb20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67   }..        pPag
1bb30 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1bb40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bb50 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
1bb60 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 );.        sql
1bb70 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
1bb80 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1bb90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1bba0 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1bbb0 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
1bbc0 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67         pPg->flag
1bbd0 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f  s |= PGHDR_NEED_
1bbe0 53 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SYNC;.        }.
1bbf0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1bc00 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1bc10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1bc20 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
1bc30 65 72 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67  er->pInStmt, pPg
1bc40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1bc50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1bc60 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
1bc70 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1bc80 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1bc90 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
1bca0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
1bcb0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
1bcc0 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
1bcd0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
1bce0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
1bcf0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1bd00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1bd10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1bd20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
1bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bd40 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1bd50 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
1bd60 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1bd70 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73    if( pPg->flags
1bd80 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1bd90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1bda0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
1bdb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1bdc0 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47  pPg->flags |= PG
1bdd0 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a  HDR_IN_JOURNAL;.
1bde0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1bdf0 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1be00 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
1be10 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1be20 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
1be30 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
1be40 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1be50 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
1be60 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
1be70 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
1be80 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1be90 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
1bea0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
1beb0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
1bec0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
1bed0 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
1bee0 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
1bef0 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
1bf00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bf10 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
1bf20 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
1bf30 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
1bf40 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1bf50 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1bf60 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
1bf70 73 73 65 72 74 28 20 28 70 50 67 2d 3e 66 6c 61  ssert( (pPg->fla
1bf80 67 73 26 50 47 48 44 52 5f 49 4e 5f 4a 4f 55 52  gs&PGHDR_IN_JOUR
1bf90 4e 41 4c 29 20 0a 20 20 20 20 20 20 20 20 20 20  NAL) .          
1bfa0 20 20 20 20 20 20 20 7c 7c 20 28 69 6e 74 29 70         || (int)p
1bfb0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1bfc0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1bfd0 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
1bfe0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
1bff0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
1c000 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 63  geSize);.      c
1c010 68 61 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f  har *pData2 = CO
1c020 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61  DEC2(pPager, pDa
1c030 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
1c040 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  );.      rc = wr
1c050 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1c060 2d 3e 73 74 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->stfd, offset, 
1c070 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c080 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1c0a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1c0b0 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1c0c0 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1c0d0 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
1c0e0 74 2b 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t+4);.      }.  
1c0f0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1c100 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1c110 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1c120 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c130 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1c140 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c150 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1c160 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1c170 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1c180 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20  mtNRec++;.      
1c190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c1a0 70 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  pInStmt!=0 );.  
1c1b0 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
1c1c0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
1c1d0 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
1c1e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c1f0 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74  * Update the dat
1c200 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72  abase size and r
1c210 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73  eturn..  */.  as
1c220 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c230 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1c240 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1c250 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70  r->dbSize<(int)p
1c260 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  Pg->pgno ){.    
1c270 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1c280 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1c290 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1c2a0 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
1c2b0 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1c2c0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1c2d0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
1c2e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c2f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1c300 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
1c310 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74  ed to mark a dat
1c320 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62  a-page as writab
1c330 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20  le. It uses .** 
1c340 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f  pager_write() to
1c350 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
1c360 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e  file (if it is n
1c370 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29  ot already open)
1c380 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
1c390 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f  e page *pData to
1c3a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1c3b0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
1c3c0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1c3d0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67  function and pag
1c3e0 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68  er_write() is th
1c3f0 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  at this.** funct
1c400 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77  ion also deals w
1c410 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20  ith the special 
1c420 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20  case where 2 or 
1c430 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69  more pages.** fi
1c440 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69  t on a single di
1c450 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68  sk sector. In th
1c460 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72  is case all co-r
1c470 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a  esident pages.**
1c480 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1c490 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1c4a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f  ournal file befo
1c4b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1c4c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c4d0 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  rWrite(DbPage *p
1c4e0 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72  DbPage){.  int r
1c4f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c500 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70    PgHdr *pPg = p
1c510 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20  DbPage;.  Pager 
1c520 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c530 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50  Pager;.  Pgno nP
1c540 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28  agePerSector = (
1c550 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
1c560 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze/pPager->pageS
1c570 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61  ize);..  if( nPa
1c580 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
1c590 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
1c5a0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
1c5b0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1c5c0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1c5d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1c5e0 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
1c5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1c600 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1c610 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1c620 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
1c630 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
1c640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c650 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
1c660 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
1c670 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
1c680 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
1c690 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20  eedSync = 0;..  
1c6a0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
1c6b0 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
1c6c0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
1c6d0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
1c6e0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
1c6f0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
1c700 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
1c710 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
1c720 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
1c730 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1c740 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1c750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c760 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1c770 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1c780 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
1c790 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
1c7a0 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
1c7b0 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
1c7c0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
1c7d0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
1c7e0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
1c7f0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
1c800 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
1c810 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
1c820 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
1c830 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1c840 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1c850 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
1c860 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
1c870 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
1c880 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
1c890 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
1c8a0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1c8b0 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
1c8c0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
1c8d0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
1c8e0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1c8f0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
1c900 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
1c910 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
1c920 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
1c930 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
1c940 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1c950 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
1c960 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c970 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1c980 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
1c990 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
1c9a0 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
1c9b0 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
1c9c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
1c9d0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
1c9e0 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
1c9f0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
1ca00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
1ca10 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
1ca20 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
1ca30 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1ca40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
1ca50 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
1ca60 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
1ca70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1ca80 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
1ca90 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
1caa0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1cab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1cac0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1cad0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
1cae0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1caf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cb00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cb10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1cb20 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1cb30 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1cb40 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
1cb50 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
1cb60 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
1cb70 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
1cb80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1cb90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1cba0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1cbb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cbc0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
1cbd0 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65 72  ( (pPage = pager
1cbe0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1cbf0 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  pg))!=0 ){.     
1cc00 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c     if( pPage->fl
1cc10 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1cc20 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20  YNC ){.         
1cc30 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20   needSync = 1;. 
1cc40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1cc50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1cc60 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1cc70 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1cc80 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   If the PgHdr.ne
1cc90 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
1cca0 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74 68  et for any of th
1ccb0 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a 20  e nPage pages . 
1ccc0 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61     ** starting a
1ccd0 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20 6e  t pg1, then it n
1cce0 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20 66  eeds to be set f
1ccf0 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20  or all of them. 
1cd00 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 77  Because.    ** w
1cd10 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66  riting to any of
1cd20 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61 67   these nPage pag
1cd30 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74 68  es may damage th
1cd40 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20 20  e others, the.  
1cd50 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1cd60 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 73  e must contain s
1cd70 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20 6f  ync()ed copies o
1cd80 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20  f all of them.  
1cd90 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79 20    ** before any 
1cda0 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20 77  of them can be w
1cdb0 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74 68  ritten out to th
1cdc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cdd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1cde0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1cdf0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1ce00 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79   && pPager->noSy
1ce10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  nc==0 );.      f
1ce20 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1ce30 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20 69  e && needSync; i
1ce40 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50 67  i++){.        Pg
1ce50 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61 67  Hdr *pPage = pag
1ce60 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1ce70 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20 20  , pg1+ii);.     
1ce80 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20 70     if( pPage ) p
1ce90 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50  Page->flags |= P
1cea0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
1ceb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1cec0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1ced0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cee0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1cef0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
1cf00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1cf10 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1cf20 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
1cf30 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
1cf40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1cf50 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
1cf60 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
1cf70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cf80 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1cf90 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
1cfa0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
1cfb0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
1cfc0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
1cfd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
1cfe0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1cff0 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
1d000 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
1d010 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
1d020 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
1d030 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1d040 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
1d050 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
1d060 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
1d070 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
1d080 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
1d090 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1d0a0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1d0b0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1d0c0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1d0d0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1d0e0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1d0f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1d100 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
1d110 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
1d120 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
1d130 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
1d140 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
1d150 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1d160 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1d170 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1d180 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1d190 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1d1a0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1d1b0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1d1c0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1d1d0 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1d1e0 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1d1f0 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1d200 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1d210 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1d220 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1d230 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1d240 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1d250 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1d260 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1d270 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1d280 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1d290 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1d2a0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1d2b0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1d2c0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1d2d0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d2e0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1d2f0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1d300 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1d310 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1d320 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1d330 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d340 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1d350 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1d360 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1d370 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d380 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1d390 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1d3a0 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1d3b0 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1d3c0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d3d0 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1d3e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1d3f0 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1d400 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1d410 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1d420 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1d430 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1d440 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1d450 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1d460 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1d470 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1d480 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1d490 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d4a0 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1d4b0 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1d4c0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1d4d0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1d4e0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1d4f0 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1d500 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1d510 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1d520 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1d530 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1d540 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1d550 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1d560 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d570 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  () call..*/.int 
1d580 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d590 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1d5a0 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
1d5b0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1d5c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d5d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1d5e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1d5f0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1d600 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1d610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d620 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d630 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1d640 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  ollback==0 ){.  
1d650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d660 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1d670 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
1d680 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71  aysRollback = sq
1d690 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1d6a0 65 28 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  e(pPager->origDb
1d6b0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
1d6c0 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1d6d0 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
1d6e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1d6f0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1d700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
1d710 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1d720 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c  pAlwaysRollback,
1d730 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20   pPg->pgno);..  
1d740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d750 4b 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  K && (pPg->flags
1d760 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
1d770 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1d780 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
1d790 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1d7a0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1d7b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d7c0 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1d7d0 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1d7e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1d7f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1d800 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1d810 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1d820 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1d830 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1d840 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1d850 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1d860 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1d870 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1d880 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1d890 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1d8a0 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1d8b0 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1d8c0 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1d8d0 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1d8e0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1d8f0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1d900 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1d910 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1d920 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1d930 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1d940 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1d950 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1d960 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1d970 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1d980 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1d990 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1d9a0 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1d9b0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1d9c0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1d9d0 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1d9e0 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1d9f0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1da00 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1da10 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
1da20 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
1da30 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1da40 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1da50 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1da60 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
1da70 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1da80 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67  pgno)).      pPg
1da90 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
1daa0 5f 44 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66  _DONT_WRITE;.#if
1dab0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1dac0 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
1dad0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1dae0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1daf0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
1db00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1db10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
1db20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1db30 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1db40 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
1db50 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
1db60 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1db70 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
1db80 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
1db90 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
1dba0 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1dbb0 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
1dbc0 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
1dbd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
1dbe0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
1dbf0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1dc00 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
1dc10 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
1dc20 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1dc30 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
1dc40 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1dc50 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
1dc60 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1dc70 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
1dc80 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
1dc90 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
1dca0 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
1dcb0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
1dcc0 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
1dcd0 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
1dce0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
1dcf0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
1dd00 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1dd10 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
1dd20 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
1dd30 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1dd40 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
1dd50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1dd60 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1dd70 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  RVED );..  /* If
1dd80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1dd90 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f  e is not open, o
1dda0 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61  r DontWrite() ha
1ddb0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e  s been called on
1ddc0 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20  .  ** this page 
1ddd0 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74  (DontWrite() set
1dde0 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  s the alwaysRoll
1ddf0 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e  back flag), then
1de00 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1de10 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
1de20 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1de30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1de40 30 20 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33  0 .   || sqlite3
1de50 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
1de60 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61  r->pAlwaysRollba
1de70 63 6b 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20  ck, pPg->pgno). 
1de80 20 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70    || pPg->pgno>p
1de90 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1dea0 65 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e.  ){.    retur
1deb0 6e 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  n;.  }..#ifdef S
1dec0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1ded0 45 54 45 0a 20 20 69 66 28 20 28 70 50 67 2d 3e  ETE.  if( (pPg->
1dee0 66 6c 61 67 73 20 26 20 50 47 48 44 52 5f 49 4e  flags & PGHDR_IN
1def0 5f 4a 4f 55 52 4e 41 4c 29 21 3d 30 20 7c 7c 20  _JOURNAL)!=0 || 
1df00 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1df10 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1df20 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  e ){.    return;
1df30 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1df40 2a 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45  * If SECURE_DELE
1df50 54 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  TE is disabled, 
1df60 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
1df70 20 77 61 79 20 74 68 61 74 20 74 68 69 73 0a 20   way that this. 
1df80 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20   ** routine can 
1df90 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70  be called on a p
1dfa0 61 67 65 20 66 6f 72 20 77 68 69 63 68 20 73 71  age for which sq
1dfb0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1dfc0 69 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e  ite().  ** has n
1dfd0 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ot been previous
1dfe0 6c 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  ly called during
1dff0 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
1e000 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20  ction..  ** And 
1e010 69 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68  if DontWrite() h
1e020 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65  as previously be
1e030 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66  en called, the f
1e040 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f  ollowing.  ** co
1e050 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
1e060 20 6d 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   met..  **.  ** 
1e070 28 4c 61 74 65 72 3a 29 20 20 4e 6f 74 20 74 72  (Later:)  Not tr
1e080 75 65 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  ue.  If the data
1e090 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
1e0a0 64 20 62 79 20 68 61 76 69 6e 67 20 64 75 70 6c  d by having dupl
1e0b0 69 63 61 74 65 0a 20 20 2a 2a 20 70 61 67 65 73  icate.  ** pages
1e0c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e0d0 20 28 65 78 3a 20 63 6f 72 72 75 70 74 39 2e 74   (ex: corrupt9.t
1e0e0 65 73 74 29 20 74 68 65 6e 20 74 68 65 20 66 6f  est) then the fo
1e0f0 6c 6c 6f 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20  llowing is not. 
1e100 20 2a 2a 20 6e 65 63 65 73 73 61 72 69 6c 79 20   ** necessarily 
1e110 74 72 75 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20  true:.  */.  /* 
1e120 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e  assert( !pPg->in
1e130 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1e140 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1e150 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1e160 29 3b 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ); */..  assert(
1e170 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1e180 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal!=0 );.  sqli
1e190 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1e1a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1e1b0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70   pPg->pgno);.  p
1e1c0 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  Pg->flags |= PGH
1e1d0 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20  DR_IN_JOURNAL;. 
1e1e0 20 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e   pPg->flags &= ~
1e1f0 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
1e200 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1e210 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1e220 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e230 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67  stmtSize >= pPag
1e240 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1e250 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  ;.    sqlite3Bit
1e260 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
1e270 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e  InStmt, pPg->pgn
1e280 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54  o);.  }.  PAGERT
1e290 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1e2a0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1e2b0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1e2c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e2d0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1e2e0 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
1e2f0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1e300 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  gno)).}.../*.** 
1e310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e320 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1e330 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1e340 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1e350 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1e360 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1e370 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1e380 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e390 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e3a0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1e3b0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
1e3c0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
1e3d0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1e3e0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1e3f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e410 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1e420 49 54 45 0a 20 20 61 73 73 65 72 74 28 20 69 73  ITE.  assert( is
1e430 44 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a  Direct==0 );  /*
1e440 20 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c   isDirect is onl
1e450 79 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69  y true for atomi
1e460 63 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64  c writes */.#end
1e470 69 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  if.  if( !pPager
1e480 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e490 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
1e4a0 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
1e4b0 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
1e4c0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1e4d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1e4e0 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
1e4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e500 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e510 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69   rc;..    if( !i
1e520 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
1e530 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e540 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
1e550 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e570 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e580 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
1e590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1e5a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e5b0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1e5c0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1e5d0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1e5e0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1e5f0 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1e600 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1e610 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1e620 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
1e630 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  ers);.    change
1e640 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
1e650 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1e660 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
1e670 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1e680 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ter);..#ifdef SQ
1e690 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1e6a0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28  IC_WRITE.    if(
1e6b0 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61   isDirect && pPa
1e6c0 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1e6d0 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
1e6e0 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
1e6f0 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
1e700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1e710 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1e720 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
1e730 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
1e740 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1e750 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1e760 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1e770 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
1e780 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1e790 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1e7a0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1e7b0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1e7c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
1e7d0 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
1e7e0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
1e7f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1e800 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
1e810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
1e820 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
1e830 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1e850 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1e860 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1e870 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1e880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1e8a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e8b0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1e8c0 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1e8d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1e8e0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1e8f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1e900 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1e910 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1e920 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1e930 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1e940 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1e950 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1e960 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1e970 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1e980 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1e990 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1e9a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e9b0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1e9c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1e9d0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1e9e0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1e9f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1ea00 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1ea10 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1ea20 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1ea30 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1ea40 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1ea50 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1ea60 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1ea70 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1ea80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ea90 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1eaa0 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1eab0 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1eac0 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1ead0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1eae0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1eaf0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1eb00 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1eb10 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
1eb20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1eb30 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1eb40 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1eb50 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1eb60 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1eb70 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1eb80 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1eb90 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1eba0 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es)..**.** If th
1ebb0 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
1ebc0 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
1ebd0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
1ebe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
1ebf0 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
1ec00 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
1ec10 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
1ec20 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
1ec30 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
1ec40 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ec50 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
1ec60 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
1ec70 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
1ec80 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
1ec90 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1eca0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1ecb0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1ecc0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1ecd0 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  er, .  const cha
1ece0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50  r *zMaster, .  P
1ecf0 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e  gno nTrunc,.  in
1ed00 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e  t noSync.){.  in
1ed10 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ed20 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1ed30 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1ed40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1ed50 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
1ed60 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  * If no changes 
1ed70 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
1ed80 77 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65  we can leave the
1ed90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72   transaction ear
1eda0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
1edb0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1edc0 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
1edd0 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
1ede0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1edf0 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
1ee00 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
1ee10 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1ee20 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
1ee30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
1ee40 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
1ee50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ee60 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
1ee70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ee80 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  }..  PAGERTRACE4
1ee90 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1eea0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1eeb0 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1eec0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1eed0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1eee0 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1eef0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1ef00 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1ef10 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1ef20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ef30 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1ef40 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1ef50 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1ef60 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1ef70 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1ef80 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1ef90 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1efa0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1efb0 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1efc0 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
1efd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1efe0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1eff0 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
1f000 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
1f010 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
1f020 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
1f030 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
1f040 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
1f050 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
1f060 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
1f070 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
1f080 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
1f090 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
1f0a0 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
1f0b0 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
1f0c0 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
1f0d0 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
1f0e0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
1f0f0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
1f100 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
1f110 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
1f120 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1f130 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
1f140 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
1f150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1f160 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
1f170 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
1f180 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1f190 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
1f1a0 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
1f1b0 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
1f1c0 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1f1d0 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
1f1e0 69 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  ite;.    pPg = s
1f1f0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1f200 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1f210 43 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41  Cache);.    useA
1f220 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20  tomicWrite = (. 
1f230 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20         !zMaster 
1f240 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
1f250 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1f260 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1f270 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
1f280 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
1f290 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20  ager) && .      
1f2a0 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a    nTrunc==0 && .
1f2b0 20 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20          (pPg==0 
1f2c0 7c 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d  || pPg->pDirty==
1f2d0 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  0).    );.    as
1f2e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1f2f0 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
1f300 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1f310 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1f320 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
1f330 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  f( useAtomicWrit
1f340 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70  e ){.      /* Up
1f350 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
1f360 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eld in the journ
1f370 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1f380 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70    int offset = p
1f390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1f3a0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
1f3b0 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
1f3c0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1f3d0 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nRec==1);.      
1f3e0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1f3f0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66  (pPager->jfd, of
1f400 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52  fset, pPager->nR
1f410 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ec);..      /* U
1f420 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
1f430 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1f440 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1f450 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
1f460 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
1f470 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
1f480 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
1f490 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
1f4a0 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  updated.      **
1f4b0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1f4c0 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
1f4d0 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74  age 1 directly t
1f4e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
1f4f0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65       ** file. Be
1f500 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
1f510 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
1f520 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
1f530 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20  ile-system, .   
1f540 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61     ** this is sa
1f550 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
1f560 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1f570 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f580 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
1f590 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
1f5a0 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
1f5b0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
1f5c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
1f5d0 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
1f5e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
1f5f0 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74  ..    if( !useAt
1f600 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d  omicWrite && rc=
1f610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e  =SQLITE_OK ).#en
1f620 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  dif..    /* If a
1f630 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f640 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1f650 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f660 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1f670 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1f680 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1f690 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1f6a0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1f6b0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1f6c0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1f6d0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1f6e0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1f6f0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1f700 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1f710 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1f720 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1f730 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1f740 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1f750 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1f760 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1f770 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1f780 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1f790 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1f7a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1f7b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1f7c0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
1f7d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f7e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1f7f0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1f800 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
1f810 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1f820 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1f830 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  F ){.#ifndef SQL
1f840 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f850 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
1f860 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1f870 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1f880 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
1f890 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
1f8a0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
1f8b0 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
1f8c0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
1f8d0 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
1f8e0 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
1f8f0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1f900 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1f910 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1f920 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f930 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
1f940 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20        int iSkip 
1f950 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  = PAGER_MJ_PGNO(
1f960 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1f970 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
1f980 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
1f990 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
1f9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
1f9b0 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  ( !sqlite3Bitvec
1f9c0 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
1f9d0 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20 69  Journal, i) && i
1f9e0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
1f9f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1fa00 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1fa10 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a  ager, i, &pPg);.
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                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 20 20 20 20 20 20 20 20 20 20  ;.              
1fa60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fa70 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1fa80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1fa90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1faa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1fab0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fac0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1fad0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
1fae0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20 0a   }.          } .
1faf0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
1fb00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
1fb10 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
1fb20 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
1fb30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1fb40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fb50 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fb60 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63         rc = sync
1fb70 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1fb80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1fb90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fba0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fbb0 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66 20  _exit;..#ifndef 
1fbc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fbd0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
1fbe0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1fbf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fc00 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
1fc10 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
1fc20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fc30 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fc40 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
1fc50 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
1fc60 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
1fc70 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1fc80 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
1fc90 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  g = sqlite3Pcach
1fca0 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65  eDirtyList(pPage
1fcb0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20  r->pPCache);.   
1fcc0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1fcd0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1fce0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1fcf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fd00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1fd10 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
1fd20 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   );.      /* The
1fd30 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61 76   error might hav
1fd40 65 20 6c 65 66 74 20 74 68 65 20 64 69 72 74 79  e left the dirty
1fd50 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65 64   list all fouled
1fd60 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20 20   up here,.      
1fd70 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65 73  ** but that does
1fd80 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63 61   not matter beca
1fd90 75 73 65 20 69 66 20 74 68 65 20 69 66 20 74 68  use if the if th
1fda0 65 20 64 69 72 74 79 20 6c 69 73 74 20 64 69 64  e dirty list did
1fdb0 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63 6f  .      ** get co
1fdc0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74 68  rrupted, then th
1fdd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  e transaction wi
1fde0 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e 64  ll roll back and
1fdf0 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61 72  .      ** discar
1fe00 64 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  d the dirty list
1fe10 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e 20 61  .  There is an a
1fe20 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20 2a  ssert in.      *
1fe30 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  * pager_get_all_
1fe40 64 69 72 74 79 5f 70 61 67 65 73 28 29 20 74 68  dirty_pages() th
1fe50 61 74 20 76 65 72 69 66 69 65 73 20 74 68 61 74  at verifies that
1fe60 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20 20   no attempt.    
1fe70 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20    ** is made to 
1fe80 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20 64  use an invalid d
1fe90 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20 20  irty list..     
1fea0 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   */.      goto s
1feb0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1fec0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
1fed0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
1fee0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20  ->pPCache);..   
1fef0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
1ff00 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1ff10 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1ff20 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e  noSync && !noSyn
1ff30 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1ff40 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1ff50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1ff60 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
1ff70 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45     }.    IOTRACE
1ff80 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c  (("DBSYNC %p\n",
1ff90 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70   pPager))..    p
1ffa0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1ffb0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1ffc0 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26  else if( MEMDB &
1ffd0 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  & nTrunc!=0 ){. 
1ffe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1fff0 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
20000 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
20010 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
20020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
20030 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a  OERR_BLOCKED ){.
20040 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63      /* pager_inc
20050 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
20060 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f  ) may attempt to
20070 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75   obtain an exclu
20080 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b  sive.     * lock
20090 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61   to spill the ca
200a0 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49  che and return I
200b0 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75  OERR_BLOCKED. Bu
200c0 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20  t since .     * 
200d0 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e  there is no chan
200e0 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73 20  ce the cache is 
200f0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74  inconsistent, it
20100 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65   is.     * bette
20110 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  r to return SQLI
20120 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f  TE_BUSY..     */
20130 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20140 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65 74  _BUSY;.  }.  ret
20150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
20160 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
20170 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
20180 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
20190 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
201a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
201b0 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
201c0 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
201d0 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
201e0 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
201f0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
20200 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
20210 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
20220 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
20230 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
20240 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20250 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
20260 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20280 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
20290 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
202a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
202b0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
202c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
202d0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
202e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
202f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
20300 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f  if( pPager->dbMo
20310 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20  dified==0 &&.   
20320 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f       (pPager->jo
20330 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
20340 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
20350 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ETE ||.         
20360 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
20370 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20  veMode!=0) ){.  
20380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20390 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
203a0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
203b0 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
203c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
203d0 4b 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  K;.  }.  PAGERTR
203e0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
203f0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20400 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
20410 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20420 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20 4d  AGER_SYNCED || M
20430 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72 2d  EMDB || !pPager-
20440 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
20450 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
20460 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
20470 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
20480 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  aster);.  rc = p
20490 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
204a0 72 2c 20 72 63 29 3b 0a 20 20 72 65 74 75 72 6e  r, rc);.  return
204b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f   rc;.}../*.** Ro
204c0 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
204d0 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
204e0 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
204f0 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
20500 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
20510 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
20520 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
20530 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
20540 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
20550 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
20560 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
20570 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
20580 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
20590 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
205a0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
205b0 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
205c0 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
205d0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
205e0 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
205f0 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
20600 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
20610 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
20620 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
20630 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
20640 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
20650 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
20660 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
20670 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
20680 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
20690 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
206a0 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
206b0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
206c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
206d0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
206e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
206f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20700 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  OK;.  PAGERTRACE
20710 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
20720 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
20730 72 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  r));.  if( !pPag
20740 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
20750 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
20760 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
20770 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
20780 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
20790 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
207a0 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  er);.  }else if(
207b0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
207c0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
207d0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
207e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
207f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
20800 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
20810 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61      pager_playba
20820 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
20830 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50     }.    rc = pP
20840 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
20850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
20860 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20870 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
20880 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  .      int rc2;.
20890 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
208a0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
208b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20  , 0);.      rc2 
208c0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
208d0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
208e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
208f0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
20900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20910 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
20920 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20930 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
20940 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
20950 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
20960 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
20970 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
20980 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
20990 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
209a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
209b0 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b  uring a ROLLBACK
209c0 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67  , we can no long
209d0 65 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67  er trust the pag
209e0 65 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  er.    ** cache.
209f0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
20a00 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
20a10 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
20a20 79 20 65 72 72 6f 72 20 0a 20 20 20 20 2a 2a 20  y error .    ** 
20a30 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 20 20  persistent..    
20a40 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
20a50 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
20a60 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
20a70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
20a80 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20a90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20aa0 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
20ab0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
20ac0 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
20ad0 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
20ae0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
20af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20b00 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
20b10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20b20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
20b30 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
20b40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
20b50 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20b60 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
20b70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20b80 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
20b90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20ba0 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63 68  urn sqlite3Pcach
20bb0 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
20bc0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 2f  ->pPCache);.}../
20bd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20be0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
20bf0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70 65 63  nces to the spec
20c00 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 69  ified page..*/.i
20c10 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
20c20 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62 50 61  ageRefcount(DbPa
20c30 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  ge *pPage){.  re
20c40 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61 63  turn sqlite3Pcac
20c50 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  hePageRefcount(p
20c60 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64 65 66  Page);.}..#ifdef
20c70 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
20c80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20c90 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
20ca0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
20cb0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
20cc0 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
20cd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20ce0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
20cf0 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 73 71  11];.  a[0] = sq
20d00 6c 69 74 65 33 50 63 61 63 68 65 52 65 66 43 6f  lite3PcacheRefCo
20d10 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61  unt(pPager->pPCa
20d20 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d 20 73  che);.  a[1] = s
20d30 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
20d40 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
20d50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d 20 3d  Cache);.  a[2] =
20d60 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 47 65   sqlite3PcacheGe
20d70 74 43 61 63 68 65 73 69 7a 65 28 70 50 61 67 65  tCachesize(pPage
20d80 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61  r->pPCache);.  a
20d90 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
20da0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
20db0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
20dc0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
20dd0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
20de0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
20df0 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
20e00 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
20e10 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
20e20 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
20e30 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
20e40 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
20e50 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
20e60 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
20e70 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  .}.int sqlite3Pa
20e80 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
20e90 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20ea0 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 23 65 6e  urn MEMDB;.}.#en
20eb0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  dif../*.** Set t
20ec0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
20ed0 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
20ee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20ef0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
20f00 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
20f10 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
20f20 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
20f30 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
20f40 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
20f50 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
20f60 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
20f70 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
20f80 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
20f90 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
20fa0 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
20fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
20fc0 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67  gerStmtBegin(Pag
20fd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20fe0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
20ff0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
21000 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
21010 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
21020 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
21030 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21040 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
21050 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
21060 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
21070 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
21080 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
21090 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
210a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
210b0 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
210c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
210d0 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
210e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
210f0 6c 4f 70 65 6e 20 29 3b 0a 20 20 61 73 73 65 72  lOpen );.  asser
21100 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
21110 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  mt==0 );.  pPage
21120 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->pInStmt = sql
21130 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
21140 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
21150 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
21160 70 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  pInStmt==0 ){.  
21170 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f    /* sqlite3OsLo
21180 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
21190 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a  HARED_LOCK); */.
211a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
211b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
211c0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
211d0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
211e0 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
211f0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
21200 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
21210 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
21220 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
21230 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
21240 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
21250 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
21260 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66  mtOpen ){.    if
21270 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21280 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
21290 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
212a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
212b0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
212c0 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
212d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
212e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
212f0 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c  Opentemp(pPager,
21300 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 53   pPager->stfd, S
21310 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
21320 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 69 66  URNAL);.      if
21330 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
21340 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
21350 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
21360 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21370 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
21380 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21390 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
213a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
213b0 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
213c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
213d0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
213e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 49    if( pPager->pI
213f0 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
21400 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
21410 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  y(pPager->pInStm
21420 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  t);.    pPager->
21430 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  pInStmt = 0;.  }
21440 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21450 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21460 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20  StmtBegin(Pager 
21470 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21480 72 63 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  rc;.  rc = pager
21490 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
214a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
214b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
214c0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
214d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
214e0 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72  StmtCommit(Pager
214f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
21500 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
21510 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
21520 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
21530 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
21540 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
21550 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
21560 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
21570 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
21580 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
21590 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
215a0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
215b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
215c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
215d0 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
215e0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29  (pPager->stfd) )
215f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
21600 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
21610 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
21620 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  }.  }.  pPager->
21630 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
21640 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21650 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
21660 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
21670 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21680 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
21690 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
216a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
216b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
216c0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41  tInUse ){.    PA
216d0 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
216e0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
216f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
21700 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
21710 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
21720 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
21730 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
21740 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
21750 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
21760 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
21770 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
21780 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
21790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
217a0 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
217b0 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
217c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
217d0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
217e0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
217f0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
21800 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21810 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
21820 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21830 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
21840 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
21850 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
21860 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
21870 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
21880 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21890 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
218a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
218b0 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
218c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
218d0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
218e0 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
218f0 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
21900 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
21910 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
21920 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
21930 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
21940 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
21950 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
21960 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21970 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
21980 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
21990 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
219a0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
219b0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
219c0 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
219d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
219e0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
219f0 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
21a00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
21a10 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
21a20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21a30 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21a40 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
21a50 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
21a60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21a70 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
21a80 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
21a90 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
21aa0 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
21ab0 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
21ac0 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
21ad0 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
21ae0 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
21af0 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
21b00 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
21b10 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
21b20 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21b30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
21b40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21b50 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
21b60 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
21b70 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
21b80 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
21b90 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
21ba0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
21bb0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
21bc0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
21bd0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
21be0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
21bf0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
21c00 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
21c10 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
21c20 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
21c30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21c40 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
21c50 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
21c60 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
21c70 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
21c80 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
21c90 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
21ca0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
21cb0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
21cc0 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
21cd0 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
21ce0 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
21cf0 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
21d00 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
21d10 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
21d20 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
21d30 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73  cated at pgno is
21d40 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
21d50 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
21d60 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
21d70 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79 20  ot put there by 
21d80 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
21d90 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  .**.** Reference
21da0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 50  s to the page pP
21db0 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20  g remain valid. 
21dc0 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20  Updating any.** 
21dd0 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69  meta-data associ
21de0 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28 69  ated with pPg (i
21df0 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
21e00 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
21e10 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
21e20 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
21e30 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
21e40 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
21e50 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
21e60 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
21e70 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
21e80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
21e90 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73  is called. It us
21ea0 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75  ed to be.** requ
21eb0 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74  ired that a stat
21ec0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
21ed0 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65  n was not active
21ee0 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72  , but this restr
21ef0 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65  iction.** has be
21f00 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41  en removed (CREA
21f10 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74  TE INDEX needs t
21f20 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68  o move a page wh
21f30 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  en a statement.*
21f40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
21f50 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a 20   active)..**.** 
21f60 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61 72  If the fourth ar
21f70 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69 74  gument, isCommit
21f80 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  , is non-zero, t
21f90 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
21fa0 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64 20   being.** moved 
21fb0 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61 74  as part of a dat
21fc0 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a 61  abase reorganiza
21fd0 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72 65  tion just before
21fe0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21ff0 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 6f   .** is being co
22000 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69 73  mmitted. In this
22010 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75 61   case, it is gua
22020 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
22030 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 0a   database page .
22040 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74 6f  ** pPg refers to
22050 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72 69   will not be wri
22060 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77 69  tten to again wi
22070 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  thin this transa
22080 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22090 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
220a0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
220b0 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50  , DbPage *pPg, P
220c0 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73  gno pgno, int is
220d0 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72  Commit){.  PgHdr
220e0 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
220f0 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
22100 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50  rwritten. */.  P
22110 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
22120 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
22130 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
22140 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22  .  PAGERTRACE5("
22150 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
22160 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
22170 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
22180 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
22190 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
221a0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
221b0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
221c0 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  0, pgno);.  IOTR
221d0 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
221e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
221f0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
22200 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
22210 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20 20  ontent(pPg);..  
22220 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
22230 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
22240 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70 61  nc()ed before pa
22250 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61 6e  ge pPg->pgno can
22260 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
22270 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d 3e   to, store pPg->
22280 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76 61  pgno in local va
22290 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63 50  riable needSyncP
222a0 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  gno..  **.  ** I
222b0 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20 66  f the isCommit f
222c0 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 72  lag is set, ther
222d0 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
222e0 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20 20  remember that.  
222f0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
22300 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
22310 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
22320 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ase page pPg->pg
22330 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20  no .  ** can be 
22340 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
22350 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
22360 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
22370 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e 0a  to write to it..
22380 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67 2d    */.  if( (pPg-
22390 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
223a0 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43 6f  D_SYNC) && !isCo
223b0 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65 64  mmit ){.    need
223c0 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
223d0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
223e0 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
223f0 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20  HDR_IN_JOURNAL) 
22400 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61  || (int)pgno>pPa
22410 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
22420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22430 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
22440 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73 73  DIRTY );.    ass
22450 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
22460 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
22470 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
22480 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
22490 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
224a0 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
224b0 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
224c0 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
224d0 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
224e0 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
224f0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
22500 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
22510 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
22520 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
22530 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
22540 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
22550 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
22560 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 50  Pg->flags &= ~(P
22570 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 7c 50  GHDR_NEED_SYNC|P
22580 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 29  GHDR_IN_JOURNAL)
22590 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
225a0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
225b0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
225c0 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50  t( !pPgOld || pP
225d0 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b  gOld->nRef==1 );
225e0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
225f0 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
22600 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67  |= (pPgOld->flag
22610 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
22620 43 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  C);.  }.  if( sq
22630 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
22640 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
22650 61 6c 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20  al, pgno) ){.   
22660 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50   pPg->flags |= P
22670 47 48 44 52 5f 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  GHDR_IN_JOURNAL;
22680 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
22690 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20 70  cacheMove(pPg, p
226a0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
226b0 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ld ){.    sqlite
226c0 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 4f  3PcacheMove(pPgO
226d0 6c 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ld, 0);.    sqli
226e0 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65  te3PcacheRelease
226f0 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20  (pPgOld);.  }.. 
22700 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
22710 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
22720 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61  Cache = 1;.  pPa
22730 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
22740 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
22750 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
22760 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
22770 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
22780 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
22790 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
227a0 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
227b0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
227c0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
227d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
227e0 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
227f0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
22800 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
22810 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
22820 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
22830 65 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f  e .    ** "is jo
22840 75 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20  urnaled" bitvec 
22850 66 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65  flag has been se
22860 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
22870 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a   be remedied by.
22880 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74      ** loading t
22890 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
228a0 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
228b0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
228c0 64 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20  dr.needSync .   
228d0 20 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a   ** flag..    **
228e0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
228f0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
22900 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
22910 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
22920 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
22930 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
22940 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
22950 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
22960 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
22970 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
22980 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
22990 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
229a0 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
229b0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
229c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
229d0 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
229e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
229f0 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
22a00 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
22a10 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
22a20 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
22a30 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
22a40 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
22a50 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
22a60 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
22a70 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
22a80 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
22a90 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
22aa0 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
22ab0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
22ac0 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
22ad0 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
22ae0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
22af0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
22b00 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
22b10 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
22b20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22b30 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
22b40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22b50 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
22b60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
22b70 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
22b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22b90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
22ba0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
22bb0 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
22bc0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
22bd0 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
22be0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
22bf0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
22c00 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
22c10 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
22c20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22c30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
22c40 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
22c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22c60 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20  ager->noSync==0 
22c70 26 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  && !MEMDB );.   
22c80 20 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c   pPgHdr->flags |
22c90 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
22ca0 43 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  C;.    pPgHdr->f
22cb0 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 49 4e  lags |= PGHDR_IN
22cc0 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 6d 61  _JOURNAL;.    ma
22cd0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
22ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
22cf0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
22d00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
22d10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22d20 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
22d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
22d40 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
22d50 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
22d60 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
22d70 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
22d80 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72  e *pPg){.  asser
22d90 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c  t( pPg->nRef>0 |
22da0 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d  | pPg->pPager->m
22db0 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e  emDb );.  return
22dc0 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a   pPg->pData;.}..
22dd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22de0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
22df0 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
22e00 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
22e10 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
22e20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
22e30 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
22e40 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
22e50 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
22e60 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
22e70 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
22e80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
22e90 72 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e  rn (pPager?pPg->
22ea0 70 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a  pExtra:0);.}../*
22eb0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
22ec0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
22ed0 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
22ee0 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
22ef0 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
22f00 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22f10 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
22f20 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22f30 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
22f40 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
22f50 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
22f60 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
22f70 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
22f80 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
22f90 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
22fa0 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
22fb0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
22fc0 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
22fd0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22fe0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
22ff0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23000 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
23010 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
23020 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
23030 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
23040 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
23050 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
23060 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
23070 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
23080 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
23090 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
230a0 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
230b0 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
230c0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
230d0 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
230e0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
230f0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23100 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
23110 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
23120 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
23130 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
23140 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23150 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
23160 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23170 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
23180 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
23190 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
231a0 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
231b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
231c0 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20   = eMode;.  }.  
231d0 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
231e0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
231f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  e;.}../*.** Get/
23200 73 65 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  set the journal-
23210 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
23220 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
23230 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
23240 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41   of:.**.**    PA
23250 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
23260 51 55 45 52 59 0a 2a 2a 20 20 20 20 50 41 47 45  QUERY.**    PAGE
23270 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
23280 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41 47 45 52  LETE.**    PAGER
23290 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55  _JOURNALMODE_TRU
232a0 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50 41 47 45  NCATE.**    PAGE
232b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
232c0 52 53 49 53 54 0a 2a 2a 20 20 20 20 50 41 47 45  RSIST.**    PAGE
232d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
232e0 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  F.**.** If the p
232f0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
23300 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74 68 65  _QUERY, then the
23310 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73   journal-mode is
23320 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 76   set to the.** v
23330 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e 0a  alue specified..
23340 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
23350 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  ed indicate the 
23360 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
23370 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6a 6f  y updated).** jo
23380 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  urnal-mode..*/.i
23390 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  nt sqlite3PagerJ
233a0 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72  ournalMode(Pager
233b0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
233c0 6f 64 65 29 7b 0a 20 20 69 66 28 20 21 4d 45 4d  ode){.  if( !MEM
233d0 44 42 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  DB ){.    assert
233e0 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  ( eMode==PAGER_J
233f0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
23400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
23410 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
23420 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
23430 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
23440 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
23450 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
23460 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
23470 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
23480 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
23490 45 52 53 49 53 54 0a 20 20 20 20 20 20 20 20 20  ERSIST.         
234a0 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
234b0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
234c0 5f 4f 46 46 20 0a 20 20 20 20 20 20 20 20 20 20  _OFF .          
234d0 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
234e0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
234f0 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20 20 61 73  MEMORY );.    as
23500 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
23510 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
23520 29 3b 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  );.    if( eMode
23530 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  >=0 ){.      pPa
23540 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
23550 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65   = eMode;.    }e
23560 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
23570 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
23580 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
23590 59 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Y );.    }.  }. 
235a0 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61   return (int)pPa
235b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
235c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
235d0 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69  et the size-limi
235e0 74 20 75 73 65 64 20 66 6f 72 20 70 65 72 73 69  t used for persi
235f0 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
23600 6c 65 73 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  les..*/.i64 sqli
23610 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53  te3PagerJournalS
23620 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72 20 2a  izeLimit(Pager *
23630 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c 69 6d  pPager, i64 iLim
23640 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69  it){.  if( iLimi
23650 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70 50 61  t>=-1 ){.    pPa
23660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
23670 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a  Limit = iLimit;.
23680 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
23690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
236a0 4c 69 6d 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66  Limit;.}..#endif
236b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
236c0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.