/ Hex Artifact Content
Login

Artifact 9c1663c9406743f30cdad532c01c47f71bfac577:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 31  : pager.c,v 1.51
0350: 36 20 32 30 30 38 2f 31 32 2f 31 38 20 31 35 3a  6 2008/12/18 15:
0360: 34 35 3a 30 37 20 64 61 6e 69 65 6c 6b 31 39 37  45:07 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 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
1730: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1740: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
1750: 74 65 64 20 66 6f 72 20 65 61 63 68 20 61 63 74  ted for each act
1760: 69 76 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  ive.** savepoint
1770: 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 74   and statement t
1780: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 74 68  ransaction in th
1790: 65 20 73 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75  e system. All su
17a0: 63 68 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  ch structures.**
17b0: 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
17c0: 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
17d0: 69 6e 74 5b 5d 20 61 72 72 61 79 2c 20 77 68 69  int[] array, whi
17e0: 63 68 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ch is allocated 
17f0: 61 6e 64 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75  and.** resized u
1800: 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 61 6c  sing sqlite3Real
1810: 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  loc()..**.** Whe
1820: 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 20 69 73  n a savepoint is
1830: 20 63 72 65 61 74 65 64 2c 20 74 68 65 20 50 61   created, the Pa
1840: 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64  gerSavepoint.iHd
1850: 72 4f 66 66 73 65 74 20 66 69 65 6c 64 20 69 73  rOffset field is
1860: 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2e 20 49 66  .** set to 0. If
1870: 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65   a journal-heade
1880: 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
1890: 6f 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  o the main journ
18a0: 61 6c 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20  al while.** the 
18b0: 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
18c0: 69 76 65 2c 20 74 68 65 6e 20 69 48 64 72 4f 66  ive, then iHdrOf
18d0: 66 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74  fset is set to t
18e0: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 0a  he byte offset .
18f0: 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1900: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
1910: 74 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  t journal record
1920: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1930: 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61  e main.** journa
1940: 6c 20 62 65 66 6f 72 65 20 74 68 65 20 6a 6f 75  l before the jou
1950: 72 6e 61 6c 2d 68 65 61 64 65 72 2e 20 54 68 69  rnal-header. Thi
1960: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 64 75  s is required du
1970: 72 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a  ring savepoint.*
1980: 2a 20 72 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20  * rollback (see 
1990: 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76  pagerPlaybackSav
19a0: 65 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79  epoint())..*/.ty
19b0: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 61 67  pedef struct Pag
19c0: 65 72 53 61 76 65 70 6f 69 6e 74 20 50 61 67 65  erSavepoint Page
19d0: 72 53 61 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75  rSavepoint;.stru
19e0: 63 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  ct PagerSavepoin
19f0: 74 20 7b 0a 20 20 69 36 34 20 69 4f 66 66 73 65  t {.  i64 iOffse
1a00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a10: 20 20 20 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f     /* Starting o
1a20: 66 66 73 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f  ffset in main jo
1a30: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69  urnal */.  i64 i
1a40: 48 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  HdrOffset;      
1a50: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61          /* See a
1a60: 62 6f 76 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  bove */.  Bitvec
1a70: 20 2a 70 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20   *pInSavepoint; 
1a80: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
1a90: 20 70 61 67 65 73 20 69 6e 20 74 68 69 73 20 73   pages in this s
1aa0: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67  avepoint */.  Pg
1ab0: 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
1ac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
1ad0: 69 67 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66  iginal number of
1ae0: 20 70 61 67 65 73 20 69 6e 20 66 69 6c 65 20 2a   pages in file *
1af0: 2f 0a 20 20 50 67 6e 6f 20 69 53 75 62 52 65 63  /.  Pgno iSubRec
1b00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b10: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72   /* Index of fir
1b20: 73 74 20 72 65 63 6f 72 64 20 69 6e 20 73 75 62  st record in sub
1b30: 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a  -journal */.};..
1b40: 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67  /*.** A open pag
1b50: 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e  e cache is an in
1b60: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1b70: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1b80: 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65  e..**.** Pager.e
1b90: 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65  rrCode may be se
1ba0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52  t to SQLITE_IOER
1bb0: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
1bc0: 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49  T, or.** or SQLI
1bd0: 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e  TE_FULL. Once on
1be0: 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
1bf0: 68 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75  hree errors occu
1c00: 72 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a  rs, it persists.
1c10: 2a 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e  ** and is return
1c20: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
1c30: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
1c40: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
1c50: 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   The.** SQLITE_F
1c60: 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ULL return code 
1c70: 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66  is slightly diff
1c80: 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73  erent. It persis
1c90: 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68  ts only until th
1ca0: 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73  e.** next succes
1cb0: 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73  sful rollback is
1cc0: 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68   performed on th
1cd0: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41  e pager cache. A
1ce0: 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46  lso,.** SQLITE_F
1cf0: 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66  ULL does not aff
1d00: 65 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50  ect the sqlite3P
1d10: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71  agerGet() and sq
1d20: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1d30: 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79  ().** APIs, they
1d40: 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73   may still be us
1d50: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
1d60: 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72  .*/.struct Pager
1d70: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73   {.  sqlite3_vfs
1d80: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
1d90: 20 2f 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73   /* OS functions
1da0: 20 74 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a   to use for IO *
1db0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  /.  u8 journalOp
1dc0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1dd0: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
1de0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
1df0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
1e00: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
1e10: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
1e20: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
1e30: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
1e40: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
1e50: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
1e60: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
1e70: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1e80: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
1e90: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb0: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
1ec0: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
1ed0: 6b 73 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ks */.  u8 noSyn
1ee0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ef0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
1f00: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
1f10: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
1f20: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
1f30: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
1f40: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
1f50: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
1f60: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
1f70: 73 79 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20  sync_flags;     
1f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
1f90: 6f 66 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  of SYNC_NORMAL o
1fa0: 72 20 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20  r SYNC_FULL */. 
1fb0: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fd0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
1fe0: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
1ff0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74  , etc. */.  u8 t
2000: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
2010: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2020: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
2030: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
2040: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
2050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2060: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
2070: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
2080: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2090: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20a0: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
20b0: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
20c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
20d0: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20f0: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
2100: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
2110: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2120: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2130: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2140: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2150: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  all pages */.  u
2160: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2180: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
2190: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20  l file I/O */.  
21a0: 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20  u8 setMaster;   
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21c0: 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d  rue if a m-j nam
21d0: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
21e0: 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20  en to jrnl */.  
21f0: 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20  u8 doNotSync;   
2200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
2210: 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72  oolean. While tr
2220: 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c  ue, do not spill
2230: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
2240: 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  u8 exclusiveMode
2250: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
2260: 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20  oolean. True if 
2270: 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58  locking_mode==EX
2280: 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20  CLUSIVE */.  u8 
2290: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20 20 20  journalMode;    
22a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 20 6f           /* On o
22b0: 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f 55 52  f the PAGER_JOUR
22c0: 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75 65 73  NALMODE_* values
22d0: 20 2a 2f 0a 20 20 75 38 20 64 62 4d 6f 64 69 66   */.  u8 dbModif
22e0: 69 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ied;            
22f0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
2300: 72 65 20 61 72 65 20 61 6e 79 20 63 68 61 6e 67  re are any chang
2310: 65 73 20 74 6f 20 74 68 65 20 44 62 20 2a 2f 0a  es to the Db */.
2320: 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e 74    u8 changeCount
2330: 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Done;         /*
2340: 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72 65   Set after incre
2350: 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61 6e  menting the chan
2360: 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ge-counter */.  
2370: 75 38 20 64 62 53 69 7a 65 56 61 6c 69 64 3b 20  u8 dbSizeValid; 
2380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2390: 65 74 20 77 68 65 6e 20 64 62 53 69 7a 65 20 69  et when dbSize i
23a0: 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 20 20 75  s correct */.  u
23b0: 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20  32 vfsFlags;    
23c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
23d0: 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
23e0: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
23f0: 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20   int errCode;   
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2410: 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b  One of several k
2420: 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a  inds of errors *
2430: 2f 0a 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b  /.  Pgno dbSize;
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2460: 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20 2a  es in the file *
2470: 2f 0a 20 20 50 67 6e 6f 20 6f 72 69 67 44 62 53  /.  Pgno origDbS
2480: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2490: 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72 65  /* dbSize before
24a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
24b0: 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  nge */.  int nRe
24c0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24e0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
24f0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
2500: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
2510: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2520: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
2530: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
2540: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
2550: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2570: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
2580: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
2590: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
25a0: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
25b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
25c0: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
25d0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
25e0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
25f0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
2600: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2610: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
2620: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  age */.  int nPa
2630: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2640: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
2650: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
2660: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  y pages */.  int
2670: 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20   mxPage;        
2680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
2690: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  mum number of pa
26a0: 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63  ges to hold in c
26b0: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  ache */.  Pgno m
26c0: 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  xPgno;          
26d0: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
26e0: 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66   allowed size of
26f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
2700: 0a 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f  .  Bitvec *pInJo
2710: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f  urnal;         /
2720: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2730: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2740: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2750: 20 20 42 69 74 76 65 63 20 2a 70 41 6c 77 61 79    Bitvec *pAlway
2760: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 2f 2a  sRollback;    /*
2770: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2780: 68 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  h page marked al
2790: 77 61 79 73 2d 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ways-rollback */
27a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
27b0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
27c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
27d0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
27e0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2800: 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  Name of the jour
2810: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68  nal file */.  ch
2820: 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20  ar *zDirectory; 
2830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72            /* Dir
2840: 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61  ectory hold data
2850: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2860: 20 66 69 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69   files */.  sqli
2870: 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 2a 6a  te3_file *fd, *j
2880: 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c 65 20  fd;     /* File 
2890: 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
28a0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
28b0: 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rnal */.  sqlite
28c0: 33 5f 66 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20  3_file *sjfd;   
28d0: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
28e0: 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65  scriptor for the
28f0: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2a 2f 0a 20   sub-journal*/. 
2900: 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64   int (*xBusyHand
2910: 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20  ler)(void*); /* 
2920: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c  Function to call
2930: 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20   when busy */.  
2940: 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c  void *pBusyHandl
2950: 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43  erArg;      /* C
2960: 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20  ontext argument 
2970: 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72  for xBusyHandler
2980: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
2990: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
29a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
29b0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
29c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
29d0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
29e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
29f0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
2a00: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
2a10: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
2a20: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
2a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
2a40: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
2a50: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
2a60: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2a70: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
2a80: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
2a90: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
2aa0: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
2ab0: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
2ac0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
2ad0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
2ae0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
2af0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
2b00: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
2b10: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
2b20: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2b30: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
2b40: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2b50: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
2b60: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
2b70: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
2b80: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
2b90: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
2ba0: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
2bb0: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
2bc0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
2bd0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
2be0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  () */.#endif.  c
2bf0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2c10: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
2c20: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
2c30: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61  tmp use */.  cha
2c40: 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d  r dbFileVers[16]
2c50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ;        /* Chan
2c60: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
2c70: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
2c80: 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  es */.  i64 jour
2c90: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20  nalSizeLimit;   
2ca0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69      /* Size limi
2cb0: 74 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74  t for persistent
2cc0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2cd0: 2f 0a 20 20 50 43 61 63 68 65 20 2a 70 50 43 61  /.  PCache *pPCa
2ce0: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
2cf0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
2d00: 67 65 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20  ge cache object 
2d10: 2a 2f 0a 0a 20 20 50 61 67 65 72 53 61 76 65 70  */..  PagerSavep
2d20: 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74  oint *aSavepoint
2d30: 3b 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69  ;.  int nSavepoi
2d40: 6e 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  nt;.};../*.** Th
2d50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
2d60: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
2d70: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
2d80: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
2d90: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
2da0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
2db0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
2dc0: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
2dd0: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
2de0: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
2df0: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
2e00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e10: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
2e20: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2e30: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
2e40: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
2e50: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
2e60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2e70: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2e80: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
2e90: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
2ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
2eb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
2ec0: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
2ed0: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
2ee0: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
2ef0: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
2f00: 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  /.# define PAGER
2f10: 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65  _INCR(v)  v++.#e
2f20: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47  lse.# define PAG
2f30: 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69  ER_INCR(v).#endi
2f40: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e  f..../*.** Journ
2f50: 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77  al files begin w
2f60: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
2f70: 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20  g magic string. 
2f80: 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73   The data.** was
2f90: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f   obtained from /
2fa0: 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20  dev/random.  It 
2fb0: 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20  is used only as 
2fc0: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a  a sanity check..
2fd0: 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73  **.** Since vers
2fe0: 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a  ion 2.8.0, the j
2ff0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
3000: 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61  ntains additiona
3010: 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63  l sanity.** chec
3020: 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  king information
3030: 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72 20  .  If the power 
3040: 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20  fails while the 
3050: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e  journal is begin
3060: 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d  .** written, sem
3070: 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65  i-random garbage
3080: 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70 65   data might appe
3090: 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ar in the journa
30a0: 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20  l.** file after 
30b0: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
30c0: 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70  d.  If an attemp
30d0: 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a  t is then made.*
30e0: 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f  * to roll the jo
30f0: 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20  urnal back, the 
3100: 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62  database could b
3110: 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68  e corrupted.  Th
3120: 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20  e additional.** 
3130: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3140: 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d  data is an attem
3150: 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74  pt to discover t
3160: 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74 68  he garbage in th
3170: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  e.** journal and
3180: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a   ignore it..**.*
3190: 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68 65  * The sanity che
31a0: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
31b0: 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f  n for the new jo
31c0: 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e  urnal format con
31d0: 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32  sists.** of a 32
31e0: 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e  -bit checksum on
31f0: 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64 61   each page of da
3200: 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75  ta.  The checksu
3210: 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a  m covers both.**
3220: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3230: 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d   and the pPager-
3240: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
3250: 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  of data for the 
3260: 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b  page..** This ck
3270: 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  sum is initializ
3280: 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72  ed to a 32-bit r
3290: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74  andom value that
32a0: 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a   appears in the.
32b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
32c0: 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20  right after the 
32d0: 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e  header.  The ran
32e0: 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  dom initializer 
32f0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a  is important,.**
3300: 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67 65   because garbage
3310: 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
3320: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
3330: 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69   a journal is li
3340: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61  kely.** data tha
3350: 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74  t was once in ot
3360: 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20 68  her files that h
3370: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c  ave now been del
3380: 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a  eted.  If the.**
3390: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63 61   garbage data ca
33a0: 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c  me from an obsol
33b0: 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ete journal file
33c0: 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  , the checksums 
33d0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72  might.** be corr
33e0: 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69  ect.  But by ini
33f0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68  tializing the ch
3400: 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d  ecksum to random
3410: 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20   value which.** 
3420: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72  is different for
3430: 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20   every journal, 
3440: 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74  we minimize that
3450: 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   risk..*/.static
3460: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
3470: 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  char aJournalMag
3480: 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c  ic[] = {.  0xd9,
3490: 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66   0xd5, 0x05, 0xf
34a0: 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30  9, 0x20, 0xa1, 0
34b0: 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f  x63, 0xd7,.};../
34c0: 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *.** The size of
34d0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
34e0: 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  of each page in 
34f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  the journal is d
3500: 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20  etermined.** by 
3510: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
3520: 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  cros..*/.#define
3530: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
3540: 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65 72  Pager)  ((pPager
3550: 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29  ->pageSize) + 8)
3560: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
3570: 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20  nal header size 
3580: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
3590: 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 74  In the future, t
35a0: 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
35b0: 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75  set to some valu
35c0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
35d0: 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e  disk controller.
35e0: 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a   The important.*
35f0: 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  * characteristic
3600: 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20 74   is that it is t
3610: 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
3620: 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a  a disk sector..*
3630: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3640: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
3650: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
3660: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
3670: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
3680: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
3690: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
36a0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
36b0: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
36c0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
36d0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
36e0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
36f0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
3700: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
3710: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
3720: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
3730: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
3740: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
3750: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
3760: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
3770: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
3780: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
3790: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
37a0: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
37b0: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
37c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67  endif../*.** Pag
37d0: 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d  e number PAGER_M
37e0: 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20  J_PGNO is never 
37f0: 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74  used in an SQLit
3800: 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69  e database (it i
3810: 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f  s.** reserved fo
3820: 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64  r working around
3830: 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78   a windows/posix
3840: 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79   incompatibility
3850: 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64  ). It is.** used
3860: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3870: 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20  to signify that 
3880: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
3890: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
38a0: 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64  e .** is devoted
38b0: 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61   to storing a ma
38c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
38d0: 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f  e - there are no
38e0: 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a   more pages to.*
38f0: 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65  * roll back. See
3900: 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75   comments for fu
3910: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74  nction writeMast
3920: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
3930: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23  details..*/./* #
3940: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f  define PAGER_MJ_
3950: 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47  PGNO(x) (PENDING
3960: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
3970: 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e  Size)) */.#defin
3980: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
3990: 78 29 20 28 28 50 67 6e 6f 29 28 28 50 45 4e 44  x) ((Pgno)((PEND
39a0: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
39b0: 61 67 65 53 69 7a 65 29 29 2b 31 29 29 0a 0a 2f  ageSize))+1))../
39c0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d  *.** The maximum
39d0: 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
39e0: 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31 29  er is (2^31 - 1)
39f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ..*/.#define PAG
3a00: 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34 37  ER_MAX_PGNO 2147
3a10: 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 52 65  483647../*.** Re
3a20: 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 69 74  turn false if it
3a30: 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
3a40: 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50 67   write page *pPg
3a50: 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f   into the sub-jo
3a60: 75 72 6e 61 6c 2e 0a 2a 2a 20 4d 6f 72 65 20 61  urnal..** More a
3a70: 63 63 75 72 61 74 65 6c 79 2c 20 74 72 75 65 20  ccurately, true 
3a80: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 65  is returned if e
3a90: 69 74 68 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ither:.**.**   *
3aa0: 20 4e 6f 20 73 61 76 65 70 6f 69 6e 74 73 20 61   No savepoints a
3ab0: 72 65 20 6f 70 65 6e 2c 20 6f 72 0a 2a 2a 20 20  re open, or.**  
3ac0: 20 2a 20 54 68 65 20 70 61 67 65 20 68 61 73 20   * The page has 
3ad0: 62 65 65 6e 20 73 61 76 65 64 20 74 6f 20 74 68  been saved to th
3ae0: 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 73 69  e sub-journal si
3af0: 6e 63 65 20 74 68 65 20 6d 6f 73 74 20 72 65 63  nce the most rec
3b00: 65 6e 74 0a 2a 2a 20 20 20 20 20 73 61 76 65 70  ent.**     savep
3b10: 6f 69 6e 74 20 77 61 73 20 6f 70 65 6e 65 64 2e  oint was opened.
3b20: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 54 68 65  .**.** TODO: The
3b30: 72 65 27 73 20 61 20 62 75 67 20 68 65 72 65 2e  re's a bug here.
3b40: 20 54 6f 20 64 6f 20 77 69 74 68 20 50 61 67 65   To do with Page
3b50: 72 53 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67  rSavepoint.nOrig
3b60: 2e 20 41 6c 73 6f 20 63 6f 6e 73 69 64 65 72 0a  . Also consider.
3b70: 2a 2a 20 20 20 20 20 20 20 74 68 65 20 69 64 65  **       the ide
3b80: 61 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  a that the page 
3b90: 6d 61 79 20 6e 6f 74 20 62 65 20 72 65 71 75 69  may not be requi
3ba0: 72 65 64 20 62 79 20 74 68 65 20 6f 75 74 65 72  red by the outer
3bb0: 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 0a 2a  most savepoint.*
3bc0: 2a 20 20 20 20 20 20 20 62 75 74 20 6d 61 79 20  *       but may 
3bd0: 62 65 20 72 65 71 75 69 72 65 64 20 62 79 20 73  be required by s
3be0: 6f 6d 65 20 65 61 72 6c 69 65 72 20 73 61 76 65  ome earlier save
3bf0: 70 6f 69 6e 74 2c 20 64 75 65 20 74 6f 20 61 6e  point, due to an
3c00: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
3c10: 20 20 20 20 20 20 76 61 63 75 75 6d 20 6f 70 65        vacuum ope
3c20: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
3c30: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 61 76 65  c int pageInSave
3c40: 70 6f 69 6e 74 28 50 67 48 64 72 20 2a 70 50 67  point(PgHdr *pPg
3c50: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
3c60: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
3c70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
3c80: 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
3c90: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
3ca0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3cb0: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 0a 20  te3BitvecTest(. 
3cc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61       pPager->aSa
3cd0: 76 65 70 6f 69 6e 74 5b 70 50 61 67 65 72 2d 3e  vepoint[pPager->
3ce0: 6e 53 61 76 65 70 6f 69 6e 74 2d 31 5d 2e 70 49  nSavepoint-1].pI
3cf0: 6e 53 61 76 65 70 6f 69 6e 74 2c 20 70 50 67 2d  nSavepoint, pPg-
3d00: 3e 70 67 6e 6f 0a 20 20 29 3b 0a 7d 0a 0a 73 74  >pgno.  );.}..st
3d10: 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 4a  atic int pageInJ
3d20: 6f 75 72 6e 61 6c 28 50 67 48 64 72 20 2a 70 50  ournal(PgHdr *pP
3d30: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  g){.  return sql
3d40: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
3d50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Pg->pPager->pInJ
3d60: 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
3d70: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  o);.}../*.** Rea
3d80: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
3d90: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
3da0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
3db0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
3dc0: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
3dd0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
3de0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
3df0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
3e00: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
3e10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
3e20: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
3e30: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
3e40: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
3e50: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
3e60: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
3e70: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
3e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
3e90: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
3ea0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
3eb0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
3ec0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
3ed0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
3ee0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
3ef0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
3f00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3f10: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
3f20: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
3f30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
3f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3f50: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3f60: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
3f70: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
3f80: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
3f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
3fa0: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
3fb0: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
3fc0: 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  A,B)../*.** Writ
3fd0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
3fe0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
3ff0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4000: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4010: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4020: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4030: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4040: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4050: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4060: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
4070: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
4080: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
4090: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
40a0: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
40b0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
40c0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
40d0: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
40e0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20  ../*.** If file 
40f0: 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c  pFd is open, cal
4100: 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  l sqlite3OsUnloc
4110: 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74  k() on it..*/.st
4120: 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63  atic int osUnloc
4130: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
4140: 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  pFd, int eLock){
4150: 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65  .  if( !pFd->pMe
4160: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
4170: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
4180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
4190: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
41a0: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
41b0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
41c0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
41d0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
41e0: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
41f0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
4200: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
4210: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
4220: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
4230: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
4240: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
4250: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
4260: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
4270: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
4280: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
4290: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
42a0: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
42b0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
42c0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
42d0: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
42e0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
42f0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
4300: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
4310: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
4320: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
4330: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
4340: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
4350: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
4360: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
4370: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
4380: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
4390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
43a0: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
43b0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
43c0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
43d0: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
43e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
43f0: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
4400: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
4410: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
4420: 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20  er){.  int dc;  
4430: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
4440: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
4450: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63  cs */.  int nSec
4460: 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63  tor;      /* Sec
4470: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
4480: 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20 20 20  t szPage;       
4490: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f   /* Page size */
44a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
44b0: 2a 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64  *fd = pPager->fd
44c0: 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65  ;..  if( fd->pMe
44d0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20  thods ){.    dc 
44e0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
44f0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
4500: 28 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f  (fd);.    nSecto
4510: 72 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  r = sqlite3OsSec
4520: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20  torSize(fd);.   
4530: 20 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72   szPage = pPager
4540: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
4550: 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45  .  assert(SQLITE
4560: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
4570: 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61  ==(512>>8));.  a
4580: 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
4590: 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
45a0: 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66  5536>>8));..  if
45b0: 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ( !fd->pMethods 
45c0: 7c 7c 20 0a 20 20 20 20 20 20 20 28 64 63 20 26  || .       (dc &
45d0: 20 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41   (SQLITE_IOCAP_A
45e0: 54 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38  TOMIC|(szPage>>8
45f0: 29 29 20 26 26 20 6e 53 65 63 74 6f 72 3c 3d 73  )) && nSector<=s
4600: 7a 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65  zPage) ){.    re
4610: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
4620: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
4630: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
4640: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
4650: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
4660: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4670: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
4680: 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f  led when an erro
4690: 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
46a0: 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64  the pager.** cod
46b0: 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  e. The first arg
46c0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
46d0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
46e0: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a  structure, the.*
46f0: 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  * second the err
4700: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
4710: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
4720: 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
4730: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61  tion. .** The va
4740: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
4750: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
4760: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
4770: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
4780: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
4790: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
47a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
47b0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
47c0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
47d0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
47e0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
47f0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
4800: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
4810: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
4820: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
4830: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
4840: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
4850: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
4860: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
4870: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
4880: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
4890: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
48a0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
48b0: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
48c0: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
48d0: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
48e0: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
48f0: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
4900: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
4910: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
4920: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
4930: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
4940: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
4950: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
4960: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
4970: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
4980: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
4990: 20 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74   replayed..*/.st
49a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
49b0: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
49c0: 61 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  ager);.static in
49d0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
49e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
49f0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
4a00: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
4a10: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
4a20: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
4a30: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
4a40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
4a50: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
4a60: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
4a70: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
4a80: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
4a90: 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  .  );.  if(.    
4aa0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
4ab0: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
4ac0: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
4ad0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
4ae0: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
4af0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
4b00: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  rc;.    if( pPag
4b10: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
4b20: 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 26 26  _UNLOCK .     &&
4b30: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
4b40: 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
4b50: 50 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20  PCache)==0 .    
4b60: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
4b70: 68 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65  he pager is alre
4b80: 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61  ady unlocked, ca
4b90: 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  ll pager_unlock(
4ba0: 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a  ) now to.      *
4bb0: 2a 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f  * clear the erro
4bc0: 72 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75  r state and ensu
4bd0: 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
4be0: 72 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20  r-cache is .    
4bf0: 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20    ** completely 
4c00: 65 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  empty..      */.
4c10: 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
4c20: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
4c30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
4c40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
4c50: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4c60: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
4c70: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
4c80: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
4c90: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
4ca0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
4cb0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
4cc0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
4cd0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
4ce0: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
4cf0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4d00: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
4d10: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
4d20: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
4d30: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
4d40: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
4d50: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
4d60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4d70: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
4d80: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
4d90: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
4da0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
4db0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
4dc0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
4dd0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
4de0: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
4df0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
4e00: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
4e10: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
4e20: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
4e30: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
4e40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
4e50: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
4e60: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
4e70: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
4e80: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
4e90: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
4ea0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
4eb0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
4ec0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
4ed0: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
4ee0: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
4ef0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
4f00: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
4f10: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
4f20: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
4f30: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
4f40: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
4f50: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
4f60: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
4f70: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
4f80: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
4f90: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
4fa0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
4fb0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
4fc0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
4fd0: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
4fe0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
4ff0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
5000: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
5010: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
5020: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5030: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
5040: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
5050: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
5060: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
5070: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
5080: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
5090: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
50a0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
50b0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
50c0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
50d0: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
50e0: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
50f0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
5100: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5110: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5120: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5130: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5140: 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  en..** The maste
5150: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5160: 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ame is read from
5170: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
5180: 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69  file and .** wri
5190: 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
51a0: 20 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65   supplied by the
51b0: 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   caller. .**.** 
51c0: 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70 6f 69  zMaster must poi
51d0: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  nt to a buffer o
51e0: 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61 73 74  f at least nMast
51f0: 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74  er bytes allocat
5200: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63 61 6c  ed by.** the cal
5210: 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  ler. This should
5220: 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   be sqlite3_vfs.
5230: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28 74 6f  mxPathname+1 (to
5240: 20 65 6e 73 75 72 65 20 74 68 65 72 65 20 69 73   ensure there is
5250: 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61 63 65  .** enough space
5260: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6d 61   to write the ma
5270: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5280: 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73 74 65  e). If the maste
5290: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e 61 6d  r journal.** nam
52a0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
52b0: 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20   is longer than 
52c0: 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20 28 69  nMaster bytes (i
52d0: 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20 6e 75  ncluding a.** nu
52e0: 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c 20 74  l-terminator), t
52f0: 68 65 6e 20 74 68 69 73 20 69 73 20 68 61 6e 64  hen this is hand
5300: 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d 61 73  led as if no mas
5310: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
5320: 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
5330: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
5340: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5350: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5360: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5370: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73   zMaster[0] is s
5380: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
5390: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
53a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
53b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
53c0: 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  al(sqlite3_file 
53d0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d  *pJrnl, char *zM
53e0: 61 73 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74  aster, u32 nMast
53f0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
5400: 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20   u32 len;.  i64 
5410: 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  szJ;.  u32 cksum
5420: 3b 0a 20 20 75 33 32 20 75 3b 20 20 20 20 20 20  ;.  u32 u;      
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5440: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
5450: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
5460: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5470: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5480: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5490: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a  c header */..  z
54a0: 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27  Master[0] = '\0'
54b0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
54c0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
54d0: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
54e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
54f0: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
5500: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
5510: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
5520: 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20  zJ-16, &len);.  
5530: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5540: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5550: 20 20 69 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74    if( len>=nMast
5560: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
5570: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
5580: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
5590: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32  ts(pJrnl, szJ-12
55a0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
55b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
55c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
55d0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
55e0: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
55f0: 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66   8, szJ-8);.  if
5600: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5610: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
5620: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5630: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
5640: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5650: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d  OsRead(pJrnl, zM
5660: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d  aster, len, szJ-
5670: 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  16-len);.  if( r
5680: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
5690: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
56a0: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e   }.  zMaster[len
56b0: 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20  ] = '\0';..  /* 
56c0: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
56d0: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
56e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
56f0: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75 3d 30  ame */.  for(u=0
5700: 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b 0a 20  ; u<len; u++){. 
5710: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73     cksum -= zMas
5720: 74 65 72 5b 75 5d 3b 0a 20 20 20 7d 0a 20 20 69  ter[u];.   }.  i
5730: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
5740: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
5750: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
5760: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
5770: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
5780: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
5790: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
57a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
57b0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
57c0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
57d0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
57e0: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
57f0: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
5800: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
5810: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
5820: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
5830: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
5840: 20 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20     zMaster[0] = 
5850: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5860: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5880: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5890: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
58a0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
58b0: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
58c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
58d0: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
58e0: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
58f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5900: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5910: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5920: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5930: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5940: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5950: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5960: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5970: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
59a0: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
59b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
59c0: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
59e0: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5a00: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5a20: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5a30: 20 76 6f 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61   void seekJourna
5a40: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5a50: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
5a60: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
5a70: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5a80: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
5a90: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
5aa0: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
5ab0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
5ac0: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
5ad0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
5ae0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
5af0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5b00: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
5b10: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
5b20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
5b30: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
5b40: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
5b50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
5b60: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
5b70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
5b80: 7a 65 72 6f 73 20 6f 76 65 72 20 74 68 65 20 68  zeros over the h
5b90: 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
5ba0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73  rnal file.  This
5bb0: 20 68 61 73 20 74 68 65 0a 2a 2a 20 65 66 66 65   has the.** effe
5bc0: 63 74 20 6f 66 20 69 6e 76 61 6c 69 64 61 74 69  ct of invalidati
5bd0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
5be0: 69 6c 65 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69  ile and committi
5bf0: 6e 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  ng the.** transa
5c00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
5c10: 20 69 6e 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c   int zeroJournal
5c20: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5c30: 72 2c 20 69 6e 74 20 64 6f 54 72 75 6e 63 61 74  r, int doTruncat
5c40: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
5c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74  QLITE_OK;.  stat
5c60: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65  ic const char ze
5c70: 72 6f 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b  roHdr[28] = {0};
5c80: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5c90: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20  journalOff ){.  
5ca0: 20 20 69 36 34 20 69 4c 69 6d 69 74 20 3d 20 70    i64 iLimit = p
5cb0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
5cc0: 7a 65 4c 69 6d 69 74 3b 0a 0a 20 20 20 20 49 4f  zeLimit;..    IO
5cd0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
5ce0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
5cf0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
5d00: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
5d10: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5d20: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
5d30: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
5d40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
5d50: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
5d60: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
5d70: 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a  fd, zeroHdr, siz
5d80: 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29  eof(zeroHdr), 0)
5d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5da0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
5db0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
5dc0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5dd0: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
5de0: 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49 54 45  ger->jfd, SQLITE
5df0: 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 7c 70  _SYNC_DATAONLY|p
5e00: 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
5e10: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  s);.    }..    /
5e20: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
5e30: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
5e40: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62 75 74  is committed but
5e50: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
5e60: 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c  .    ** is still
5e70: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c   held on the fil
5e80: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
5e90: 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f 6e 66   size limit conf
5ea0: 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20 20 20  igured for .    
5eb0: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
5ec0: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  t journal and th
5ed0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
5ee0: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75 6d 65  urrently consume
5ef0: 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20 73 70  s more.    ** sp
5f00: 61 63 65 20 74 68 61 6e 20 74 68 61 74 20 6c 69  ace than that li
5f10: 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72 2c 20  mit allows for, 
5f20: 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f 77 2e  truncate it now.
5f30: 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
5f40: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79 6e 63  d.    ** to sync
5f50: 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c 6f 77   the file follow
5f60: 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74 69  ing this operati
5f70: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  on..    */.    i
5f80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5f90: 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29 7b 0a   && iLimit>0 ){.
5fa0: 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a 20 20        i64 sz;.  
5fb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5fc0: 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
5fd0: 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a 20 20  r->jfd, &sz);.  
5fe0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
5ff0: 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c 69 6d  TE_OK && sz>iLim
6000: 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  it ){.        rc
6010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
6020: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
6030: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
6040: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
6050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6060: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6070: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6080: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
6090: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
60a0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
60b0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
60c0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
60d0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
60e0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
60f0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
6100: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
6110: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
6120: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
6130: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
6140: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
6150: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
6160: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
6170: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
6180: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
6190: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
61a0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
61b0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
61c0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
61d0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
61e0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
61f0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
6200: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
6210: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
6220: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
6230: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6240: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
6250: 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  nal..** - 4 byte
6260: 73 3a 20 44 61 74 61 62 61 73 65 20 70 61 67 65  s: Database page
6270: 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f   size..** .** Fo
6280: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
6290: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29 20  AL_HDR_SZ - 28) 
62a0: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
62b0: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
62c0: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
62d0: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
62e0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
62f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
6300: 72 20 2a 7a 48 65 61 64 65 72 20 3d 20 70 50 61  r *zHeader = pPa
6310: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
6320: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
6330: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
6340: 3b 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 0a  ;.  u32 nWrite;.
6350: 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 69 66 28    int ii;..  if(
6360: 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e 41 4c   nHeader>JOURNAL
6370: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6380: 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 3d  ){.    nHeader =
6390: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
63a0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
63b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
63c0: 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
63d0: 73 20 61 6e 64 20 61 6e 79 20 6f 66 20 74 68 65  s and any of the
63e0: 6d 20 77 65 72 65 20 63 72 65 61 74 65 64 20 73  m were created s
63f0: 69 6e 63 65 20 74 68 65 0a 20 20 2a 2a 20 6d 6f  ince the.  ** mo
6400: 73 74 20 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61  st recent journa
6410: 6c 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  l header was wri
6420: 74 74 65 6e 2c 20 75 70 64 61 74 65 20 74 68 65  tten, update the
6430: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
6440: 69 48 64 72 4f 66 66 0a 20 20 2a 2a 20 66 69 65  iHdrOff.  ** fie
6450: 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20  lds now..  */.  
6460: 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61  for(ii=0; ii<pPa
6470: 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
6480: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20   ii++){.    if( 
6490: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
64a0: 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65  nt[ii].iHdrOffse
64b0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  t==0 ){.      pP
64c0: 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
64d0: 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74 20  [ii].iHdrOffset 
64e0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
64f0: 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lOff;.    }.  }.
6500: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
6510: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
6520: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
6530: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
6540: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
6550: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
6560: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6570: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
6580: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
6590: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
65a0: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
65b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
65c0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
65d0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
65e0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
65f0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
6600: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
6610: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
6620: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
6630: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
6640: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
6650: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
6660: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
6670: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
6680: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
6690: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
66a0: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
66b0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
66c0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
66d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
66e0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
66f0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
6700: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
6710: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
6720: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
6730: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
6740: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
6750: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
6760: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
6770: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6780: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
6790: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
67a0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
67b0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
67c0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
67d0: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
67e0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
67f0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
6800: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
6810: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
6820: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
6830: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
6840: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
6850: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
6860: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
6870: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
6880: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
6890: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
68a0: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
68b0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
68c0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
68d0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
68e0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
68f0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
6900: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
6910: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
6920: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
6930: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
6940: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
6950: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6960: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
6970: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
6980: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
6990: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
69a0: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
69b0: 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
69c0: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
69d0: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
69e0: 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74  RY).   || (sqlit
69f0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
6a00: 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
6a10: 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43  ->fd)&SQLITE_IOC
6a20: 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
6a30: 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62  .  ){.    put32b
6a40: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6a50: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6a60: 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29  c)], 0xffffffff)
6a70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6a80: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
6a90: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
6aa0: 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20  lMagic)], 0);.  
6ab0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  }..  /* The rand
6ac0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
6ad0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
6ae0: 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
6af0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6b00: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6b10: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6b20: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6b30: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6b40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6b50: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6b60: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6b70: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6b80: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6b90: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6ba0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6bb0: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6bc0: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6bd0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6be0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6bf0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
6c00: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6c10: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6c20: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6c30: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20  >sectorSize);.. 
6c40: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69 6e 67   /* Initializing
6c50: 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65   the tail of the
6c60: 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 6e   buffer is not n
6c70: 65 63 65 73 73 61 72 79 2e 20 20 45 76 65 72 79  ecessary.  Every
6c80: 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72 6b 73  thing.  ** works
6c90: 20 66 69 6e 64 20 69 66 20 74 68 65 20 66 6f 6c   find if the fol
6ca0: 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28 29 20  lowing memset() 
6cb0: 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42 75 74  is omitted.  But
6cc0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a 20 20   initializing.  
6cd0: 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 72  ** the memory pr
6ce0: 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e 64 20  events valgrind 
6cf0: 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69 6e 67  from complaining
6d00: 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69 6c 6c  , so we are will
6d10: 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61 6b 65  ing to.  ** take
6d20: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
6d30: 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d   hit..  */.  mem
6d40: 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  set(&zHeader[siz
6d50: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6d60: 63 29 2b 31 36 5d 2c 20 30 2c 0a 20 20 20 20 20  c)+16], 0,.     
6d70: 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73 69 7a      nHeader-(siz
6d80: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6d90: 63 29 2b 31 36 29 29 3b 0a 0a 20 20 69 66 28 20  c)+16));..  if( 
6da0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6db0: 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  dr==0 ){.    /* 
6dc0: 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 2a 2f  The page size */
6dd0: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
6de0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6df0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
6e00: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
6e10: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ize);.  }..  for
6e20: 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53  (nWrite=0; rc==S
6e30: 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65  QLITE_OK&&nWrite
6e40: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
6e50: 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b  pPager); nWrite+
6e60: 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49  =nHeader){.    I
6e70: 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
6e80: 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
6e90: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6ea0: 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72  rnalHdr, nHeader
6eb0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
6ec0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6ed0: 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c  r->jfd, zHeader,
6ee0: 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72   nHeader, pPager
6ef0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20  ->journalOff);. 
6f00: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
6f10: 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72  alOff += nHeader
6f20: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
6f30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
6f40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
6f50: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
6f60: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20  this is called. 
6f70: 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  A journal header
6f80: 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41   file.** (JOURNA
6f90: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
6fa0: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
6fb0: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
6fc0: 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n in the journal
6fd0: 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f  .** file. See co
6fe0: 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e  mments above fun
6ff0: 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e  ction writeJourn
7000: 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65  alHdr() for a de
7010: 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20  scription of.** 
7020: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
7030: 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a  er format..**.**
7040: 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69   If the header i
7050: 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  s read successfu
7060: 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65  lly, *nRec is se
7070: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
7080: 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72  of.** page recor
7090: 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69  ds following thi
70a0: 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62  s header and *db
70b0: 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74  Size is set to t
70c0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
70d0: 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
70e0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
70f0: 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65  n began, in page
7100: 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d  s. Also, pPager-
7110: 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73  >cksumInit.** is
7120: 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
7130: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
7140: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
7150: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
7160: 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73  urned.** in this
7170: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
7180: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
7190: 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20  er file appears 
71a0: 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c  to be corrupted,
71b0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a   SQLITE_DONE is.
71c0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  ** returned and 
71d0: 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a  *nRec and *dbSiz
71e0: 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20  e are not set.  
71f0: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
7200: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
7210: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
7220: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7230: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
7240: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
7250: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
7260: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
7270: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34   *pPager, .  i64
7280: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20   journalSize,.  
7290: 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75  u32 *pNRec, .  u
72a0: 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20  32 *pDbSize.){. 
72b0: 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
72c0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
72d0: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
72e0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
72f0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
7300: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 6e 74  4 jrnlOff;.  int
7310: 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 73   iPageSize;..  s
7320: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
7330: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
7340: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
7350: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
7360: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
7370: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
7380: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
7390: 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20    }.  jrnlOff = 
73a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
73b0: 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ff;..  rc = sqli
73c0: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
73d0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
73e0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20 6a  izeof(aMagic), j
73f0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
7400: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
7410: 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69 7a 65   jrnlOff += size
7420: 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20 20 69  of(aMagic);..  i
7430: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
7440: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7450: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7460: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
7470: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
7480: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
7490: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
74a0: 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e 52 65  d, jrnlOff, pNRe
74b0: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
74c0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
74d0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
74e0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
74f0: 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  f+4, &pPager->ck
7500: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
7510: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7520: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7530: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7540: 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62 53 69  jrnlOff+8, pDbSi
7550: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
7560: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7570: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7580: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
7590: 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29 26 69  ff+16, (u32 *)&i
75a0: 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28  PageSize);.  if(
75b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a   rc==SQLITE_OK .
75c0: 20 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3e     && iPageSize>
75d0: 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50 61 67  =512 .   && iPag
75e0: 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
75f0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
7600: 26 26 20 28 28 69 50 61 67 65 53 69 7a 65 2d 31  && ((iPageSize-1
7610: 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  )&iPageSize)==0 
7620: 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61  .  ){.    u16 pa
7630: 67 65 73 69 7a 65 20 3d 20 28 75 31 36 29 69 50  gesize = (u16)iP
7640: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
7650: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
7660: 74 50 61 67 65 73 69 7a 65 28 70 50 61 67 65 72  tPagesize(pPager
7670: 2c 20 26 70 61 67 65 73 69 7a 65 29 3b 0a 20 20  , &pagesize);.  
7680: 7d 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  }.  if( rc ) ret
7690: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
76a0: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
76b0: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
76c0: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
76d0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
76e0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
76f0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
7700: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
7710: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
7720: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
7730: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
7740: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
7750: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
7760: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7770: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7780: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7790: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
77a0: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
77b0: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
77c0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
77d0: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
77e0: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
77f0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
7800: 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32 2c 20 26 70  , jrnlOff+12, &p
7810: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
7820: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
7830: 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
7840: 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
7850: 69 7a 65 20 26 20 28 70 50 61 67 65 72 2d 3e 73  ize & (pPager->s
7860: 65 63 74 6f 72 53 69 7a 65 2d 31 29 29 21 3d 30  ectorSize-1))!=0
7870: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61  .         || pPa
7880: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e  ger->sectorSize>
7890: 30 78 31 30 30 30 30 30 30 20 29 7b 0a 20 20 20  0x1000000 ){.   
78a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
78b0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ONE;.  }..  pPag
78c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
78d0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
78e0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
78f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7900: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
7910: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
7920: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
7930: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
7940: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
7950: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
7960: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
7970: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
7980: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
7990: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
79a0: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
79b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
79c0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
79d0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
79e0: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
79f0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7a00: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
7a10: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
7a20: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
7a30: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
7a40: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
7a50: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
7a60: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
7a70: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
7a80: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
7a90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7aa0: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
7ab0: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
7ac0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
7ad0: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
7ae0: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
7af0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
7b00: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
7b10: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
7b20: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
7b30: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
7b40: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
7b50: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a  ournal name..**.
7b60: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
7b70: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
7b80: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
7b90: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
7ba0: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
7bb0: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
7bc0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
7bd0: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
7be0: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
7bf0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
7c00: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
7c10: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  t rc;.  int len;
7c20: 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36   .  int i; .  i6
7c30: 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69 36 34  4 jrnlOff;.  i64
7c40: 20 6a 72 6e 6c 53 69 7a 65 3b 0a 20 20 75 33 32   jrnlSize;.  u32
7c50: 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68   cksum = 0;.  ch
7c60: 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61  ar zBuf[sizeof(a
7c70: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a  JournalMagic)+2*
7c80: 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  4];..  if( !zMas
7c90: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
7ca0: 65 74 4d 61 73 74 65 72 20 29 20 72 65 74 75 72  etMaster ) retur
7cb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  n SQLITE_OK;.  i
7cc0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7cd0: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
7ce0: 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
7cf0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
7d00: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
7d10: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
7d20: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
7d30: 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 3b  rlen30(zMaster);
7d40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
7d50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
7d60: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
7d70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
7d80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
7d90: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
7da0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
7db0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
7dc0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
7dd0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
7de0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
7df0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
7e00: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
7e10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
7e20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
7e30: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
7e40: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
7e50: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
7e60: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7e70: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
7e80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7e90: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
7ea0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
7eb0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
7ec0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
7ed0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
7ee0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
7ef0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
7f00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
7f10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
7f20: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
7f30: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7f40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
7f50: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
7f60: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
7f70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7f80: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
7f90: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
7fa0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
7fb0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
7fc0: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
7fd0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
7fe0: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
7ff0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
8000: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
8010: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
8020: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
8030: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
8040: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
8050: 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  Off);.  jrnlOff 
8060: 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  += 8+sizeof(aJou
8070: 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 70 50  rnalMagic);.  pP
8080: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8090: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
80a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
80b0: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
80c0: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
80d0: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
80e0: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
80f0: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
8100: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
8110: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
8120: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
8130: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
8140: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
8150: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
8160: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
8170: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
8180: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
8190: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
81a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
81b0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
81c0: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
81d0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
81e0: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
81f0: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
8200: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
8210: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
8220: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
8230: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
8240: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
8250: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
8260: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
8270: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
8280: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
8290: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 0a  (rc==SQLITE_OK).
82a0: 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69     && (rc = sqli
82b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
82c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 72 6e 6c  ager->jfd, &jrnl
82d0: 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  Size))==SQLITE_O
82e0: 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65  K.   && jrnlSize
82f0: 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b 0a 20 20  >jrnlOff.  ){.  
8300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8310: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
8320: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  >jfd, jrnlOff);.
8330: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
8340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
8350: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
8360: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
8370: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
8380: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
8390: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
83a0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
83b0: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
83c0: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
83d0: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
83e0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
83f0: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 73 71 6c   PgHdr *p;.  sql
8400: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
8410: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
8420: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
8430: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
8440: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
8450: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
8460: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
8470: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
8480: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
8490: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
84a0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
84b0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
84c0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
84d0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
84e0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
84f0: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
8500: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
8510: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
8520: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
8530: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
8540: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
8550: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8560: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
8570: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
8580: 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
8590: 65 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70  eClear(pPager->p
85a0: 50 43 61 63 68 65 29 3b 0a 7d 0a 0a 73 74 61 74  PCache);.}..stat
85b0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 41  ic void releaseA
85c0: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  llSavepoint(Page
85d0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
85e0: 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30  t ii;.  for(ii=0
85f0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
8600: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
8610: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
8620: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
8630: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e  >aSavepoint[ii].
8640: 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  pInSavepoint);. 
8650: 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
8660: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8670: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
8680: 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 6a  Close(pPager->sj
8690: 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
86a0: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
86b0: 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 70  aSavepoint);.  p
86c0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
86d0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
86e0: 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b  >nSavepoint = 0;
86f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .}..static int a
8700: 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74  ddToSavepointBit
8710: 76 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67  vecs(Pager *pPag
8720: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
8730: 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28    int ii;.  for(
8740: 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65 72 2d  ii=0; ii<pPager-
8750: 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
8760: 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53 61 76  +){.    PagerSav
8770: 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70 50 61  epoint *p = &pPa
8780: 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b  ger->aSavepoint[
8790: 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 67 6e  ii];.    if( pgn
87a0: 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20  o<=p->nOrig ){. 
87b0: 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 6d 61       /* TODO: ma
87c0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 68  lloc() failure h
87d0: 61 6e 64 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 20  andling */.     
87e0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
87f0: 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e  t(p->pInSavepoin
8800: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  t, pgno);.    }.
8810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
8820: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8830: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
8840: 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a  base file. .**.*
8850: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
8860: 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 65  s currently in e
8870: 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73 63  rror state, disc
8880: 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ard the contents
8890: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63 68   of .** the cach
88a0: 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65 20  e and reset the 
88b0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
88c0: 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e 20  internal state. 
88d0: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  If there is.** a
88e0: 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d 66  n open journal-f
88f0: 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e 65  ile, then the ne
8900: 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65 64  xt time a shared
8910: 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65  -lock is obtaine
8920: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67 65  d.** on the page
8930: 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73 20  r file (by this 
8940: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
8950: 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20 62  cess), it will b
8960: 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20  e.** treated as 
8970: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e  a hot-journal an
8980: 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  d rolled back..*
8990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
89a0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
89b0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
89c0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
89d0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
89e0: 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b  nt rc = osUnlock
89f0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
8a00: 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
8a10: 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c ) pPager->errC
8a20: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 70 50  ode = rc;.    pP
8a30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
8a40: 64 20 3d 20 30 3b 0a 20 20 20 20 49 4f 54 52 41  d = 0;.    IOTRA
8a50: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
8a60: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
8a70: 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65   /* Always close
8a80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
8a90: 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20  e when dropping 
8aa0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
8ab0: 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65 72 77  k..    ** Otherw
8ac0: 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f 6e  ise, another con
8ad0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f 75  nection with jou
8ae0: 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74 65  rnal_mode=delete
8af0: 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20 64 65   might.    ** de
8b00: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6f 75  lete the file ou
8b10: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75 73 2e  t from under us.
8b20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8b30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b40: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pen ){.      sql
8b50: 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
8b60: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
8b70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8b80: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  pen = 0;.      s
8b90: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
8ba0: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
8bb0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 70  ournal);.      p
8bc0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
8bd0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
8be0: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
8bf0: 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
8c00: 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  sRollback);.    
8c10: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79    pPager->pAlway
8c20: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
8c30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
8c40: 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73  Pager.errCode is
8c50: 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e   set, the conten
8c60: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ts of the pager 
8c70: 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a  cache cannot be.
8c80: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
8c90: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
8ca0: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
8cb0: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
8cc0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
8cd0: 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73  cache can be dis
8ce0: 63 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65  carded and the e
8cf0: 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79  rror code safely
8d00: 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
8d10: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
8d20: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
8d30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
8d40: 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e 65 72  _OK ) pPager->er
8d50: 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
8d60: 4b 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  K;.      pager_r
8d70: 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
8d80: 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61      releaseAllSa
8d90: 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72 29 3b  vepoint(pPager);
8da0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8db0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
8dc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
8dd0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
8de0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
8df0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8e00: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72     }..    pPager
8e10: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8e20: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67  UNLOCK;.    pPag
8e30: 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
8e40: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  one = 0;.  }.}..
8e50: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
8e60: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
8e70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
8e80: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
8e90: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
8ea0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
8eb0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
8ec0: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
8ed0: 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e   state, .** do n
8ee0: 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72  ot attempt the r
8ef0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ollback..*/.stat
8f00: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
8f10: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
8f20: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
8f30: 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  p->errCode==SQLI
8f40: 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74  TE_OK && p->stat
8f50: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
8f60: 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  D ){.    sqlite3
8f70: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
8f80: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
8f90: 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29  PagerRollback(p)
8fa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
8fb0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
8fc0: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
8fd0: 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ck(p);.}../*.** 
8fe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
8ff0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
9000: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
9010: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
9020: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
9030: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
9040: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
9050: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
9060: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
9070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9080: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
9090: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
90a0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
90b0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
90c0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
90d0: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
90e0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
90f0: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
9100: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
9110: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
9120: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
9130: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
9140: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
9150: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
9160: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
9170: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
9180: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
9190: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
91a0: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
91b0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
91c0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
91d0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
91e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
91f0: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
9200: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
9210: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
9220: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
9230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
9240: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
9250: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
9260: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
9270: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
9280: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
9290: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
92a0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
92b0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
92c0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
92d0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
92e0: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
92f0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61 73  *pPager, int has
9300: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
9310: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9320: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
9330: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
9340: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
9350: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
9360: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9370: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41  ;.  }.  releaseA
9380: 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
9390: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
93a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
93b0: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
93c0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
93d0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
93e0: 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
93f0: 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a 6f 75   int isMemoryJou
9400: 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 49 73  rnal = sqlite3Is
9410: 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  MemJournal(pPage
9420: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 73  r->jfd);.      s
9430: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
9440: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
9450: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9460: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
9470: 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79 4a 6f   if( !isMemoryJo
9480: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
9490: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
94a0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
94b0: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
94c0: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
94d0: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
94e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
94f0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
9500: 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a  ALMODE_TRUNCATE.
9510: 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
9520: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
9530: 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ate(pPager->jfd,
9540: 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   0))==SQLITE_OK 
9550: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
9560: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
9570: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9580: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
9590: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
95a0: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
95b0: 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20  veMode .     || 
95c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
95d0: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
95e0: 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
95f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
9600: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
9610: 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65  pPager, hasMaste
9620: 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  r);.      pager_
9630: 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
9640: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
9650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
9660: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
9670: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
9680: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
9690: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
96a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
96b0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
96c0: 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72 63 20  DE_DELETE || rc 
96d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
96e0: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
96f0: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
9700: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
9710: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
9720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
9730: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
9740: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
9750: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9760: 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  e(pPager->pVfs, 
9770: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
9780: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
9790: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
97a0: 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
97b0: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
97c0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49  ;.    pPager->pI
97d0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
97e0: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
97f0: 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
9800: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b  AlwaysRollback);
9810: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
9820: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
9830: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
9840: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9850: 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65  sqlite3PcacheIte
9860: 72 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72  rateDirty(pPager
9870: 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72  ->pPCache, pager
9880: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a  _set_pagehash);.
9890: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
98a0: 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
98b0: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
98c0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
98d0: 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20  irtyCache = 0;. 
98e0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
98f0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
9900: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9910: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
9920: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
9930: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
9940: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
9950: 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  = osUnlock(pPage
9960: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
9970: 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  CK);.    pPager-
9980: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
9990: 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  HARED;.  }else i
99a0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
99b0: 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29  ==PAGER_SYNCED )
99c0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
99d0: 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
99e0: 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61  USIVE;.  }.  pPa
99f0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
9a00: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
9a10: 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
9a20: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
9a30: 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75 4c 69   = 0;.  /* lruLi
9a40: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
9a50: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 69  (pPager); */.  i
9a60: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
9a70: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
9a80: 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  alid = 0;.  }.  
9a90: 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
9aa0: 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72  ed = 0;..  retur
9ab0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
9ac0: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
9ad0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
9ae0: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
9af0: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
9b00: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
9b10: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
9b20: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
9b30: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
9b40: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
9b50: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
9b60: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
9b70: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
9b80: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
9b90: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
9ba0: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
9bb0: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
9bc0: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
9bd0: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
9be0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
9bf0: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
9c00: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
9c10: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
9c20: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
9c30: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
9c40: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
9c50: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
9c60: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
9c70: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
9c80: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
9c90: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
9ca0: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
9cb0: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
9cc0: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
9cd0: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
9ce0: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
9cf0: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
9d00: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
9d10: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
9d20: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
9d30: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
9d40: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
9d50: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
9d60: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
9d70: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
9d80: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
9d90: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
9da0: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
9db0: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
9dc0: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
9dd0: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
9de0: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
9df0: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
9e00: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
9e10: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
9e20: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
9e30: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
9e40: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
9e50: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
9e60: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
9e70: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
9e80: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
9e90: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
9ea0: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
9eb0: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
9ec0: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
9ed0: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
9ee0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
9ef0: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
9f00: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
9f10: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
9f20: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
9f30: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
9f40: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
9f50: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
9f60: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
9f70: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
9f80: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
9f90: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
9fa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
9fb0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
9fc0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
9fd0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
9fe0: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
9ff0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
a000: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
a010: 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e 4a 72  .** The isMainJr
a020: 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  nl flag is true 
a030: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  if this is the m
a040: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
a050: 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73  rnal and.** fals
a060: 65 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  e for the statem
a070: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
a080: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20  e main rollback 
a090: 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20  journal uses.** 
a0a0: 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68 65 20  checksums - the 
a0b0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
a0c0: 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 73  l does not..*/.s
a0d0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a0e0: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
a0f0: 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
a100: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
a110: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
a120: 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63  being played bac
a130: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69  k */.  int isMai
a140: 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20  nJrnl,          
a150: 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69       /* 1 -> mai
a160: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20  n journal. 0 -> 
a170: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
a180: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 20 20 20    i64 offset,   
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63  /* Offset of rec
a1b0: 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ord to playback 
a1c0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f  */.  Bitvec *pDo
a1d0: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
a1e0: 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20     /* Bitvec of 
a1f0: 70 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c  pages already pl
a200: 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 29 7b 0a  ayed back */.){.
a210: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
a220: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
a230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
a240: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
a250: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
a260: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
a270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a280: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
a290: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
a2a0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
a2b0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
a2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
a2d0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
a2e0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
a2f0: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
a300: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
a310: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
a320: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
a330: 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  page */.  sqlite
a340: 33 5f 66 69 6c 65 20 2a 6a 66 64 20 3d 20 28 69  3_file *jfd = (i
a350: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
a360: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
a370: 2d 3e 73 6a 66 64 29 3b 0a 0a 20 20 2f 2a 20 54  ->sjfd);..  /* T
a380: 68 65 20 74 65 6d 70 20 73 74 6f 72 61 67 65 20  he temp storage 
a390: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
a3a0: 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  d at this point 
a3b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 44 61  */.  assert( aDa
a3c0: 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65  ta );..  rc = re
a3d0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66  ad32bits(jfd, of
a3e0: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
a3f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a400: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
a410: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
a420: 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20  ead(jfd, aData, 
a430: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a440: 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69  , offset+4);.  i
a450: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a460: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a470: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a480: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
a490: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
a4a0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
a4b0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
a4c0: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
a4d0: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
a4e0: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
a4f0: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
a500: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
a510: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
a520: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
a530: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
a540: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
a550: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
a560: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
a570: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
a580: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
a590: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
a5a0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
a5b0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
a5c0: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
a5d0: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
a5e0: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
a5f0: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
a600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
a610: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
a620: 67 6e 6f 3e 28 50 67 6e 6f 29 70 50 61 67 65 72  gno>(Pgno)pPager
a630: 2d 3e 64 62 53 69 7a 65 20 7c 7c 20 73 71 6c 69  ->dbSize || sqli
a640: 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 44  te3BitvecTest(pD
a650: 6f 6e 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  one, pgno) ){.  
a660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a670: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  OK;.  }.  if( is
a680: 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20  MainJrnl ){.    
a690: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a6a0: 6a 66 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67  jfd, offset+pPag
a6b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20  er->pageSize+4, 
a6c0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
a6d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a6e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
a6f0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
a700: 20 20 69 66 28 20 21 70 44 6f 6e 65 20 26 26 20    if( !pDone && 
a710: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
a720: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
a730: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
a740: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a750: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
a760: 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71  Done && (rc = sq
a770: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
a780: 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 20 29 7b 0a  Done, pgno)) ){.
a790: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
a7a0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
a7b0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
a7c0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
a7d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a7e0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a7f0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
a800: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
a810: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
a820: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
a830: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
a840: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
a850: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
a860: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
a870: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
a880: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
a890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a8a0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
a8b0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
a8c0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
a8d0: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
a8e0: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
a8f0: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
a900: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
a910: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
a920: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
a930: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
a940: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
a950: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
a960: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
a970: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
a980: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
a990: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
a9a0: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
a9b0: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
a9c0: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
a9d0: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
a9e0: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
a9f0: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
aa00: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
aa10: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
aa20: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
aa30: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
aa40: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
aa50: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
aa60: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
aa70: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
aa80: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
aa90: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
aaa0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
aab0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
aac0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
aad0: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
aae0: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
aaf0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
ab00: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
ab10: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
ab20: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
ab30: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
ab40: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ab50: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ab60: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
ab70: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
ab80: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
ab90: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
aba0: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
abb0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
abc0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
abd0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
abe0: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
abf0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
ac00: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
ac10: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
ac20: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
ac30: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
ac40: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
ac50: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
ac60: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
ac70: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ac80: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ac90: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
aca0: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
acb0: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
acc0: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
acd0: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
ace0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
acf0: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
ad00: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ad10: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
ad20: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
ad30: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
ad40: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
ad50: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
ad60: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
ad70: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
ad80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ad90: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
ada0: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
adb0: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
adc0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
add0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ade0: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
adf0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
ae00: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ae10: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
ae20: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ae30: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
ae40: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ae50: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
ae60: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
ae70: 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
ae80: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
ae90: 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
aea0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
aeb0: 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
aec0: 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
aed0: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
aee0: 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
aef0: 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
af00: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
af10: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
af20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
af30: 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
af40: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  ened..  */.  pPg
af50: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
af60: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
af70: 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c   PAGERTRACE4("PL
af80: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
af90: 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
afa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
afb0: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
afc0: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
afd0: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
afe0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b  geSize, aData));
aff0: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
b000: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
b010: 4c 55 53 49 56 45 29 0a 20 20 20 26 26 20 28 70  LUSIVE).   && (p
b020: 50 67 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67  Pg==0 || 0==(pPg
b030: 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
b040: 45 44 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20  ED_SYNC)).   && 
b050: 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
b060: 74 68 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20  thods).  ){.    
b070: 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
b080: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
b090: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
b0a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b0b0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
b0c0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
b0d0: 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20  geSize, ofst);. 
b0e0: 20 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a   }.  if( pPg ){.
b0f0: 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73      /* No page s
b100: 68 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78  hould ever be ex
b110: 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20  plicitly rolled 
b120: 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20  back that is in 
b130: 75 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20  use, except.    
b140: 2a 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68  ** for page 1 wh
b150: 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75  ich is held in u
b160: 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b  se in order to k
b170: 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  eep the lock on 
b180: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
b190: 61 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65  ase active. Howe
b1a0: 76 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20  ver such a page 
b1b0: 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  may be rolled ba
b1c0: 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20  ck as a result. 
b1d0: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65     ** of an inte
b1e0: 72 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c  rnal error resul
b1f0: 74 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d  ting in an autom
b200: 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20  atic call to.   
b210: 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
b220: 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  Rollback()..    
b230: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
b240: 74 61 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20  ta;.    pData = 
b250: 70 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20  pPg->pData;.    
b260: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
b270: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
b280: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
b290: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
b2a0: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
b2b0: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
b2c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
b2d0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29 7b 0a 20   isMainJrnl ){. 
b2e0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
b2f0: 68 65 4d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29  heMakeClean(pPg)
b300: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
b310: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
b320: 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
b330: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
b340: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
b350: 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  f.    /* If this
b360: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
b370: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
b380: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46  lue of Pager.dbF
b390: 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a 20  ileVers..    ** 
b3a0: 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 61  Do this before a
b3b0: 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a  ny decoding. */.
b3c0: 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
b3d0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
b3e0: 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
b3f0: 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61 74  ers, &((u8*)pDat
b400: 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70 50  a)[24],sizeof(pP
b410: 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
b420: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
b430: 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61 67  * Decode the pag
b440: 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  e just read from
b450: 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f 44   disk */.    COD
b460: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
b470: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
b480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
b490: 63 68 65 52 65 6c 65 61 73 65 28 70 50 67 29 3b  cheRelease(pPg);
b4a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b4b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
b4c0: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
b4d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
b4e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
b4f0: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
b500: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
b510: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
b520: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b530: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
b540: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
b550: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b560: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
b570: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
b580: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
b590: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
b5a0: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
b5b0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d   is..**.** Argum
b5c0: 65 6e 74 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  ent zMaster may 
b5d0: 70 6f 69 6e 74 20 74 6f 20 50 61 67 65 72 2e 70  point to Pager.p
b5e0: 54 6d 70 53 70 61 63 65 2e 20 53 6f 20 74 68 61  TmpSpace. So tha
b5f0: 74 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20  t buffer is not 
b600: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  .** available fo
b610: 72 20 75 73 65 20 77 69 74 68 69 6e 20 74 68 69  r use within thi
b620: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
b630: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
b640: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
b650: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
b660: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
b670: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
b680: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
b690: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
b6a0: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
b6b0: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
b6c0: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
b6d0: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
b6e0: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
b6f0: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
b700: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
b710: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
b720: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
b730: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
b740: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
b750: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
b760: 73 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ster(Pager *pPag
b770: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
b780: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71 6c 69  zMaster){.  sqli
b790: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
b7a0: 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
b7b0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
b7c0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
b7d0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
b7e0: 4d 61 73 74 65 72 3b 0a 20 20 73 71 6c 69 74 65  Master;.  sqlite
b7f0: 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
b800: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
b810: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
b820: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
b830: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b840: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
b850: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
b860: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
b870: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
b880: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
b890: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b8a0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
b8b0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
b8c0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
b8d0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
b8e0: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
b8f0: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
b900: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
b910: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61  ence..  */.  pMa
b920: 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65 33 5f  ster = (sqlite3_
b930: 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 4d 61  file *)sqlite3Ma
b940: 6c 6c 6f 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46  lloc(pVfs->szOsF
b950: 69 6c 65 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75  ile * 2);.  pJou
b960: 72 6e 61 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f  rnal = (sqlite3_
b970: 66 69 6c 65 20 2a 29 28 28 28 75 38 20 2a 29 70  file *)(((u8 *)p
b980: 4d 61 73 74 65 72 29 20 2b 20 70 56 66 73 2d 3e  Master) + pVfs->
b990: 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 69 66 28  szOsFile);.  if(
b9a0: 20 21 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20   !pMaster ){.   
b9b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
b9c0: 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
b9d0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
b9e0: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
b9f0: 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
ba00: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
ba10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ba20: 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
ba30: 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
ba40: 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
ba50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
ba60: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
ba70: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
ba80: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63  _open = 1;..  rc
ba90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
baa0: 53 69 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e  Size(pMaster, &n
bab0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
bac0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bad0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
bae0: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
baf0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
bb00: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
bb10: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
bb20: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
bb30: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74  0;.    int nMast
bb40: 65 72 50 74 72 20 3d 20 70 50 61 67 65 72 2d 3e  erPtr = pPager->
bb50: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
bb60: 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64  +1;..    /* Load
bb70: 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74   the entire mast
bb80: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
bb90: 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
bba0: 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ned from.    ** 
bbb0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
bbc0: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
bbd0: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
bbe0: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
bbf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
bc00: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 4d  (char *)sqlite3M
bc10: 61 6c 6c 6f 63 28 28 69 6e 74 29 6e 4d 61 73 74  alloc((int)nMast
bc20: 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e 4d 61 73  erJournal + nMas
bc30: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 69 66 28  terPtr);.    if(
bc40: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
bc50: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
bc60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
bc70: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
bc80: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
bc90: 20 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 26 7a   zMasterPtr = &z
bca0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d  MasterJournal[nM
bcb0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d 3b 0a 20  asterJournal];. 
bcc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
bcd0: 73 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a  sRead(pMaster, z
bce0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28  MasterJournal, (
bcf0: 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
bd00: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  al, 0);.    if( 
bd10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bd20: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
bd30: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
bd40: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
bd50: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
bd60: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
bd70: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
bd80: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
bd90: 20 69 6e 74 20 65 78 69 73 74 73 3b 0a 20 20 20   int exists;.   
bda0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
bdb0: 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4a  sAccess(pVfs, zJ
bdc0: 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41  ournal, SQLITE_A
bdd0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 65  CCESS_EXISTS, &e
bde0: 78 69 73 74 73 29 3b 0a 20 20 20 20 20 20 69 66  xists);.      if
bdf0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
be00: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
be10: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
be20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
be30: 20 65 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20   exists ){.     
be40: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
be50: 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65   journals pointe
be60: 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74  d to by the mast
be70: 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  er journal exist
be80: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70  s..        ** Op
be90: 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20  en it and check 
bea0: 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  if it points at 
beb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
bec0: 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a  al. If.        *
bed0: 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74  * so, return wit
bee0: 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68  hout deleting th
bef0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
bf00: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
bf10: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  /.        int c;
bf20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61  .        int fla
bf30: 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45  gs = (SQLITE_OPE
bf40: 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54  N_READONLY|SQLIT
bf50: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
bf60: 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72 63  NAL);.        rc
bf70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
bf80: 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c  (pVfs, zJournal,
bf90: 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67 73   pJournal, flags
bfa0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
bfb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bfc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
bfd0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
bfe0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
bff0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
c000: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75 72  terJournal(pJour
c010: 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72 2c  nal, zMasterPtr,
c020: 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
c030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
c040: 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b 0a  lose(pJournal);.
c050: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c060: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c070: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
c080: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
c090: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
c0a0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d 21  = zMasterPtr[0]!
c0b0: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
c0c0: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
c0d0: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )==0;.        if
c0e0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
c0f0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
c100: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
c110: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c120: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
c130: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
c140: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
c150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c160: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
c170: 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
c180: 30 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  0(zJournal)+1);.
c190: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
c1a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
c1b0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
c1c0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
c1d0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
c1e0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
c1f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
c200: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
c210: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
c220: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
c230: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c240: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
c250: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
c260: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
c270: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
c280: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
c290: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
c2a0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
c2b0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
c2c0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
c2d0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
c2e0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
c2f0: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
c300: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
c310: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
c320: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
c330: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
c340: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
c350: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
c360: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
c370: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
c380: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
c390: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
c3a0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
c3b0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
c3c0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
c3d0: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
c3e0: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
c3f0: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
c400: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
c410: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
c420: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
c430: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
c440: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
c450: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
c460: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
c470: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
c480: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
c490: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
c4a0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
c4b0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
c4c0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
c4d0: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
c4e0: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
c4f0: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
c500: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
c510: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
c520: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
c530: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
c540: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
c550: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
c560: 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
c570: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
c580: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
c590: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c5a0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
c5b0: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
c5c0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
c5d0: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
c5e0: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
c5f0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
c600: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
c610: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
c620: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
c630: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
c640: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
c650: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
c660: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
c670: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
c680: 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
c690: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
c6a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c6b0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
c6c0: 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
c6d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c6e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
c6f0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
c700: 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
c710: 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
c720: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
c730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c740: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
c750: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
c760: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
c770: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
c780: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c790: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c7a0: 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20   sectorSize for 
c7b0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
c7c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f  .**.** The secto
c7d0: 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61  r size is at lea
c7e0: 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65  st as big as the
c7f0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
c800: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
c810: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
c820: 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  ).  The minimum 
c830: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35  sector size is 5
c840: 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
c850: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
c860: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c870: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
c880: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
c890: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
c8a0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
c8b0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
c8c0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
c8d0: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
c8e0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
c8f0: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
c900: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
c910: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
c920: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
c930: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
c940: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
c950: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
c960: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
c970: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c980: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
c990: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
c9a0: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
c9b0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c9c0: 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
c9d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c9e0: 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = 512;.  }.}../
c9f0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
ca00: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
ca10: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
ca20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
ca30: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
ca40: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
ca50: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
ca60: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
ca70: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ca80: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
ca90: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
caa0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
cab0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
cac0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
cad0: 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
cae0: 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
caf0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
cb00: 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
cb10: 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
cb20: 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
cb30: 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
cb40: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
cb50: 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
cb60: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
cb70: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
cb80: 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
cb90: 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
cba0: 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
cbb0: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
cbc0: 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
cbd0: 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
cbe0: 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
cbf0: 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
cc00: 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
cc10: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
cc20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
cc30: 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
cc40: 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
cc50: 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
cc60: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
cc70: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
cc80: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
cc90: 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
cca0: 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
ccb0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
ccc0: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
ccd0: 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
cce0: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
ccf0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
cd00: 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
cd10: 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
cd20: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
cd30: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cd40: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
cd50: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
cd60: 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
cd70: 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
cd80: 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
cd90: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
cda0: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
cdb0: 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
cdc0: 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
cdd0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cde0: 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
cdf0: 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
ce00: 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
ce10: 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
ce20: 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
ce30: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
ce40: 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
ce50: 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
ce60: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
ce70: 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
ce80: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
ce90: 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
cea0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
ceb0: 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
cec0: 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
ced0: 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
cee0: 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
cef0: 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
cf00: 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
cf10: 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
cf20: 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
cf30: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
cf40: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
cf50: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
cf60: 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
cf70: 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
cf80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
cf90: 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
cfa0: 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
cfb0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
cfc0: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
cfd0: 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
cfe0: 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
cff0: 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
d000: 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
d010: 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
d020: 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
d030: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
d040: 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
d050: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
d060: 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
d070: 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
d080: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
d090: 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
d0a0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
d0b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
d0c0: 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
d0d0: 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
d0e0: 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
d0f0: 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
d100: 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
d110: 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
d120: 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
d130: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d140: 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
d150: 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
d160: 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
d170: 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
d180: 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
d190: 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
d1a0: 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
d1b0: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
d1c0: 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
d1d0: 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
d1e0: 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
d1f0: 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
d200: 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
d210: 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
d220: 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
d230: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
d240: 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
d250: 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
d260: 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
d270: 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
d280: 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
d290: 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
d2a0: 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
d2b0: 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
d2c0: 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
d2d0: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
d2e0: 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
d2f0: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
d300: 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
d310: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
d320: 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
d330: 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
d340: 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
d350: 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
d360: 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
d370: 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
d380: 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
d390: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
d3a0: 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
d3b0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
d3c0: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
d3d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
d3e0: 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
d3f0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
d400: 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
d410: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
d420: 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
d430: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
d440: 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
d450: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
d460: 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
d470: 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
d480: 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
d490: 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
d4a0: 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
d4b0: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
d4c0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
d4d0: 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
d4e0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
d4f0: 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
d500: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
d510: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
d520: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
d530: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
d540: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
d550: 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
d560: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
d570: 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
d580: 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
d590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5a0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
d5b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
d5c0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
d5d0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
d5e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d5f0: 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
d600: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
d610: 32 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  2 u;            
d620: 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
d630: 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
d640: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
d650: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
d660: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
d670: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
d680: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6a0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
d6b0: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
d6c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
d6d0: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
d6e0: 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
d6f0: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63   by sqlite3OsAcc
d700: 65 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  ess() */.  char 
d710: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
d720: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
d730: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
d740: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
d750: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
d760: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
d770: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
d780: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
d790: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
d7a0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
d7b0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d7c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
d7d0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
d7e0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
d7f0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
d800: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d810: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
d820: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
d830: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
d840: 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
d850: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
d860: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
d870: 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
d880: 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
d890: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
d8a0: 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
d8b0: 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
d8c0: 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
d8d0: 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
d8e0: 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
d8f0: 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
d900: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
d910: 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
d920: 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73  ack..  */.  zMas
d930: 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
d940: 6d 70 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20  mpSpace;.  rc = 
d950: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
d960: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  l(pPager->jfd, z
d970: 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
d980: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
d990: 2b 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  +1);.  if( rc==S
d9a0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
d9b0: 74 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 72 63  ter[0] ){.    rc
d9c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65   = sqlite3OsAcce
d9d0: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  ss(pVfs, zMaster
d9e0: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
d9f0: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20  EXISTS, &res);. 
da00: 20 7d 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 30   }.  zMaster = 0
da10: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
da20: 54 45 5f 4f 4b 20 7c 7c 20 21 72 65 73 20 29 7b  TE_OK || !res ){
da30: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
da40: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50  ayback;.  }.  pP
da50: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
da60: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
da70: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
da80: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
da90: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
daa0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
dab0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
dac0: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
dad0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
dae0: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
daf0: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
db00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
db10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
db20: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
db30: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
db40: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
db50: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
db60: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
db70: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
db80: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
db90: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
dba0: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
dbb0: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
dbc0: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
dbd0: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
dbe0: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
dbf0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
dc00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
dc10: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
dc20: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
dc30: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
dc40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dc50: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
dc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
dc80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
dc90: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
dca0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
dcb0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
dcc0: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
dcd0: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
dce0: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
dcf0: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
dd00: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
dd10: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
dd20: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
dd30: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
dd40: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
dd50: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
dd60: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
dd70: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
dd80: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
dd90: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
dda0: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
ddb0: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
ddc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ddd0: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
dde0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ddf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
de00: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
de10: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
de20: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
de30: 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
de40: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
de50: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
de60: 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
de70: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
de80: 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
de90: 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
dea0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
deb0: 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
dec0: 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
ded0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
dee0: 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
def0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
df00: 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
df10: 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
df20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
df30: 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
df40: 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
df50: 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
df60: 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
df70: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
df80: 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
df90: 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
dfa0: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
dfb0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
dfc0: 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
dfd0: 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
dfe0: 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
dff0: 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
e000: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
e010: 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
e020: 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
e030: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
e040: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
e050: 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
e060: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
e070: 20 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28    nRec = (int)((
e080: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
e090: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
e0a0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
e0b0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
e0c0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
e0d0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
e0e0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
e0f0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
e100: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
e110: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
e120: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
e130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e140: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e150: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
e160: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
e170: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
e180: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e190: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
e1a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e1b0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e1c0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
e1d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e1e0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
e1f0: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
e200: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62  he journal and b
e210: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ack into the dat
e220: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
e230: 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30 3b 20  */.    for(u=0; 
e240: 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a 20 20  u<nRec; u++){.  
e250: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e260: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e270: 28 70 50 61 67 65 72 2c 20 31 2c 20 70 50 61 67  (pPager, 1, pPag
e280: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
e290: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
e2a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e2b0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
e2c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
e2d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
e2e0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
e2f0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
e300: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
e310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e320: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e330: 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61        /* If we a
e340: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c  re unable to rol
e350: 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  lback, then the 
e360: 64 61 74 61 62 61 73 65 20 69 73 20 70 72 6f 62  database is prob
e370: 61 62 6c 79 0a 20 20 20 20 20 20 20 20 20 20 2a  ably.          *
e380: 2a 20 67 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75  * going to end u
e390: 70 20 62 65 69 6e 67 20 63 6f 72 72 75 70 74 2e  p being corrupt.
e3a0: 20 20 49 74 20 69 73 20 63 6f 72 72 75 70 74 20    It is corrupt 
e3b0: 74 6f 20 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20  to us, anyhow.. 
e3c0: 20 20 20 20 20 20 20 20 20 2a 2a 20 50 65 72 68           ** Perh
e3d0: 61 70 73 20 74 68 65 20 6e 65 78 74 20 70 72 6f  aps the next pro
e3e0: 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f  cess to come alo
e3f0: 6e 67 20 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e  ng can fix it...
e400: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
e410: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e420: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e430: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
e440: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
e450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e460: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
e470: 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
e480: 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
e490: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
e4a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
e4b0: 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
e4c0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
e4d0: 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
e4e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
e4f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
e500: 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
e510: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
e520: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
e530: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e540: 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
e550: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
e560: 72 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27  r, zMaster[0]!='
e570: 5c 30 27 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \0');.  }.  if( 
e580: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e590: 20 7a 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72   zMaster[0] && r
e5a0: 65 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  es ){.    /* If 
e5b0: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
e5c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
e5d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
e5e0: 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
e5f0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
e600: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
e610: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
e620: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
e630: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
e640: 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
e650: 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
e660: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
e670: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
e680: 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
e690: 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
e6a0: 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
e6b0: 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
e6c0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
e6d0: 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
e6e0: 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
e6f0: 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
e700: 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
e710: 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
e720: 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
e730: 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
e740: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
e750: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
e760: 50 6c 61 79 62 61 63 6b 20 61 20 73 61 76 65 70  Playback a savep
e770: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
e780: 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63  int pagerPlaybac
e790: 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72  kSavepoint(Pager
e7a0: 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53   *pPager, PagerS
e7b0: 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70  avepoint *pSavep
e7c0: 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a  oint){.  i64 szJ
e7d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e7e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
e7f0: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
e800: 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20  .  i64 iHdrOff; 
e810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e820: 6e 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d  nd of first segm
e830: 65 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72  ent of main-jour
e840: 6e 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  nal records */. 
e850: 20 50 67 6e 6f 20 69 69 3b 20 20 20 20 20 20 20   Pgno ii;       
e860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
e870: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
e880: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
e890: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
e8a0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76  n code */.  Bitv
e8b0: 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20  ec *pDone = 0;  
e8c0: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74       /* Bitvec t
e8d0: 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20 70  o ensure pages p
e8e0: 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20  layed back only 
e8f0: 6f 6e 63 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  once */..  /* Al
e900: 6c 6f 63 61 74 65 20 61 20 62 69 74 76 65 63 20  locate a bitvec 
e910: 74 6f 20 75 73 65 20 74 6f 20 73 74 6f 72 65 20  to use to store 
e920: 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 73  the set of pages
e930: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a   rolled back */.
e940: 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
e950: 20 29 7b 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20   ){.    pDone = 
e960: 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
e970: 61 74 65 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e  ate(pSavepoint->
e980: 6e 4f 72 69 67 29 3b 0a 20 20 20 20 69 66 28 20  nOrig);.    if( 
e990: 21 70 44 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20  !pDone ){.      
e9a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
e9b0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  MEM;.    }.  }..
e9c0: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
e9d0: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
e9e0: 74 6f 20 74 68 65 20 73 69 7a 65 20 69 74 20 77  to the size it w
e9f0: 61 73 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20  as before the . 
ea00: 20 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 62 65   ** savepoint be
ea10: 69 6e 67 20 72 65 76 65 72 74 65 64 20 77 61 73  ing reverted was
ea20: 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
ea30: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
ea40: 61 74 65 28 70 50 61 67 65 72 2c 20 70 53 61 76  ate(pPager, pSav
ea50: 65 70 6f 69 6e 74 3f 70 53 61 76 65 70 6f 69 6e  epoint?pSavepoin
ea60: 74 2d 3e 6e 4f 72 69 67 3a 70 50 61 67 65 72 2d  t->nOrig:pPager-
ea70: 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20 20  >origDbSize);.  
ea80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ea90: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
eaa0: 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  RED );..  /* Now
eab0: 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 20 6d   roll back all m
eac0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
ead0: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 6f 63   records that oc
eae0: 63 75 72 20 61 66 74 65 72 20 62 79 74 65 0a 20  cur after byte. 
eaf0: 20 2a 2a 20 62 79 74 65 20 6f 66 66 73 65 74 20   ** byte offset 
eb00: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
eb10: 4f 66 66 73 65 74 20 74 68 61 74 20 68 61 76 65  Offset that have
eb20: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6c   a page number l
eb30: 65 73 73 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72  ess than.  ** or
eb40: 20 65 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53   equal to PagerS
eb50: 61 76 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2e 20  avepoint.nOrig. 
eb60: 41 73 20 65 61 63 68 20 72 65 63 6f 72 64 20 69  As each record i
eb70: 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 0a 20  s played back,. 
eb80: 20 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f   ** the correspo
eb90: 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 62 69 74  nding bit in bit
eba0: 76 65 63 20 50 61 67 65 72 53 61 76 65 70 6f 69  vec PagerSavepoi
ebb0: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
ebc0: 69 73 20 0a 20 20 2a 2a 20 63 6c 65 61 72 65 64  is .  ** cleared
ebd0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70  ..  */.  szJ = p
ebe0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ebf0: 66 3b 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  f;.  if( pSavepo
ec00: 69 6e 74 20 29 7b 0a 20 20 20 20 69 48 64 72 4f  int ){.    iHdrO
ec10: 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
ec20: 3e 69 48 64 72 4f 66 66 73 65 74 20 3f 20 70 53  >iHdrOffset ? pS
ec30: 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
ec40: 66 73 65 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20  fset : szJ;.    
ec50: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ec60: 66 66 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d  ff = pSavepoint-
ec70: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 77 68  >iOffset;.    wh
ec80: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ec90: 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
eca0: 75 72 6e 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66  urnalOff<iHdrOff
ecb0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
ecc0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
ecd0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
ece0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
ecf0: 6c 4f 66 66 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  lOff, pDone);.  
ed00: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
ed10: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
ed20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ed30: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
ed40: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lOff = 0;.  }.  
ed50: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
ed60: 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
ed70: 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
ed80: 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
ed90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eda0: 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
edb0: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
edc0: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
edd0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
ede0: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
edf0: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
ee00: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ee10: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
ee20: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
ee30: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
ee40: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
ee50: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
ee60: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
ee70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
ee80: 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
ee90: 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
eea0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
eeb0: 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
eec0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
eed0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
eee0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
eef0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
ef00: 66 66 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20  ff, pDone);.    
ef10: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
ef20: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
ef30: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
ef40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
ef50: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
ef60: 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a 0a 20 20  lOff==szJ );..  
ef70: 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62 61 63 6b  /* Now roll back
ef80: 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20   pages from the 
ef90: 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
efa0: 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
efb0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 69 3d 70   ){.    for(ii=p
efc0: 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53 75 62 52  Savepoint->iSubR
efd0: 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ec; rc==SQLITE_O
efe0: 4b 20 26 26 20 69 69 3c 70 50 61 67 65 72 2d 3e  K && ii<pPager->
eff0: 73 74 6d 74 4e 52 65 63 3b 20 69 69 2b 2b 29 7b  stmtNRec; ii++){
f000: 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65  .      i64 offse
f010: 74 20 3d 20 69 69 2a 28 34 2b 70 50 61 67 65 72  t = ii*(4+pPager
f020: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
f030: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
f040: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
f050: 70 50 61 67 65 72 2c 20 30 2c 20 6f 66 66 73 65  pPager, 0, offse
f060: 74 2c 20 70 44 6f 6e 65 29 3b 0a 20 20 20 20 20  t, pDone);.     
f070: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
f080: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
f090: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
f0a0: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
f0b0: 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
f0c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f0d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f0e0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
f0f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f100: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
f110: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
f120: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
f130: 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77  s that are allow
f140: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
f150: 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
f160: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
f170: 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  er, int mxPage){
f180: 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
f190: 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  SetCachesize(pPa
f1a0: 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d 78  ger->pPCache, mx
f1b0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
f1c0: 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73  Adjust the robus
f1d0: 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74  tness of the dat
f1e0: 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20  abase to damage 
f1f0: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
f200: 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61  s.** or power fa
f210: 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69  ilures by changi
f220: 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ng the number of
f230: 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77   syncs()s when w
f240: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f  riting.** the ro
f250: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
f260: 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65   There are three
f270: 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20   levels:.**.**  
f280: 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69    OFF       sqli
f290: 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e  te3OsSync() is n
f2a0: 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68  ever called.  Th
f2b0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
f2c0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
f2d0: 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20    for temporary 
f2e0: 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69  and transient fi
f2f0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f  les..**.**    NO
f300: 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72  RMAL    The jour
f310: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e  nal is synced on
f320: 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73  ce before writes
f330: 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a   begin on the.**
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
f350: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73  tabase.  This is
f360: 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61   normally adequa
f370: 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62  te protection, b
f380: 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
f390: 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74     it is theoret
f3a0: 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c  ically possible,
f3b0: 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c   though very unl
f3c0: 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20  ikely,.**       
f3d0: 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69         that an i
f3e0: 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20  nopertune power 
f3f0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
f400: 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  ave the journal.
f410: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f420: 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68  in a state which
f430: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d   would cause dam
f440: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
f450: 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ase.**          
f460: 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72      when it is r
f470: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
f480: 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54  *    FULL      T
f490: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
f4a0: 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72  nced twice befor
f4b0: 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f  e writes begin o
f4c0: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
f4d0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
f4e0: 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69  with some additi
f4f0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
f500: 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c   - the nRec fiel
f510: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
f520: 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c    of the journal
f530: 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20   header - being 
f540: 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65  written in betwe
f550: 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20  en the two.**   
f560: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73             syncs
f570: 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65  ).  If we assume
f580: 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a   that writing a.
f590: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
f5a0: 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74  single disk sect
f5b0: 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68  or is atomic, th
f5c0: 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f  en this mode pro
f5d0: 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  vides.**        
f5e0: 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20        assurance 
f5f0: 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
f600: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
f610: 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a  rupted to the.**
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
f630: 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64  int of causing d
f640: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
f650: 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c  abase during rol
f660: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d  lback..**.** Num
f670: 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f  eric values asso
f680: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73  ciated with thes
f690: 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46  e states are OFF
f6a0: 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a  ==1, NORMAL=2,.*
f6b0: 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f  * and FULL=3..*/
f6c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f6d0: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f6e0: 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  AS.void sqlite3P
f6f0: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
f700: 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  el(Pager *pPager
f710: 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74  , int level, int
f720: 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20 20   bFullFsync){.  
f730: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
f740: 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70    (level==1 || p
f750: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
f760: 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
f770: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65 76  >fullSync = (lev
f780: 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72  el==3 && !pPager
f790: 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a 30  ->tempFile) ?1:0
f7a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
f7b0: 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c 46  _flags = (bFullF
f7c0: 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e 43  sync?SQLITE_SYNC
f7d0: 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59 4e  _FULL:SQLITE_SYN
f7e0: 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66 28  C_NORMAL);.  if(
f7f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
f800: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
f810: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
f820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
f830: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
f840: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
f850: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
f860: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
f870: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
f880: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
f890: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
f8a0: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
f8b0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
f8c0: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
f8d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f8e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
f8f0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
f900: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
f910: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
f920: 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
f930: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
f940: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
f950: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
f960: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
f970: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
f980: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
f990: 77 65 20 66 61 69 6c 2e 20 54 68 65 20 4f 53 20  we fail. The OS 
f9a0: 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c  will automatical
f9b0: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65  ly delete the te
f9c0: 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 20  mporary.** file 
f9d0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
f9e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
f9f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
fa00: 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
fa10: 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
fa20: 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
fa30: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
fa40: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
fa50: 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
fa60: 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
fa70: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
fa80: 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
fa90: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
faa0: 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
fab0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
fac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
fad0: 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
fae0: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
faf0: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
fb00: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
fb10: 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
fb20: 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
fb30: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
fb40: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
fb50: 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
fb60: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
fb70: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
fb80: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
fb90: 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
fba0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
fbb0: 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
fbc0: 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
fbd0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
fbe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
fbf0: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
fc00: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
fc10: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .}..static int p
fc20: 61 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20  agerStress(void 
fc30: 2a 2c 50 67 48 64 72 20 2a 29 3b 0a 0a 2f 2a 0a  *,PgHdr *);../*.
fc40: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
fc50: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
fc60: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
fc70: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
fc80: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
fc90: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
fca0: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
fcb0: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
fcc0: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
fcd0: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
fce0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
fcf0: 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69 73  agerGet() and is
fd00: 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20   only held open 
fd10: 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73  until the.** las
fd20: 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73  t page is releas
fd30: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
fd40: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2a  PagerUnref()..**
fd50: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
fd60: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
fd70: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
fd80: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
fd90: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
fda0: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
fdb0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
fdc0: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
fdd0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
fde0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
fdf0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
fe00: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
fe10: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
fe20: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
fe30: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
fe40: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
fe50: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
fe60: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
fe70: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
fe80: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
fe90: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
fea0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
feb0: 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  rOpen(.  sqlite3
fec0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
fed0: 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
fee0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f 20   file system to 
fef0: 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a  use */.  Pager *
ff00: 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20 20  *ppPager,       
ff10: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
ff20: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
ff30: 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  here */.  const 
ff40: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
ff50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
ff60: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
ff70: 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
ff80: 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20   nExtra,        
ff90: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62        /* Extra b
ffa0: 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65  ytes append to e
ffb0: 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ach in-memory pa
ffc0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ge */.  int flag
ffd0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
ffe0: 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f   /* flags contro
fff0: 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20  lling this file 
10000 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
10010 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s             /*
10020 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   flags passed th
10030 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10040 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10050 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20  ){.  u8 *pPtr;. 
10060 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
10070 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
10080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
10090 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c  i;.  int tempFil
100a0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d  e = 0;.  int mem
100b0 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  Db = 0;.  int re
100c0 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e  adOnly = 0;.  in
100d0 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28  t useJournal = (
100e0 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d  flags & PAGER_OM
100f0 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a  IT_JOURNAL)==0;.
10100 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
10110 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
10120 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
10130 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c  0;.  int journal
10140 46 69 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  FileSize;.  int 
10150 70 63 61 63 68 65 53 69 7a 65 20 3d 20 73 71 6c  pcacheSize = sql
10160 69 74 65 33 50 63 61 63 68 65 53 69 7a 65 28 29  ite3PcacheSize()
10170 3b 0a 20 20 69 6e 74 20 73 7a 50 61 67 65 44 66  ;.  int szPageDf
10180 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
10190 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
101a0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
101b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 74   = 0;.  int nPat
101c0 68 6e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  hname = 0;..  if
101d0 28 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  ( sqlite3Journal
101e0 53 69 7a 65 28 70 56 66 73 29 3e 73 71 6c 69 74  Size(pVfs)>sqlit
101f0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
10200 28 29 20 29 7b 0a 20 20 20 20 6a 6f 75 72 6e 61  () ){.    journa
10210 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
10220 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
10230 56 66 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Vfs);.  }else{. 
10240 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
10250 7a 65 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 4a  ze = sqlite3MemJ
10260 6f 75 72 6e 61 6c 53 69 7a 65 28 29 3b 0a 20 20  ournalSize();.  
10270 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  }..  /* The defa
10280 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20 61 20  ult return is a 
10290 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  NULL pointer */.
102a0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a    *ppPager = 0;.
102b0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6e  .  /* Compute an
102c0 64 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c  d store the full
102d0 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 61 6e 20   pathname in an 
102e0 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72  allocated buffer
102f0 20 70 6f 69 6e 74 65 64 0a 20 20 2a 2a 20 74 6f   pointed.  ** to
10300 20 62 79 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6c   by zPathname, l
10310 65 6e 67 74 68 20 6e 50 61 74 68 6e 61 6d 65 2e  ength nPathname.
10320 20 4f 72 2c 20 69 66 20 74 68 69 73 20 69 73 20   Or, if this is 
10330 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
10340 2c 0a 20 20 2a 2a 20 6c 65 61 76 65 20 62 6f 74  ,.  ** leave bot
10350 68 20 6e 50 61 74 68 6e 61 6d 65 20 61 6e 64 20  h nPathname and 
10360 7a 50 61 74 68 6e 61 6d 65 20 73 65 74 20 74 6f  zPathname set to
10370 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a   0..  */.  if( z
10380 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
10390 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
103a0 6e 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  nPathname = pVfs
103b0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
103c0 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 20 3d 20      zPathname = 
103d0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 50  sqlite3Malloc(nP
103e0 61 74 68 6e 61 6d 65 2a 32 29 3b 0a 20 20 20 20  athname*2);.    
103f0 69 66 28 20 7a 50 61 74 68 6e 61 6d 65 3d 3d 30  if( zPathname==0
10400 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10420 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10430 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
10440 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
10450 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
10460 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
10470 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
10480 20 20 20 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d      zPathname[0]
10490 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 0a   = 0;.    }else.
104a0 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20  #endif.    {.   
104b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
104c0 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
104d0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  fs, zFilename, n
104e0 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
104f0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
10500 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10510 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10520 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
10530 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
10540 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   rc;.    }.    n
10550 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
10560 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
10570 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  name);.  }..  /*
10580 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
10590 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73   for the pager s
105a0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50  tructure */.  pP
105b0 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61  ager = sqlite3Ma
105c0 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69  llocZero(.    si
105d0 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20  zeof(*pPager) + 
105e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
105f0 65 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  er structure */.
10600 20 20 20 20 70 63 61 63 68 65 53 69 7a 65 20 20      pcacheSize  
10610 20 20 20 20 2b 20 20 20 20 20 20 20 20 20 20 20      +           
10620 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
10630 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46   */.    journalF
10640 69 6c 65 53 69 7a 65 20 2b 20 20 20 20 20 20 20  ileSize +       
10650 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
10660 61 6c 20 66 69 6c 65 20 73 74 72 75 63 74 75 72  al file structur
10670 65 20 2a 2f 20 0a 20 20 20 20 70 56 66 73 2d 3e  e */ .    pVfs->
10680 73 7a 4f 73 46 69 6c 65 20 20 2b 20 20 20 20 20  szOsFile  +     
10690 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
106a0 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 20  n db file */.   
106b0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
106c0 20 2a 20 32 20 2b 20 20 20 20 20 20 20 2f 2a 20   * 2 +       /* 
106d0 54 68 65 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  The two journal 
106e0 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a  files */ .    3*
106f0 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 20  nPathname + 40  
10700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
10710 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
10720 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  ry, zJournal */.
10730 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67    );.  if( !pPag
10740 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
10750 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
10760 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
10770 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
10780 20 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68    pPager->pPCach
10790 65 20 3d 20 28 50 43 61 63 68 65 20 2a 29 26 70  e = (PCache *)&p
107a0 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 74 72  Pager[1];.  pPtr
107b0 20 3d 20 28 28 75 38 20 2a 29 26 70 50 61 67 65   = ((u8 *)&pPage
107c0 72 5b 31 5d 29 20 2b 20 70 63 61 63 68 65 53 69  r[1]) + pcacheSi
107d0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 76 66  ze;.  pPager->vf
107e0 73 46 6c 61 67 73 20 3d 20 76 66 73 46 6c 61 67  sFlags = vfsFlag
107f0 73 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  s;.  pPager->fd 
10800 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
10810 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
10820 73 46 69 6c 65 2a 30 5d 3b 0a 20 20 70 50 61 67  sFile*0];.  pPag
10830 65 72 2d 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69  er->sjfd = (sqli
10840 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b  te3_file*)&pPtr[
10850 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 5d 3b  pVfs->szOsFile];
10860 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d  .  pPager->jfd =
10870 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10880 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
10890 46 69 6c 65 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  File+journalFile
108a0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
108b0 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
108c0 61 72 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  ar*)&pPtr[pVfs->
108d0 73 7a 4f 73 46 69 6c 65 2b 32 2a 6a 6f 75 72 6e  szOsFile+2*journ
108e0 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
108f0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
10900 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
10910 6c 65 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65  lename[nPathname
10920 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
10930 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
10940 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50  r->zDirectory[nP
10950 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50  athname+1];.  pP
10960 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56 66  ager->pVfs = pVf
10970 73 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  s;.  if( zPathna
10980 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  me ){.    memcpy
10990 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
109a0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
109b0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20  Pathname+1);.   
109c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
109d0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  athname);.  }.. 
109e0 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67   /* Open the pag
109f0 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  er file..  */.  
10a00 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
10a10 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26   zFilename[0] &&
10a20 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69   !memDb ){.    i
10a30 66 28 20 6e 50 61 74 68 6e 61 6d 65 3e 28 70 56  f( nPathname>(pV
10a40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 2d  fs->mxPathname -
10a50 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 22 2d 6a   (int)sizeof("-j
10a60 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20 20  ournal")) ){.   
10a70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
10a80 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65 6c  ANTOPEN;.    }el
10a90 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6f  se{.      int fo
10aa0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ut = 0;.      rc
10ab0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
10ac0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
10ad0 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65 72  Filename, pPager
10ae0 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ->fd,.          
10af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
10b00 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 2c  Pager->vfsFlags,
10b10 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 72   &fout);.      r
10b20 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74 26  eadOnly = (fout&
10b30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10b40 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ONLY);..      /*
10b50 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
10b60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
10b70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
10b80 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
10b90 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65    ** choose a de
10ba0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
10bb0 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20  in case we have 
10bc0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20  to create the.  
10bd0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
10be0 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c  file. The defaul
10bf0 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74  t page size is t
10c00 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20  he maximum of:. 
10c10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10c20 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45 46      + SQLITE_DEF
10c30 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c 0a  AULT_PAGE_SIZE,.
10c40 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
10c50 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
10c60 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
10c70 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20 20  torSize().      
10c80 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72 67  **    + The larg
10c90 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74 68  est page size th
10ca0 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  at can be writte
10cb0 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  n atomically..  
10cc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
10cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10ce0 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
10cf0 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63 74         int iSect
10d00 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
10d10 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
10d20 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10d30 20 20 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74    if( szPageDflt
10d40 3c 69 53 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  <iSectorSize ){.
10d50 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
10d60 44 66 6c 74 20 3d 20 69 53 65 63 74 6f 72 53 69  Dflt = iSectorSi
10d70 7a 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69  ze;.        }.#i
10d80 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10d90 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
10da0 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
10db0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
10dc0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
10dd0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
10de0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
10df0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
10e00 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
10e10 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
10e20 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a  512==(512>>8));.
10e30 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
10e40 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
10e50 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e  OMIC64K==(65536>
10e60 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
10e70 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 4d 41  assert(SQLITE_MA
10e80 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
10e90 49 5a 45 3c 3d 36 35 35 33 36 29 3b 0a 20 20 20  IZE<=65536);.   
10ea0 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 73 7a         for(ii=sz
10eb0 50 61 67 65 44 66 6c 74 3b 20 69 69 3c 3d 53 51  PageDflt; ii<=SQ
10ec0 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
10ed0 5f 50 41 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69  _PAGE_SIZE; ii=i
10ee0 69 2a 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i*2){.          
10ef0 20 20 69 66 28 20 69 44 63 26 28 53 51 4c 49 54    if( iDc&(SQLIT
10f00 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28  E_IOCAP_ATOMIC|(
10f10 69 69 3e 3e 38 29 29 20 29 20 73 7a 50 61 67 65  ii>>8)) ) szPage
10f20 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20 20  Dflt = ii;.     
10f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
10f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
10f50 69 66 28 20 73 7a 50 61 67 65 44 66 6c 74 3e 53  if( szPageDflt>S
10f60 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
10f70 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
10f80 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
10f90 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
10fa0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
10fb0 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
10fc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
10fd0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  lse{.    /* If a
10fe0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10ff0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
11000 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
11010 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
11020 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
11030 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
11040 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
11050 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
11060 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
11070 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
11080 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
11090 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
110a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
110b0 20 62 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20   branch is also 
110c0 72 75 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  run for an in-me
110d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20 41  mory database. A
110e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20  n in-memory.    
110f0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 74  ** database is t
11100 68 65 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d  he same as a tem
11110 70 2d 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e  p-file that is n
11120 65 76 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74  ever written out
11130 20 74 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20   to.    ** disk 
11140 61 6e 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d  and uses an in-m
11150 65 6d 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a  emory rollback j
11160 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a  ournal..    */ .
11170 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
11180 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
11190 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
111a0 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
111b0 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
111c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
111d0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
111e0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
111f0 4d 61 6c 6c 6f 63 28 73 7a 50 61 67 65 44 66 6c  Malloc(szPageDfl
11200 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  t);.  }..  /* If
11210 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
11220 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
11230 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2e  he blocks above.
11240 0a 20 20 2a 2a 20 46 72 65 65 20 74 68 65 20 50  .  ** Free the P
11250 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
11260 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
11270 65 2e 0a 20 20 2a 2a 20 53 69 6e 63 65 20 74 68  e..  ** Since th
11280 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61  e pager is not a
11290 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69  llocated there i
112a0 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74  s no need to set
112b0 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72   .  ** any Pager
112c0 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  .errMask variabl
112d0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  es..  */.  if( !
112e0 70 50 61 67 65 72 20 7c 7c 20 21 70 50 61 67 65  pPager || !pPage
112f0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  r->pTmpSpace ){.
11300 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11310 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
11320 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
11330 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
11340 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
11350 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
11360 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 20 20 6e 45  EM:rc);.  }.  nE
11370 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
11380 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
11390 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f    sqlite3PcacheO
113a0 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20  pen(szPageDflt, 
113b0 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a  nExtra, !memDb,.
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72      !memDb?pager
113e0 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20  Stress:0, (void 
113f0 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  *)pPager, pPager
11400 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50  ->pPCache);..  P
11410 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
11420 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
11430 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e  ANDLEID(pPager->
11440 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  fd), pPager->zFi
11450 6c 65 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  lename);.  IOTRA
11460 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
11470 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
11480 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
11490 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50 61  .  /* Fill in Pa
114a0 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 5b 5d  ger.zDirectory[]
114b0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
114c0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
114d0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
114e0 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31 29  me, nPathname+1)
114f0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
11500 33 53 74 72 6c 65 6e 33 30 28 70 50 61 67 65 72  3Strlen30(pPager
11510 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 0a  ->zDirectory); .
11520 20 20 20 20 20 20 69 3e 30 20 26 26 20 70 50 61        i>0 && pPa
11530 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
11540 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
11550 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
11560 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
11570 5b 69 2d 31 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  [i-1] = 0;..  /*
11580 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
11590 4a 6f 75 72 6e 61 6c 5b 5d 20 2a 2f 0a 20 20 69  Journal[] */.  i
115a0 66 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a  f( zPathname ){.
115b0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
115c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
115d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
115e0 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  nPathname);.    
115f0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
11600 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
11610 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
11620 20 39 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   9);.  }else{.  
11630 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
11640 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  al = 0;.  }..  /
11650 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
11660 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
11670 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
11680 61 6c 20 3d 20 28 75 38 29 75 73 65 4a 6f 75 72  al = (u8)useJour
11690 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  nal;.  pPager->n
116a0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52  oReadlock = (noR
116b0 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
116c0 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20  nly) ?1:0;.  /* 
116d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
116e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
116f0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
11700 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
11710 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a  ger->nRef = 0; *
11720 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  /.  pPager->dbSi
11730 7a 65 56 61 6c 69 64 20 3d 20 28 75 38 29 6d 65  zeValid = (u8)me
11740 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  mDb;.  pPager->p
11750 61 67 65 53 69 7a 65 20 3d 20 73 7a 50 61 67 65  ageSize = szPage
11760 44 66 6c 74 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Dflt;.  /* pPage
11770 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
11780 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
11790 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20  >stmtJSize = 0; 
117a0 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
117b0 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  nPage = 0; */.  
117c0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
117d0 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   100;.  pPager->
117e0 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f  mxPgno = SQLITE_
117f0 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a  MAX_PAGE_COUNT;.
11800 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
11810 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
11820 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  K; */.  assert( 
11830 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d  pPager->state ==
11840 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47   (tempFile ? PAG
11850 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50  ER_EXCLUSIVE : P
11860 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a  AGER_UNLOCK) );.
11870 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
11880 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
11890 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
118a0 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 0a  = (u8)tempFile;.
118b0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
118c0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
118d0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
118e0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
118f0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
11900 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
11910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
11920 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
11930 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
11940 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
11950 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 74 65  iveMode = (u8)te
11960 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
11970 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38 29 6d  r->memDb = (u8)m
11980 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
11990 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38 29 72  readOnly = (u8)r
119a0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
119b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
119c0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
119d0 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61 67 65  >noSync = (pPage
119e0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
119f0 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31 3a 30  useJournal) ?1:0
11a00 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
11a10 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
11a20 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
11a30 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
11a40 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
11a50 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
11a60 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
11a70 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
11a80 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
11a90 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
11aa0 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
11ab0 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
11ac0 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70 50 61   = nExtra;.  pPa
11ad0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ger->journalSize
11ae0 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44  Limit = SQLITE_D
11af0 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53  EFAULT_JOURNAL_S
11b00 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73  IZE_LIMIT;.  ass
11b10 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
11b20 70 4d 65 74 68 6f 64 73 7c 7c 74 65 6d 70 46 69  pMethods||tempFi
11b30 6c 65 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72  le);.  setSector
11b40 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Size(pPager);.  
11b50 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20  if( memDb ){.   
11b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11b70 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
11b80 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b  RNALMODE_MEMORY;
11b90 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
11ba0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
11bb0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
11bc0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
11bd0 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  Arg = 0; */.  /*
11be0 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
11bf0 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
11c00 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
11c10 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
11c20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
11c30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11c40 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
11c50 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
11c60 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
11c70 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
11c80 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67 65  yhandler(.  Page
11c90 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 6e  r *pPager, .  in
11ca0 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72  t (*xBusyHandler
11cb0 29 28 76 6f 69 64 20 2a 29 2c 0a 20 20 76 6f 69  )(void *),.  voi
11cc0 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41  d *pBusyHandlerA
11cd0 72 67 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72  rg.){  .  pPager
11ce0 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->xBusyHandler =
11cf0 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20   xBusyHandler;. 
11d00 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
11d10 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79  ndlerArg = pBusy
11d20 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f  HandlerArg;.}../
11d30 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
11d40 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
11d50 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
11d60 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
11d70 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
11d80 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
11d90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
11da0 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
11db0 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
11dc0 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
11dd0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
11de0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
11df0 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
11e00 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
11e10 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
11e20 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
11e30 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
11e40 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
11e50 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
11e60 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
11e70 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
11e80 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  tReiniter(Pager 
11e90 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
11ea0 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a  xReinit)(DbPage*
11eb0 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
11ec0 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
11ed0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
11ee0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 74 6f  the page size to
11ef0 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49 66 20   *pPageSize. If 
11f00 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20  the suggest new 
11f10 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a 2a 20  page size is.** 
11f20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74  inappropriate, t
11f30 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  hen an alternati
11f40 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  ve page size is 
11f50 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 76  set to that.** v
11f60 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75  alue before retu
11f70 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rning..*/.int sq
11f80 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
11f90 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
11fa0 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67 65 53  ger, u16 *pPageS
11fb0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ize){.  int rc =
11fc0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
11fd0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
11fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
11ff0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
12000 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
12010 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
12020 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
12030 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
12040 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
12050 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
12060 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
12070 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
12080 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  geSize .     && 
12090 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
120a0 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
120b0 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
120c0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
120d0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
120e0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
120f0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
12100 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
12110 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
12120 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
12130 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
12140 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12150 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
12160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
12170 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
12180 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
12190 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
121a0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  eSize;.        i
121b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
121c0 62 20 29 20 73 65 74 53 65 63 74 6f 72 53 69 7a  b ) setSectorSiz
121d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
121e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
121f0 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
12200 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 70  pace);.        p
12210 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
12220 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
12230 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 65   sqlite3PcacheSe
12240 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65 72  tPageSize(pPager
12250 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 53  ->pPCache, pageS
12260 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
12270 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53 69    }.    *pPageSi
12280 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65 72  ze = (u16)pPager
12290 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a  ->pageSize;.  }.
122a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
122b0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
122c0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74  ointer to the "t
122d0 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20 62  emporary page" b
122e0 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72  uffer held inter
122f0 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20  nally.** by the 
12300 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73 20  pager.  This is 
12310 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69 73  a buffer that is
12320 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
12330 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72  old the.** entir
12340 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64  e content of a d
12350 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 54  atabase page.  T
12360 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75 73  his buffer is us
12370 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ed internally.**
12380 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
12390 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65   and will be ove
123a0 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65  rwritten wheneve
123b0 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  r a rollback.** 
123c0 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68  occurs.  But oth
123d0 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66  er modules are f
123e0 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f  ree to use it to
123f0 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a  o, as long as.**
12400 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72   no rollbacks ar
12410 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a  e happening..*/.
12420 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
12430 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67 65  erTempSpace(Page
12440 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
12450 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d  turn pPager->pTm
12460 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pSpace;.}../*.**
12470 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
12480 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
12490 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
124a0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
124b0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
124c0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
124d0 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
124e0 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
124f0 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
12500 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
12510 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
12520 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
12530 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
12540 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
12550 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
12560 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
12570 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
12580 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12590 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
125a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
125b0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
125c0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
125d0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
125e0 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
125f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
12600 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
12610 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  0);.  return pPa
12620 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a  ger->mxPgno;.}..
12630 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
12640 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69  ing set of routi
12650 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
12660 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75  disable the simu
12670 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72  lated.** I/O err
12680 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54  or mechanism.  T
12690 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
126a0 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20  e used to avoid 
126b0 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72  simulated.** err
126c0 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68  ors in places wh
126d0 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  ere we do not ca
126e0 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e  re about errors.
126f0 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44  .**.** Unless -D
12700 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73  SQLITE_TEST=1 is
12710 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75   used, these rou
12720 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f  tines are all no
12730 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  -ops.** and gene
12740 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f  rate no code..*/
12750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
12760 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  EST.extern int s
12770 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
12780 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20  pending;.extern 
12790 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
127a0 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63  rror_hit;.static
127b0 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a   int saved_cnt;.
127c0 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d  void disable_sim
127d0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
127e0 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f  (void){.  saved_
127f0 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f  cnt = sqlite3_io
12800 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
12810 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
12820 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
12830 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73  .}.void enable_s
12840 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12850 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  rs(void){.  sqli
12860 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
12870 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74  ding = saved_cnt
12880 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
12890 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  ne disable_simul
128a0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
128b0 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65  .# define enable
128c0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
128d0 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f  rors().#endif../
128e0 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
128f0 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
12900 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12910 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
12920 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
12930 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
12940 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20  .**.** No error 
12950 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
12960 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66  . The rational f
12970 6f 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20  or this is that 
12980 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  this function .*
12990 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  * may be called 
129a0 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65  even if the file
129b0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20   does not exist 
129c0 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61  or contain a hea
129d0 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73  der. In .** thes
129e0 65 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f  e cases sqlite3O
129f0 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74  sRead() will ret
12a00 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f  urn an error, to
12a10 20 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65   which the corre
12a20 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20  ct .** response 
12a30 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d  is to zero the m
12a40 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61  emory at pDest a
12a50 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20  nd continue.  A 
12a60 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a  real IO error .*
12a70 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c  * will presumabl
12a80 79 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70  y recur and be p
12a90 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28  icked up later (
12aa0 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75  Todo: Think abou
12ab0 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20  t this)..*/.int 
12ac0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
12ad0 46 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72  Fileheader(Pager
12ae0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c   *pPager, int N,
12af0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12b00 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  pDest){.  int rc
12b10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
12b20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
12b30 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50   N);.  assert(pP
12b40 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
12b50 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70  ds||pPager->temp
12b60 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70 50 61  File);.  if( pPa
12b70 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
12b80 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  s ){.    IOTRACE
12b90 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
12ba0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
12bb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12bc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
12bd0 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
12be0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
12bf0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
12c00 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
12c10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12c20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12c30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
12c40 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
12c50 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
12c60 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
12c70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12c80 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
12c90 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
12ca0 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
12cb0 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
12cc0 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
12cd0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
12ce0 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
12cf0 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
12d00 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
12d10 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
12d20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
12d30 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
12d40 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
12d50 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
12d60 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
12d70 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
12d80 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
12d90 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
12da0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
12db0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
12dc0 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70 6e 50  pPager, int *pnP
12dd0 61 67 65 29 7b 0a 20 20 69 36 34 20 6e 20 3d 20  age){.  i64 n = 
12de0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  0;.  int rc;.  a
12df0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
12e00 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
12e10 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
12e20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
12e30 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
12e40 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
12e50 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
12e60 6c 69 64 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  lid ){.    n = p
12e70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
12e80 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73   } else {.    as
12e90 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
12ea0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
12eb0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
12ec0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66    if( (pPager->f
12ed0 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20  d->pMethods).   
12ee0 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
12ef0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12f00 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
12f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
12f30 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
12f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12f50 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  }.    if( n>0 &&
12f60 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53   n<pPager->pageS
12f70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ize ){.      n =
12f80 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
12f90 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72       n /= pPager
12fa0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
12fb0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
12fc0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
12fd0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70  NLOCK ){.      p
12fe0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
12ff0 28 69 6e 74 29 6e 3b 0a 20 20 20 20 20 20 70 50  (int)n;.      pP
13000 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
13010 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
13020 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49  .  if( n==(PENDI
13030 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
13040 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
13050 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   n++;.  }.  if( 
13060 6e 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  n>pPager->mxPgno
13070 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
13080 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29 6e  mxPgno = (Pgno)n
13090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 6e 50 61  ;.  }.  if( pnPa
130a0 67 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67  ge ){.    *pnPag
130b0 65 20 3d 20 28 69 6e 74 29 6e 3b 0a 20 20 7d 0a  e = (int)n;.  }.
130c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
130d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  OK;.}../*.** For
130e0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
130f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
13100 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
13110 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  *);../*.** This 
13120 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
13130 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
13140 63 61 63 68 65 20 77 68 65 6e 20 61 20 64 61 74  cache when a dat
13150 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e  abase.** is trun
13160 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f  cated.  Drop fro
13170 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20  m the cache all 
13180 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
13190 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68   is.** larger th
131a0 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
131b0 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
131c0 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  enced..**.** Ref
131d0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
131e0 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
131f0 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
13200 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61  oed..**.** Actua
13210 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e  lly, at the poin
13220 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
13230 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75  s called, it wou
13240 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f  ld be.** an erro
13250 72 20 74 6f 20 68 61 76 65 20 61 20 72 65 66 65  r to have a refe
13260 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75  renced page.  Bu
13270 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 65  t rather than de
13280 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67  lete.** that pag
13290 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20  e and guarantee 
132a0 61 20 73 75 62 73 65 71 75 65 6e 74 20 73 65 67  a subsequent seg
132b0 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20  fault, it seems 
132c0 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72  better.** to zer
132d0 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68  o it and hope th
132e0 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20  at we error out 
132f0 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  sanely..*/.stati
13300 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75  c void pager_tru
13310 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65  ncate_cache(Page
13320 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
13330 6c 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63  lite3PcacheTrunc
13340 61 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61  ate(pPager->pPCa
13350 63 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  che, pPager->dbS
13360 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ize);.}../*.** T
13370 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
13380 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
13390 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
133a0 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
133b0 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
133c0 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
133d0 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  le.  Repeat unti
133e0 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
133f0 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
13400 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
13410 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
13420 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
13430 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
13440 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
13450 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
13460 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
13470 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
13480 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
13490 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
134a0 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
134b0 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pe){.  int rc;..
134c0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
134d0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
134e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
134f0 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
13500 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
13510 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
13520 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
13530 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
13540 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
13550 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
13560 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
13570 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
13580 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
13590 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
135a0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
135b0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
135c0 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61  e unknown */.  a
135d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
135e0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
135f0 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62  ED || pPager->db
13600 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b 0a  SizeValid==0 );.
13610 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13620 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
13630 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13640 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
13650 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
13660 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
13670 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
13680 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
13690 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
136a0 55 53 59 20 26 26 20 70 50 61 67 65 72 2d 3e 78  USY && pPager->x
136b0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
136c0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
136d0 41 72 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Arg) );.    if( 
136e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
136f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
13700 74 61 74 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74  tate = (u8)lockt
13710 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  ype;.      IOTRA
13720 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c  CE(("LOCK %p %d\
13730 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b  n", pPager, lock
13740 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d  type)).    }.  }
13750 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13760 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
13770 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
13780 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
13790 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
137a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
137b0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
137c0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
137d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
137e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
137f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
13800 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
13810 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
13820 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
13830 72 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61  r, 0);.  if( pPa
13840 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
13850 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
13860 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c 73  >errCode;.  }els
13870 65 20 69 66 28 20 6e 50 61 67 65 3c 70 50 61 67  e if( nPage<pPag
13880 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
13890 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
138a0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
138b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
138c0 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  K ){.      /* Ge
138d0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
138e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
138f0 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
13900 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  ating. */.      
13910 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
13920 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
13930 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
13940 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13950 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13960 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13970 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
13980 2c 20 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  , nPage);.    }.
13990 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
139a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
139b0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
139c0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
139d0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
139e0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
139f0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
13a00 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
13a10 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
13a20 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
13a30 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
13a40 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
13a50 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
13a60 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
13a70 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
13a80 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
13a90 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
13aa0 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
13ab0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
13ac0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
13ad0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
13ae0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
13af0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
13b00 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
13b10 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
13b20 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
13b30 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
13b40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13b50 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
13b60 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
13b70 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
13b80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13b90 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
13ba0 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
13bb0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
13bc0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
13bd0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
13be0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
13bf0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
13c00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
13c10 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
13c20 50 61 67 65 72 29 7b 0a 0a 20 20 64 69 73 61 62  Pager){..  disab
13c30 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
13c40 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69  errors();.  sqli
13c50 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
13c60 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72  lloc();.  pPager
13c70 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
13c80 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
13c90 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
13ca0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
13cb0 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  );.  if( !MEMDB 
13cc0 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
13cd0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
13ce0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 65 6e 61  ager);.  }.  ena
13cf0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
13d00 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
13d10 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
13d20 6c 6f 63 28 29 3b 0a 20 20 50 41 47 45 52 54 52  loc();.  PAGERTR
13d30 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
13d40 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
13d50 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  r));.  IOTRACE((
13d60 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
13d70 61 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61  ager)).  if( pPa
13d80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
13d90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
13da0 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a  sClose(pPager->j
13db0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
13dc0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
13dd0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
13de0 61 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  al);.  sqlite3Bi
13df0 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
13e00 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
13e10 61 63 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 41  ack);.  releaseA
13e20 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67  llSavepoint(pPag
13e30 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  er);.  sqlite3Os
13e40 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64  Close(pPager->fd
13e50 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c  );.  /* Temp fil
13e60 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
13e70 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20  ally deleted by 
13e80 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20  the OS.  ** if( 
13e90 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13ea0 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74   ){.  **   sqlit
13eb0 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
13ec0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
13ed0 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71   ** }.  */..  sq
13ee0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50  lite3PageFree(pP
13ef0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29  ager->pTmpSpace)
13f00 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
13f10 65 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70  eClose(pPager->p
13f20 50 43 61 63 68 65 29 3b 0a 20 20 73 71 6c 69 74  PCache);.  sqlit
13f30 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13f40 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13f50 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
13f60 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
13f70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
13f80 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
13f90 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
13fa0 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  r for the given 
13fb0 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67  page data..*/.Pg
13fc0 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  no sqlite3PagerP
13fd0 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65  agenumber(DbPage
13fe0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
13ff0 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66  ->pgno;.}.#endif
14000 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
14010 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
14020 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
14030 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
14040 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
14050 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
14060 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
14070 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
14080 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
14090 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
140a0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
140b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
140c0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
140d0 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
140e0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
140f0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
14100 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
14110 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
14120 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
14130 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
14140 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
14150 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
14160 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
14170 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
14180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
14190 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
141a0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
141b0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
141c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
141d0 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
141e0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
141f0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
14200 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
14210 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
14220 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
14230 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
14240 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
14250 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
14260 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
14270 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
14280 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
14290 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
142a0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
142b0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
142c0 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
142d0 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
142e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
142f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
14300 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
14310 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
14320 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
14330 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
14340 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
14350 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
14360 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
14370 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
14380 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
14390 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
143a0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
143b0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
143c0 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
143d0 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
143e0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
143f0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
14400 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
14410 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
14420 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
14430 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
14440 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20  ure, so no sync 
14450 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
14460 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
14470 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65  NTIAL flag is se
14480 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73  t for the persis
14490 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68  tent media on wh
144a0 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ich.** the datab
144b0 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74  ase is stored, t
144c0 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20  hen OsSync() is 
144d0 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  never called on 
144e0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
144f0 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ile. In this cas
14500 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  e all that is re
14510 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70 64  quired is to upd
14520 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
14530 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75  ld in.** the jou
14540 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a  rnal header..**.
14550 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14560 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
14570 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
14580 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
14590 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
145a0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
145b0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
145c0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
145d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
145e0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
145f0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
14600 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
14610 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
14620 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
14630 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
14640 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
14650 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
14660 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
14670 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
14680 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
14690 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
146a0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
146b0 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
146c0 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
146d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
146e0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
146f0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
14700 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
14710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
14730 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  n );..      if( 
14740 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
14750 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
14760 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
14770 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
14780 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
14790 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
147a0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
147b0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
147c0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
147d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
147e0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
147f0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
14800 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
14810 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
14820 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
14830 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
14840 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
14850 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
14860 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
14870 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
14880 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
14890 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
148a0 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
148b0 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
148c0 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
148d0 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
148e0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
148f0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
14900 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
14910 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
14920 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
14930 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
14940 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
14950 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
14960 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
14970 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
14980 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
14990 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
149a0 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
149b0 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
149c0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
149d0 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b      i64 jrnlOff;
149e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
149f0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
14a00 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
14a10 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
14a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
14a30 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
14a40 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
14a50 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14a60 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  r));.          I
14a70 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
14a80 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
14a90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
14aa0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
14ab0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14ac0 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
14ad0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14ae0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
14af0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
14b00 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67    jrnlOff = pPag
14b10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
14b20 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
14b30 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20  Magic);.        
14b40 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
14b50 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
14b60 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34  ager, jrnlOff, 4
14b70 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
14b80 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
14b90 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
14ba0 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  f, pPager->nRec)
14bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
14bc0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14be0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
14bf0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
14c00 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
14c10 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
14c20 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
14c30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
14c40 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
14c50 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
14c60 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
14c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14c80 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
14c90 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
14ca0 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
14cb0 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
14cc0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
14cd0 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
14ce0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
14cf0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
14d00 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
14d10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14d20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
14d30 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
14d40 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
14d50 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
14d60 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
14d70 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
14d80 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
14d90 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ge..    */.    s
14da0 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 65 61  qlite3PcacheClea
14db0 72 53 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65  rSyncFlags(pPage
14dc0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d  r->pPCache);.  }
14dd0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
14de0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
14df0 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
14e00 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
14e10 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
14e20 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
14e30 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
14e40 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
14e50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14e60 2e 20 4e 6f 20 63 61 6c 6c 73 20 61 72 65 20 6d  . No calls are m
14e70 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ade.** to the pa
14e80 67 65 2d 63 61 63 68 65 20 74 6f 20 6d 61 72 6b  ge-cache to mark
14e90 20 74 68 65 20 70 61 67 65 73 20 61 73 20 63 6c   the pages as cl
14ea0 65 61 6e 2e 20 49 74 20 69 73 20 74 68 65 20 72  ean. It is the r
14eb0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
14ec0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
14ed0 6f 20 75 73 65 20 50 63 61 63 68 65 43 6c 65 61  o use PcacheClea
14ee0 6e 41 6c 6c 28 29 20 6f 72 20 50 63 61 63 68 65  nAll() or Pcache
14ef0 4d 61 6b 65 43 6c 65 61 6e 28 29 20 74 6f 20 6d  MakeClean() to m
14f00 61 72 6b 0a 2a 2a 20 74 68 65 20 70 61 67 65 73  ark.** the pages
14f10 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74   as clean..*/.st
14f20 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
14f30 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67  rite_pagelist(Pg
14f40 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50  Hdr *pList){.  P
14f50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
14f60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  int rc;..  if( p
14f70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
14f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
14f90 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50  ager = pList->pP
14fa0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  ager;..  /* At t
14fb0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20  his point there 
14fc0 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20  may be either a 
14fd0 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
14fe0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
14ff0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
15000 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  file. If there i
15010 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43  s already an EXC
15020 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65  LUSIVE lock, the
15030 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20   following.  ** 
15040 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
15050 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d  OsLock() are no-
15060 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d  ops..  **.  ** M
15070 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66  oving the lock f
15080 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20  rom RESERVED to 
15090 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c  EXCLUSIVE actual
150a0 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e  ly involves goin
150b0 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  g.  ** through a
150c0 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  n intermediate s
150d0 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20  tate PENDING.   
150e0 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70  A PENDING lock p
150f0 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a  revents new.  **
15100 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74   readers from at
15110 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64  taching to the d
15120 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75  atabase but is u
15130 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20  nsufficient for 
15140 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65  us to.  ** write
15150 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61  .  The idea of a
15160 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73   PENDING lock is
15170 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20   to prevent new 
15180 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a  readers from.  *
15190 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c  * coming in whil
151a0 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78  e we wait for ex
151b0 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74  isting readers t
151c0 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20  o clear..  **.  
151d0 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67  ** While the pag
151e0 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53  er is in the RES
151f0 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
15200 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
15210 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20  se file.  ** is 
15220 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65  unchanged and we
15230 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69   can rollback wi
15240 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
15250 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a  playback the.  *
15260 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74  * journal into t
15270 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
15280 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65  base file.  Once
15290 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74   we transition t
152a0 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45  o.  ** EXCLUSIVE
152b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64  , it means the d
152c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
152d0 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e   been changed an
152e0 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20  d any rollback. 
152f0 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65   ** will require
15300 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62   a journal playb
15310 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ack..  */.  rc =
15320 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
15330 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
15340 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
15350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
15370 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  c;.  }..  while(
15380 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20 2f   pList ){..    /
15390 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68 61  * If the file ha
153a0 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
153b0 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
153c0 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  ow. */.    if( !
153d0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
153e0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73  hods ){.      as
153f0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65 6d  sert(pPager->tem
15400 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 63  pFile);.      rc
15410 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15420 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20  pentemp(pPager, 
15430 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
15440 65 72 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20  er->vfsFlags);. 
15450 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
15460 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
15470 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
15480 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
15490 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
154a0 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
154b0 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
154c0 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
154d0 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
154e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
154f0 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c  ncate() was call
15500 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  ed to.    ** mak
15510 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c  e the file small
15520 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62  er (presumably b
15530 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f  y auto-vacuum co
15540 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  de). Do not writ
15550 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63  e.    ** any suc
15560 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66  h pages to the f
15570 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
15580 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c  if( pList->pgno<
15590 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  =pPager->dbSize 
155a0 26 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c  && 0==(pList->fl
155b0 61 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57  ags&PGHDR_DONT_W
155c0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69  RITE) ){.      i
155d0 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 4c 69  64 offset = (pLi
155e0 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
155f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
15600 65 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  e;.      char *p
15610 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50  Data = CODEC2(pP
15620 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
15630 74 61 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  ta, pList->pgno,
15640 20 36 29 3b 0a 0a 20 20 20 20 20 20 50 41 47 45   6);..      PAGE
15650 52 54 52 41 43 45 34 28 22 53 54 4f 52 45 20 25  RTRACE4("STORE %
15660 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
15670 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
15680 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
15690 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
156a0 73 74 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f  st->pgno, pager_
156b0 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29  pagehash(pList))
156c0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
156d0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
156e0 2c 20 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d  , pPager, pList-
156f0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72  >pgno));.      r
15700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
15710 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  te(pPager->fd, p
15720 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15730 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
15740 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
15750 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
15760 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
15770 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
15780 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
15790 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
157a0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  t->pgno==1 ){.  
157b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
157c0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
157d0 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
157e0 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
157f0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
15800 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
15810 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
15820 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
15830 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
15840 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
15850 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
15860 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
15870 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
15880 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15890 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
158a0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
158b0 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
158c0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
158d0 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
158e0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
158f0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 0a 20 20  >pDirty;.  }..  
15900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15920 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
15930 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
15940 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
15950 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
15960 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
15970 69 6d 69 74 2e 20 54 68 65 20 61 72 67 75 6d 65  imit. The argume
15980 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
15990 74 6f 20 61 20 70 75 72 67 65 61 62 6c 65 20 50  to a purgeable P
159a0 61 67 65 72 20 0a 2a 2a 20 6f 62 6a 65 63 74 2e  ager .** object.
159b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
159c0 74 74 65 6d 70 74 73 20 74 6f 20 6d 61 6b 65 20  ttempts to make 
159d0 61 20 73 69 6e 67 6c 65 20 64 69 72 74 79 20 70  a single dirty p
159e0 61 67 65 20 74 68 61 74 20 68 61 73 20 6e 6f 0a  age that has no.
159f0 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  ** outstanding r
15a00 65 66 65 72 65 6e 63 65 73 20 28 69 66 20 6f 6e  eferences (if on
15a10 65 20 65 78 69 73 74 73 29 20 63 6c 65 61 6e 20  e exists) clean 
15a20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
15a30 65 20 72 65 63 79 63 6c 65 64 20 0a 2a 2a 20 62  e recycled .** b
15a40 79 20 74 68 65 20 70 63 61 63 68 65 20 6c 61 79  y the pcache lay
15a50 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
15a60 74 20 70 61 67 65 72 53 74 72 65 73 73 28 76 6f  t pagerStress(vo
15a70 69 64 20 2a 70 2c 20 50 67 48 64 72 20 2a 70 50  id *p, PgHdr *pP
15a80 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
15a90 67 65 72 20 3d 20 28 50 61 67 65 72 20 2a 29 70  ger = (Pager *)p
15aa0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
15ab0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
15ac0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
15ad0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15af0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c   assert( pPg->fl
15b00 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20  ags&PGHDR_DIRTY 
15b10 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15b20 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
15b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15b40 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
15b50 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
15b60 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
15b70 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
15b80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15b90 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
15ba0 66 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20  fullSync && .   
15bb0 20 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a       !(pPager->j
15bc0 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
15bd0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
15be0 4d 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20  MORY) &&.       
15bf0 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69   !(sqlite3OsDevi
15c00 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
15c10 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51  s(pPager->fd)&SQ
15c20 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
15c30 41 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b  APPEND).      ){
15c40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
15c50 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20  >nRec = 0;.     
15c60 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
15c70 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
15c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
15cb0 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
15cc0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
15cd0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
15ce0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Pg);.    }.    i
15cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15d00 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
15d10 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
15d20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15d30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15d40 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
15d50 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
15d60 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
15d70 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
15d80 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
15d90 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
15da0 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
15db0 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
15dc0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
15dd0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
15de0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
15df0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
15e00 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
15e10 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
15e20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
15e30 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
15e40 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
15e50 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
15e60 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
15e70 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
15e80 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
15e90 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
15ea0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
15eb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 65  .**.** Return ne
15ec0 67 61 74 69 76 65 20 69 66 20 75 6e 61 62 6c 65  gative if unable
15ed0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
15ee0 65 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20  e status of the 
15ef0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
15f00 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
15f10 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f   not open the jo
15f20 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78  urnal file to ex
15f30 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e  amine its.** con
15f40 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68  tent.  Hence, th
15f50 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
15f60 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65  contain the name
15f70 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20   of a master.** 
15f80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
15f90 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  t has been delet
15fa0 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f  ed, and hence no
15fb0 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a  t be hot.  Or.**
15fc0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
15fd0 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
15fe0 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20   be zeroed out. 
15ff0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
16000 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76   does not discov
16010 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20 6f  er these cases o
16020 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72  f a non-hot jour
16030 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20  nal - if the.** 
16040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
16050 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65  sts and is not e
16060 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e  mpty this routin
16070 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20  e assumes it.** 
16080 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67  is hot.  The pag
16090 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
160a0 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
160b0 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ver that the.** 
160c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
160d0 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
160e0 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a  nd will no-op..*
160f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
16100 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
16110 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 2a 70   *pPager, int *p
16120 45 78 69 73 74 73 29 7b 0a 20 20 73 71 6c 69 74  Exists){.  sqlit
16130 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70  e3_vfs *pVfs = p
16140 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
16150 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16160 4b 3b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20  K;.  int exists 
16170 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 6f 63 6b 65  = 0;.  int locke
16180 64 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  d = 0;.  assert(
16190 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
161a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
161c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
161d0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
161e0 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
161f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16200 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
16210 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
16220 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
16230 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
16240 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16250 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
16260 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16270 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
16280 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
16290 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 7d 0a 20 20  &locked);.  }.  
162a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
162b0 4b 20 26 26 20 65 78 69 73 74 73 20 26 26 20 21  K && exists && !
162c0 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 69 6e  locked ){.    in
162d0 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20  t nPage;.    rc 
162e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
162f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20  gecount(pPager, 
16300 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
16310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16320 7b 0a 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  {.     if( nPage
16330 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
16340 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
16350 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
16360 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
16370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16380 2a 70 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20  *pExists = 1;.  
16390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
163a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
163b0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
163c0 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
163d0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
163e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
163f0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
16400 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
16410 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
16420 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
16430 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66  nt rc;.  i64 off
16440 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  set;.  assert( M
16450 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73  EMDB==0 );.  ass
16460 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
16470 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
16480 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
16490 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
164a0 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
164b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
164c0 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a  ERR_SHORT_READ;.
164d0 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28    }.  offset = (
164e0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
164f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
16500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
16510 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
16520 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50 61 67  pPg->pData, pPag
16530 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
16540 66 73 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  fset);.  PAGER_I
16550 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
16560 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b  r_readdb_count);
16570 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50  .  PAGER_INCR(pP
16580 61 67 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20  ager->nRead);.  
16590 49 4f 54 52 41 43 45 28 28 22 50 47 49 4e 20 25  IOTRACE(("PGIN %
165a0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
165b0 20 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70   pgno));.  if( p
165c0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65  gno==1 ){.    me
165d0 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
165e0 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
165f0 29 70 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d  )pPg->pData)[24]
16600 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16630 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
16640 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d  bFileVers));.  }
16650 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72  .  CODEC1(pPager
16660 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 50  , pPg->pData, pP
16670 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50  g->pgno, 3);.  P
16680 41 47 45 52 54 52 41 43 45 34 28 22 46 45 54 43  AGERTRACE4("FETC
16690 48 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  H %d page %d has
166a0 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
166b0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
166c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
166d0 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67  >pgno, pager_pag
166e0 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72  ehash(pPg));.  r
166f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16700 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16710 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
16720 62 74 61 69 6e 20 74 68 65 20 73 68 61 72 65 64  btain the shared
16730 20 6c 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62   lock required b
16740 65 66 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61  efore.** data ma
16750 79 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  y be read from t
16760 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
16770 49 66 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  If the shared lo
16780 63 6b 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  ck has already.*
16790 2a 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c  * been obtained,
167a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
167b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
167c0 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
167d0 65 72 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  er obtaining the
167e0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66   shared lock (if
167f0 20 72 65 71 75 69 72 65 64 29 2c 20 74 68 69 73   required), this
16800 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65   function.** che
16810 63 6b 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f  cks for a hot-jo
16820 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f  urnal file. If o
16830 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20  ne is found, an 
16840 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
16850 63 6b 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d  ck.** is perform
16860 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
16870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16880 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
16890 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
168a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
168b0 4f 4b 3b 0a 20 20 69 6e 74 20 69 73 45 72 72 6f  OK;.  int isErro
168c0 72 52 65 73 65 74 20 3d 20 30 3b 0a 0a 20 20 2f  rReset = 0;..  /
168d0 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
168e0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  se is opened for
168f0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
16900 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  s, has no outsta
16910 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65  nding .  ** page
16920 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
16930 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
16940 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65  tate, now is the
16950 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
16960 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
16970 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
16980 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
16990 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
169a0 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
169b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
169c0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
169d0 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
169e0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
169f0 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26  lusiveMode .   &
16a00 26 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  & sqlite3PcacheR
16a10 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
16a20 70 50 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70  pPCache)==0 && p
16a30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a  Pager->errCode .
16a40 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
16a50 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16a60 20 29 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f   ){.      isErro
16a70 72 52 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20  rReset = 1;.    
16a80 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  }.    pPager->er
16a90 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f  rCode = SQLITE_O
16aa0 4b 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73  K;.    pager_res
16ab0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  et(pPager);.  }.
16ac0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
16ad0 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61  er is still in a
16ae0 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64  n error state, d
16af0 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54  o not proceed. T
16b00 68 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73  he error .  ** s
16b10 74 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65  tate will be cle
16b20 61 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69  ared at some poi
16b30 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
16b40 20 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a   when all page .
16b50 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
16b60 61 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20  are dropped and 
16b70 74 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65  the cache can be
16b80 20 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f   discarded..  */
16b90 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
16ba0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
16bb0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
16bc0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
16bd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
16be0 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Code;.  }..  if(
16bf0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
16c00 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20  PAGER_UNLOCK || 
16c10 69 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a  isErrorReset ){.
16c20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
16c30 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
16c40 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73  pVfs;.    int is
16c50 48 6f 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  HotJournal = 0;.
16c60 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
16c70 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  DB );.    assert
16c80 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  ( sqlite3PcacheR
16c90 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
16ca0 70 50 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20  pPCache)==0 );. 
16cb0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
16cc0 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
16cd0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
16ce0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
16cf0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
16d00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16d30 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
16d40 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
16d50 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
16d60 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16d70 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
16d80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16d90 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
16da0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  LOCK );.    }.. 
16db0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
16dc0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
16dd0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
16de0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
16df0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
16e00 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16e10 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16e20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16e30 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16e40 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
16e50 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
16e60 20 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a      rc = hasHotJ
16e70 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 26  ournal(pPager, &
16e80 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20  isHotJournal);. 
16e90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16eb0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
16ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16ed0 20 69 66 28 20 69 73 45 72 72 6f 72 52 65 73 65   if( isErrorRese
16ee0 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61  t || isHotJourna
16ef0 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  l ){.      /* Ge
16f00 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
16f10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
16f20 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
16f30 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
16f40 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
16f50 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
16f60 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16f70 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16f80 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
16f90 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
16fa0 20 49 66 20 69 74 20 77 65 72 65 2c 20 61 6e 6f   If it were, ano
16fb0 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d 69 67  ther process mig
16fc0 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20 20 20  ht open the.    
16fd0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16fe0 6c 65 2c 20 64 65 74 65 63 74 20 74 68 65 20 52  le, detect the R
16ff0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e  ESERVED lock, an
17000 64 20 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20  d conclude that 
17010 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
17020 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
17030 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
17040 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
17050 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
17060 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
17070 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
17080 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
17090 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
170a0 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
170b0 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
170c0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
170d0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
170e0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
170f0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
17100 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74   to.      ** obt
17110 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43 4c  ain its own EXCL
17120 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
17130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
17150 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17160 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  e<EXCLUSIVE_LOCK
17170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
17180 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
17190 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
171a0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
171b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
171c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
171d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
171e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
171f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
17200 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
17210 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
17220 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
17230 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
17240 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f 70   }. .      /* Op
17250 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
17260 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
17270 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62 65  cess. This is be
17280 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20  cause in .      
17290 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
172a0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
172b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
172c0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
172d0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  nd.      ** poss
172e0 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20  ibly used for a 
172f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65  transaction late
17300 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79  r on. On some sy
17310 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20  stems, the.     
17320 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28 29   ** OsTruncate()
17330 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65 78   call used in ex
17340 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
17350 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72 65  ode also require
17360 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61  s.      ** a rea
17370 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e  d/write file han
17380 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  dle..      */.  
17390 20 20 20 20 69 66 28 20 21 69 73 45 72 72 6f 72      if( !isError
173a0 52 65 73 65 74 20 26 26 20 70 50 61 67 65 72 2d  Reset && pPager-
173b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
173c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
173d0 65 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  es;.        rc =
173e0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
173f0 28 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a  (pVfs,pPager->zJ
17400 6f 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43  ournal,SQLITE_AC
17410 43 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73  CESS_EXISTS,&res
17420 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
17430 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65            if( re
17450 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
17460 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
17470 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
17480 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
17490 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
174a0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
174b0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  L;.            a
174c0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
174d0 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  tempFile );.    
174e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
174f0 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
17500 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
17510 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
17520 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20  f, &fout);.     
17530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
17540 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
17550 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
17560 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20 20 20  thods );.       
17570 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17580 49 54 45 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53  ITE_OK && fout&S
17590 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
175a0 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NLY ){.         
175b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
175c0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
175d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
175e0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
175f0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
17600 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
17610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
17620 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
17630 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  al does not exis
17640 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f  t, that means so
17650 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17660 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
17670 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c  has already roll
17680 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20  ed it back */.  
17690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
176a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
176b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
176c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
176d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
176e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
176f0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
17700 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
17710 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
17720 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
17730 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
17740 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
17750 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17760 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17770 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
17780 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17790 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
177a0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
177b0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
177c0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
177d0 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
177e0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61  .      ** lock a
177f0 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
17800 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
17810 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
17820 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
17830 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
17840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17850 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
17860 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
17870 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
17880 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
17890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
178a0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
178b0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
178c0 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
178d0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
178e0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
178f0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
17900 41 52 45 44 29 0a 20 20 20 20 20 20 29 3b 0a 20  ARED).      );. 
17910 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 71     }..    if( sq
17920 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65 63  lite3PcachePagec
17930 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43  ount(pPager->pPC
17940 61 63 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20  ache)>0 ){.     
17950 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
17960 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
17970 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
17980 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
17990 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
179a0 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
179b0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
179c0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
179d0 75 73 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  us.      ** read
179e0 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
179f0 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74  ction).  Check t
17a00 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74  o see if the dat
17a10 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  abase.      ** h
17a20 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
17a30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
17a40 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20  se has changed, 
17a50 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20  flush the.      
17a60 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
17a70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61  **.      ** Data
17a80 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73 20  base changes is 
17a90 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b  detected by look
17aa0 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73 20  ing at 15 bytes 
17ab0 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20  beginning.      
17ac0 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 32 34 20  ** at offset 24 
17ad0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20  into the file.  
17ae0 54 68 65 20 66 69 72 73 74 20 34 20 6f 66 20 74  The first 4 of t
17af0 68 65 73 65 20 31 36 20 62 79 74 65 73 20 61 72  hese 16 bytes ar
17b00 65 0a 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d  e.      ** a 32-
17b10 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
17b20 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
17b30 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
17b40 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  .  The.      ** 
17b50 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
17b60 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
17b70 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
17b80 65 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  e when.      ** 
17b90 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73  a codec is in us
17ba0 65 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  e..      ** .   
17bb0 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
17bc0 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
17bd0 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
17be0 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
17bf0 20 62 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65   be .      ** de
17c00 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61  tected.  The cha
17c10 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65  nce of an undete
17c20 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73  cted change is s
17c30 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20  o small that.   
17c40 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20     ** it can be 
17c50 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20  neglected..     
17c60 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64   */.      char d
17c70 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
17c80 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
17c90 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c  ers)];.      sql
17ca0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17cb0 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a  nt(pPager, 0);..
17cc0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
17cd0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
17ce0 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
17cf0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
17d00 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17d10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
17d20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
17d30 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
17d40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17d50 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  dbSize>0 ){.    
17d60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b      IOTRACE(("CK
17d70 56 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70  VERS %p %d\n", p
17d80 50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62  Pager, sizeof(db
17d90 46 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20  FileVers)));.   
17da0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17db0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
17dc0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
17dd0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
17de0 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  rs), 24);.      
17df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17e10 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
17e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
17e40 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
17e50 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
17e60 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
17e70 0a 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  .      if( memcm
17e80 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
17e90 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
17ea0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17eb0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
17ec0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
17ed0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
17ee0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
17ef0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
17f00 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
17f10 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52  er->state<=PAGER
17f20 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
17f30 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
17f40 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
17f50 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
17f60 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
17f70 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
17f80 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  . failed:.  if( 
17f90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17fa0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e  .    /* pager_un
17fb0 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  lock() is a no-o
17fc0 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  p for exclusive 
17fd0 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f  mode and in-memo
17fe0 72 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ry databases. */
17ff0 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63  .    pager_unloc
18000 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
18010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18020 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77  *.** Make sure w
18030 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65  e have the conte
18040 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
18050 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  If the page was.
18060 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  ** previously ac
18070 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
18080 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74  ntent==1, then t
18090 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a  he content was.*
180a0 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a  * just initializ
180b0 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74  ed to zeros inst
180c0 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61  ead of being rea
180d0 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20  d from disk..** 
180e0 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20  But now we need 
180f0 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66  the real data of
18100 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d  f of disk.  So m
18110 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68  ake sure we.** h
18120 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74  ave it.  Read it
18130 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74   in if we do not
18140 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79   have it already
18150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18160 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
18170 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
18180 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
18190 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 20  PGHDR_NEED_READ 
181a0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
181b0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
181c0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
181d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
181e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
181f0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61  {.      pPg->fla
18200 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
18210 44 5f 52 45 41 44 3b 0a 20 20 20 20 7d 65 6c 73  D_READ;.    }els
18220 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
18230 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
18240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  ;.}../*.** If th
18260 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
18270 74 20 68 61 73 20 72 65 61 63 68 65 64 20 7a 65  t has reached ze
18280 72 6f 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65  ro, and the page
18290 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 0a  r is not in the.
182a0 2a 2a 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 77  ** middle of a w
182b0 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
182c0 20 6f 72 20 6f 70 65 6e 65 64 20 69 6e 20 65 78   or opened in ex
182d0 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 75 6e  clusive mode, un
182e0 6c 6f 63 6b 20 69 74 2e 0a 2a 2f 20 0a 73 74 61  lock it..*/ .sta
182f0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e  tic void pagerUn
18300 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61 67  lockIfUnused(Pag
18310 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
18320 66 28 20 28 73 71 6c 69 74 65 33 50 63 61 63 68  f( (sqlite3Pcach
18330 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
18340 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 29 0a 20  ->pPCache)==0). 
18350 20 20 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e     && (!pPager->
18360 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
18370 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18380 4f 66 66 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  Off>0) .  ){.   
18390 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
183a0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
183b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 72  .  }.}../*.** Dr
183c0 6f 70 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  op a page from t
183d0 68 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 73  he cache using s
183e0 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f 70  qlite3PcacheDrop
183f0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ()..**.** If thi
18400 73 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72  s means there ar
18410 65 20 6e 6f 77 20 6e 6f 20 70 61 67 65 73 20 77  e now no pages w
18420 69 74 68 20 72 65 66 65 72 65 6e 63 65 73 20 74  ith references t
18430 6f 20 74 68 65 6d 2c 20 61 20 72 6f 6c 6c 62 61  o them, a rollba
18440 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 20 61 6e 64  ck.** occurs and
18450 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18460 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 6d   database is rem
18470 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oved..*/.static 
18480 76 6f 69 64 20 70 61 67 65 72 44 72 6f 70 50 61  void pagerDropPa
18490 67 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ge(DbPage *pPg){
184a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
184b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
184c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
184d0 72 6f 70 28 70 50 67 29 3b 0a 20 20 70 61 67 65  rop(pPg);.  page
184e0 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
184f0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
18500 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
18510 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
18520 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
18530 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
18540 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
18550 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
18560 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
18570 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
18580 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
18590 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
185a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
185b0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
185c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
185d0 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
185e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
185f0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
18600 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
18610 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
18620 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
18630 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
18640 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
18650 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
18660 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
18670 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
18680 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
18690 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
186a0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
186b0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
186c0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
186d0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
186e0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
186f0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
18700 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
18710 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
18720 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
18730 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
18740 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
18750 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18760 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
18770 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
18780 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
18790 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
187a0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
187b0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
187c0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
187d0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
187e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
187f0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
18800 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18810 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
18820 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
18830 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
18840 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
18850 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
18860 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
18870 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
18880 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
18890 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
188a0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
188b0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
188c0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
188d0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
188e0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
188f0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
18900 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
18910 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
18920 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
18930 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
18940 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
18950 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
18960 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
18970 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18980 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18990 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
189a0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
189b0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
189c0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
189d0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
189e0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
189f0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
18a00 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
18a10 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
18a20 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
18a30 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
18a40 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
18a50 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
18a60 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
18a70 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
18a80 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
18a90 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
18aa0 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
18ab0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18ac0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
18ad0 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
18ae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18af0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
18b00 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
18b10 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
18b20 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
18b30 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
18b40 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
18b50 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
18b60 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
18b70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
18b80 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
18b90 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
18ba0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
18bb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18bc0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
18bd0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
18be0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
18bf0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
18c00 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
18c10 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
18c20 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
18c30 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
18c40 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
18c50 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
18c60 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
18c70 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
18c80 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
18c90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
18ca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
18cb0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
18cc0 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 7c  UNLOCK .       |
18cd0 7c 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  | sqlite3PcacheR
18ce0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
18cf0 70 50 43 61 63 68 65 29 3e 30 20 0a 20 20 20 20  pPCache)>0 .    
18d00 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31 0a 20 20     || pgno==1.  
18d10 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
18d20 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
18d30 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
18d40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
18d50 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
18d60 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
18d70 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
18d80 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
18d90 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
18da0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
18db0 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
18dc0 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
18dd0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
18de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18df0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
18e00 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
18e10 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
18e20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
18e30 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
18e40 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
18e50 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
18e60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
18e70 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
18e80 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
18e90 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
18ea0 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
18eb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
18ec0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
18ed0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
18ee0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
18ef0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
18f00 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
18f10 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
18f20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
18f30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18f40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18f50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
18f60 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
18f70 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 72  R_UNLOCK );..  r
18f80 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
18f90 65 46 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70  eFetch(pPager->p
18fa0 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20 31 2c  PCache, pgno, 1,
18fb0 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
18fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18fd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18fe0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 61  }.  if( pPg->pPa
18ff0 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ger==0 ){.    /*
19000 20 54 68 65 20 70 61 67 65 72 20 63 61 63 68 65   The pager cache
19010 20 68 61 73 20 63 72 65 61 74 65 64 20 61 20 6e   has created a n
19020 65 77 20 70 61 67 65 2e 20 49 74 73 20 63 6f 6e  ew page. Its con
19030 74 65 6e 74 20 6e 65 65 64 73 20 74 6f 20 0a 20  tent needs to . 
19040 20 20 20 2a 2a 20 62 65 20 69 6e 69 74 69 61 6c     ** be initial
19050 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ized..    */.   
19060 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 50   int nMax;.    P
19070 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
19080 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 70 50  ->nMiss);.    pP
19090 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
190a0 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  er;.    memset(p
190b0 50 67 2d 3e 70 45 78 74 72 61 2c 20 30 2c 20 70  Pg->pExtra, 0, p
190c0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
190d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
190e0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
190f0 70 50 61 67 65 72 2c 20 26 6e 4d 61 78 29 3b 0a  pPager, &nMax);.
19100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
19120 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19130 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74  (pPg);.      ret
19140 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
19150 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
19160 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
19170 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  | noContent ){. 
19180 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
19190 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
191a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
191b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
191c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
191d0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
191e0 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
191f0 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
19200 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19210 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43  );.      if( noC
19220 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
19230 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
19240 50 47 48 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b  PGHDR_NEED_READ;
19250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49  .      }.      I
19260 4f 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70  OTRACE(("ZERO %p
19270 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
19280 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73  pgno));.    }els
19290 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65  e{.      rc = re
192a0 61 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c  adDbPage(pPager,
192b0 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20   pPg, pgno);.   
192c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
192d0 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
192e0 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
192f0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  EAD ){.        /
19300 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
19310 72 65 66 28 70 50 67 29 3b 20 2a 2f 0a 20 20 20  ref(pPg); */.   
19320 20 20 20 20 20 70 61 67 65 72 44 72 6f 70 50 61       pagerDropPa
19330 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
19340 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19350 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66    }.    }.#ifdef
19360 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
19370 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
19380 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
19390 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
193a0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
193b0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
193c0 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
193d0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
193e0 20 20 20 20 61 73 73 65 72 74 28 73 71 6c 69 74      assert(sqlit
193f0 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74  e3PcacheRefCount
19400 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
19410 29 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b  )>0 || pgno==1);
19420 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
19430 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
19440 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e     if( !noConten
19450 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  t ){.      rc = 
19460 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
19470 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66  t(pPg);.      if
19480 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
19490 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
194a0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
194b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
194c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
194d0 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a 20  *ppPage = pPg;. 
194e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
194f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
19500 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
19510 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
19520 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
19530 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
19540 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
19550 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
19560 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
19570 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
19580 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
19590 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
195a0 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
195b0 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54  e3PagerGet().  T
195c0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
195d0 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
195e0 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
195f0 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74  3PagerGet() is t
19600 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20  hat _get() will 
19610 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  go to the disk a
19620 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68  nd read.** in th
19630 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61  e page if the pa
19640 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
19650 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69  y in cache.  Thi
19660 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
19670 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  urns NULL if the
19680 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
19690 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69  cache or if a di
196a0 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a  sk I/O error .**
196b0 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e   has ever happen
196c0 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73  ed..*/.DbPage *s
196d0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
196e0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
196f0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
19700 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20  gHdr *pPg = 0;. 
19710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
19720 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
19730 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66  pgno!=0 );..  if
19740 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ( (pPager->state
19750 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 0a  !=PAGER_UNLOCK).
19760 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 65     && (pPager->e
19770 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
19780 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72  K || pPager->err
19790 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
197a0 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  L).  ){.    sqli
197b0 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28 70  te3PcacheFetch(p
197c0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
197d0 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a  pgno, 0, &pPg);.
197e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
197f0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  g;.}../*.** Rele
19800 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
19810 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
19820 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
19830 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
19840 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
19850 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
19860 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
19870 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
19880 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
19890 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
198a0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
198b0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
198c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
198d0 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
198e0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
198f0 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50  e3PagerUnref(DbP
19900 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  age *pPg){.  if(
19910 20 70 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65   pPg ){.    Page
19920 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
19930 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c  >pPager;.    sql
19940 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61 73  ite3PcacheReleas
19950 65 28 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65  e(pPg);.    page
19960 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28  rUnlockIfUnused(
19970 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
19980 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19990 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .}..static int o
199a0 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61  penSubJournal(Pa
199b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
199c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
199d0 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
199e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
199f0 20 21 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e   !pPager->sjfd->
19a00 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
19a10 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
19a20 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
19a30 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
19a40 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y ){.      sqlit
19a50 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
19a60 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
19a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
19a90 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
19aa0 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c  r, pPager->sjfd,
19ab0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
19ac0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
19ad0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
19ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19af0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
19b00 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
19b10 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
19b20 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
19b30 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
19b40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19b50 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
19b60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19b70 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
19b80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
19b90 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
19ba0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
19bb0 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
19bc0 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
19bd0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
19be0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
19bf0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
19c00 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
19c10 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69  *pPager){.  sqli
19c20 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
19c30 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
19c40 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
19c50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19c60 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  TE|SQLITE_OPEN_E
19c70 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
19c80 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a 20  OPEN_CREATE);.. 
19c90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
19ca0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19cb0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19cc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19cd0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
19ce0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
19cf0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
19d00 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
19d10 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
19d20 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 70 50 61  Pager, 0);.  pPa
19d30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
19d40 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
19d50 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
19d60 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 70 50 61  Size);.  if( pPa
19d70 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
19d80 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
19d90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
19da0 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
19db0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
19dc0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
19dd0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
19de0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
19df0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
19e00 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
19e10 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
19e20 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f  EONCLOSE|SQLITE_
19e30 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
19e40 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  L);.    }else{. 
19e50 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53       flags |= (S
19e60 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
19e70 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a  JOURNAL);.    }.
19e80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19e90 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47  journalMode==PAG
19ea0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
19eb0 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 73  EMORY ){.      s
19ec0 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c  qlite3MemJournal
19ed0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
19ee0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
19ef0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
19f00 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
19f10 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
19f20 57 52 49 54 45 0a 20 20 20 20 20 20 72 63 20 3d  WRITE.      rc =
19f30 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
19f40 70 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20 70  pen(.          p
19f50 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
19f60 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
19f70 66 64 2c 20 66 6c 61 67 73 2c 20 6a 72 6e 6c 42  fd, flags, jrnlB
19f80 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
19f90 29 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65  ).      );.#else
19fa0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
19fb0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
19fc0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19fd0 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
19fe0 6c 61 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66  lags, 0);.#endif
19ff0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a000 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
1a010 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d   || pPager->jfd-
1a020 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20  >pMethods );.   
1a030 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a040 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Off = 0;.    pPa
1a050 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
1a060 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1a070 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1a080 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a090 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1a0a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1a0b0 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MEM ){.        s
1a0c0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1a0d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
1a0e0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
1a0f0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61   }.      goto fa
1a100 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
1a110 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rnal;.    }.  }.
1a120 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a130 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
1a140 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1a150 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
1a160 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
1a170 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
1a180 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
1a190 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1a1a0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1a1b0 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
1a1c0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1a1d0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
1a1e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a1f0 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1a200 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
1a210 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1a220 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
1a230 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 26  er->nSavepoint &
1a240 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1a250 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  ){.    rc = open
1a260 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
1a270 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1a280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1a290 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
1a2a0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
1a2b0 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
1a2c0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
1a2d0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
1a2e0 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  er, 0);.    if( 
1a2f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1a310 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
1a320 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1a330 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
1a340 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
1a350 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
1a360 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
1a370 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  al);.  pPager->p
1a380 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
1a390 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a3a0 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77  *.** Acquire a w
1a3b0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
1a3c0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1a3d0 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20  lock is removed 
1a3e0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20  when.** the any 
1a3f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1a400 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20   happen:.**.**  
1a410 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a420 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1a430 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1a440 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1a450 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61  Rollback() is ca
1a460 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1a470 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
1a480 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
1a490 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
1a4a0 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c  rUnref() is call
1a4b0 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f  ed to on every o
1a4c0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e  utstanding page.
1a4d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1a4e0 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68   parameter to th
1a4f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1a500 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f  pointer to any o
1a510 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a  pen page of the.
1a520 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1a530 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67  .  Nothing chang
1a540 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  es about the pag
1a550 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d  e - it is used m
1a560 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75  erely to.** acqu
1a570 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ire a pointer to
1a580 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
1a590 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f  ture and as proo
1a5a0 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a  f that there is.
1a5b0 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  ** already a rea
1a5c0 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d-lock on the da
1a5d0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1a5e0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1a5f0 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77  er indicates how
1a600 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62   much space in b
1a610 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20  ytes to reserve 
1a620 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20  for a.** master 
1a630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d  journal file-nam
1a640 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
1a650 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68  f the journal wh
1a660 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64  en it is created
1a670 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61  ..**.** A journa
1a680 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
1a690 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   if this is not 
1a6a0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1a6b0 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  .  For temporary
1a6c0 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f  .** files, the o
1a6d0 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f  pening of the jo
1a6e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
1a6f0 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65  ferred until the
1a700 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75  re is an.** actu
1a710 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65  al need to write
1a720 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1a730 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
1a740 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
1a750 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  y reserved for w
1a760 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75  riting, this rou
1a770 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a780 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67  .**.** If exFlag
1a790 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65   is true, go ahe
1a7a0 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58  ad and get an EX
1a7b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1a7c0 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65  the file.** imme
1a7d0 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20  diately instead 
1a7e0 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c  of waiting until
1a7f0 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68   we try to flush
1a800 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65   the cache.  The
1a810 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67  .** exFlag is ig
1a820 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73  nored if a trans
1a830 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
1a840 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  y active..*/.int
1a850 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1a860 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20  in(DbPage *pPg, 
1a870 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
1a880 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1a890 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1a8a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a8b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1a8c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
1a8d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1a8e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1a8f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1a900 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
1a910 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
1a920 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
1a930 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
1a940 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1a950 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1a960 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
1a970 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
1a980 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  LOCK);.    if( r
1a990 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a9a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1a9b0 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
1a9c0 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20  RVED;.      if( 
1a9d0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
1a9e0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1a9f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1aa00 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1aa10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1aa20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1aa30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1aa40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1aa50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1aa60 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
1aa70 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52   PAGERTRACE2("TR
1aa80 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
1aa90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1aaa0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1aab0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1aac0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1aad0 6c 65 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  le.           &&
1aae0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aaf0 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1ab00 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20  NALMODE_OFF ){. 
1ab10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1ab20 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
1ab30 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ger);.    }.  }e
1ab40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1ab50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1ab60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1ab70 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1ab80 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1ab90 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1aba0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1abb0 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61 73 74  ss mode the last
1abc0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1abd0 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1abe0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1abf0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1ac00 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1ac10 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1ac20 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1ac30 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1ac40 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1ac50 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1ac60 6e 64 20 65 69 74 68 65 72 20 77 61 73 20 74 72  nd either was tr
1ac70 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1ac80 65 73 20 6f 72 20 69 74 73 20 68 65 61 64 65 72  es or its header
1ac90 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72   was.    ** over
1aca0 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a 65 72  written with zer
1acb0 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  os..    */.    a
1acc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1acd0 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1ace0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1acf0 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1ad00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1ad10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1ad20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1ad30 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1ad40 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 50  ager, 0);.    pP
1ad50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1ad60 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1ad70 43 72 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e  Create( pPager->
1ad80 64 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  dbSize );.    if
1ad90 28 20 21 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  ( !pPager->pInJo
1ada0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
1adb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1adc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1add0 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44     pPager->origD
1ade0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1adf0 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  dbSize;.      rc
1ae00 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1ae10 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1ae20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
1ae30 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
1ae40 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Open || pPager->
1ae50 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20  journalOff>0 || 
1ae60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
1ae70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ae80 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1ae90 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1aea0 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1aeb0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1aec0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1aed0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1aee0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1aef0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1af00 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1af10 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1af20 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1af30 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1af40 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1af50 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1af60 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1af70 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1af80 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1af90 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1afa0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1afb0 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1afc0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1afd0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1afe0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1aff0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1b000 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1b010 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1b020 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1b030 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1b040 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1b050 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1b060 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1b070 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1b080 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1b090 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1b0a0 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1b0b0 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1b0c0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1b0d0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1b0e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1b0f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1b100 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1b110 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1b120 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1b130 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1b140 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1b150 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1b160 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1b170 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1b180 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1b190 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1b1a0 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1b1b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1b1c0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1b1d0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1b1e0 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a  a = pPg->pData;.
1b1f0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1b200 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b210 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b220 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  _OK;..  /* Check
1b230 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f   for errors.  */
1b240 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1b250 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72  rrCode ){ .    r
1b260 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1b270 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1b280 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
1b290 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
1b2a0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
1b2b0 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
1b2c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
1b2d0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1b2e0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1b2f0 68 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65  his page was pre
1b300 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64  viously acquired
1b310 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1b320 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20  =1, that means. 
1b330 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65   ** we didn't re
1b340 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65  ally read in the
1b350 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1b360 70 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20  page.  This can 
1b370 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72  happen.  ** (for
1b380 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74   example) when t
1b390 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
1b3a0 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
1b3b0 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a  eelist.  But.  *
1b3c0 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65  * now we are (pe
1b3d0 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68  rhaps) moving th
1b3e0 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68  e page off of th
1b3f0 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20  e freelist for. 
1b400 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65   ** reuse and we
1b410 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74   need to know it
1b420 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  s original conte
1b430 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65  nt so that conte
1b440 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73  nt.  ** can be s
1b450 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  tored in the rol
1b460 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
1b470 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61  So do the read a
1b480 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65  t this.  ** time
1b490 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1b4a0 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
1b4b0 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29  pPg);.  if( rc )
1b4c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1b4d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20  .  }..  /* Mark 
1b4e0 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74  the page as dirt
1b4f0 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  y.  If the page 
1b500 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b510 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f   written.  ** to
1b520 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65   the journal the
1b530 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20  n we can return 
1b540 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f  right away..  */
1b550 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
1b560 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  MakeDirty(pPg);.
1b570 20 20 69 66 28 20 70 61 67 65 49 6e 4a 6f 75 72    if( pageInJour
1b580 6e 61 6c 28 70 50 67 29 20 26 26 20 70 61 67 65  nal(pPg) && page
1b590 49 6e 53 61 76 65 70 6f 69 6e 74 28 70 50 67 29  InSavepoint(pPg)
1b5a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1b5b0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1b5c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f      pPager->dbMo
1b5d0 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 7d 65  dified = 1;.  }e
1b5e0 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
1b5f0 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
1b600 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1b610 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
1b620 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
1b630 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
1b640 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
1b650 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
1b660 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
1b670 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
1b680 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
1b690 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
1b6a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1b6b0 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
1b6c0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
1b6d0 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
1b6e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1b6f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b700 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1b710 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1b720 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1b730 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
1b740 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b750 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1b770 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b780 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1b790 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
1b7a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b7b0 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
1b7c0 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  Journal.        
1b7d0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
1b7e0 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1b7f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
1b800 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1b810 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1b820 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1b830 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b840 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b850 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1b860 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1b870 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4d  .    pPager->dbM
1b880 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a 20 20 0a  odified = 1;.  .
1b890 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
1b8a0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
1b8b0 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
1b8c0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
1b8d0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
1b8e0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1b8f0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1b900 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
1b910 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1b920 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
1b930 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1b940 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
1b950 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1b960 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 61    */.    if( !pa
1b970 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1b980 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
1b990 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  nalOpen ){.     
1b9a0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
1b9b0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b9c0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33  ze ){.        u3
1b9d0 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20  2 cksum;.       
1b9e0 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a   char *pData2;..
1b9f0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
1ba00 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
1ba10 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1ba20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
1ba30 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
1ba40 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1ba50 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1ba60 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1ba70 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1ba80 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1ba90 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1baa0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1bab0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
1bac0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1bad0 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
1bae0 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
1baf0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
1bb00 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
1bb10 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  = pager_cksum(pP
1bb20 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61  ager, (u8*)pData
1bb30 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  2);.        rc =
1bb40 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
1bb50 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
1bb60 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
1bb70 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1bb80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bb90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1bba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1bbb0 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
1bbc0 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72  , pData2, pPager
1bbd0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1bc00 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34  ->journalOff + 4
1bc10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1bc20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1bc30 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
1bc40 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 7d  ize+4;.        }
1bc50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1bc60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1bc70 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
1bc80 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1bc90 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
1bca0 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75 6d 29  urnalOff, cksum)
1bcb0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1bcc0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1bcd0 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
1bce0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1bcf0 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64  "JOUT %p %d %lld
1bd00 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1bd10 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  pPg->pgno, .    
1bd20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1bd30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
1bd40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bd50 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  e));.        PAG
1bd60 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
1bd70 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
1bd80 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  nt);.        PAG
1bd90 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41  ERTRACE5("JOURNA
1bda0 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
1bdb0 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30  dSync=%d hash(%0
1bdc0 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1bdd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
1bde0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
1bdf0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28   .             (
1be00 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
1be10 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
1be20 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  ), pager_pagehas
1be30 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
1be40 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1be50 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1be60 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1be70 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1be80 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1be90 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1bea0 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1beb0 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1bec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1bed0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1bee0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1bef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1bf00 7d 0a 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  }..        pPage
1bf10 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
1bf20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bf30 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
1bf40 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
1bf50 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61  te3BitvecSet(pPa
1bf60 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1bf70 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1bf80 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1bf90 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1bfa0 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73        pPg->flags
1bfb0 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53   |= PGHDR_NEED_S
1bfc0 59 4e 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  YNC;.        }. 
1bfd0 20 20 20 20 20 20 20 61 64 64 54 6f 53 61 76 65         addToSave
1bfe0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1bff0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1c000 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c010 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1c020 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1c030 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1c040 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1c050 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
1c060 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
1c070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c080 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1c090 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1c0a0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1c0b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c0c0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1c0d0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20  ), pPg->pgno,.  
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70               ((p
1c0f0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1c100 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 29 29  NEED_SYNC)?1:0))
1c110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c120 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26 50  if( pPg->flags&P
1c130 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29  GHDR_NEED_SYNC )
1c140 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
1c150 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1c160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c170 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1c180 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1c190 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1c1a0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1c1b0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1c1c0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1c1d0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1c1e0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1c1f0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1c200 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1c210 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1c220 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1c230 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1c240 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1c250 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1c260 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1c270 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1c280 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1c290 61 67 65 49 6e 53 61 76 65 70 6f 69 6e 74 28 70  ageInSavepoint(p
1c2a0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34  Pg) ){.      i64
1c2b0 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
1c2c0 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
1c2d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1c2e0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61  .      char *pDa
1c2f0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1c300 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1c310 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1c320 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
1c330 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
1c340 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1c350 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1c360 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
1c370 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 6a  2bits(pPager->sj
1c380 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
1c390 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
1c3a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c3b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c3c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1c3d0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1c3e0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1c3f0 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1c400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c410 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d  PAGERTRACE3("STM
1c420 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
1c430 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1c440 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1c450 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
1c460 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1c480 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1c490 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1c4a0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65  ec++;.      asse
1c4b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
1c4c0 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20 20  epoint>0 );.    
1c4d0 20 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74    addToSavepoint
1c4e0 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c 20  Bitvecs(pPager, 
1c4f0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1c500 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1c510 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1c520 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1c530 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c540 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c550 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1c560 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1c570 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
1c580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1c590 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1c5a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1c5b0 3e 64 62 53 69 7a 65 3d 3d 28 50 41 47 45 52 5f  >dbSize==(PAGER_
1c5c0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 2d  MJ_PGNO(pPager)-
1c5d0 31 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  1) ){.      pPag
1c5e0 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
1c5f0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1c600 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1c610 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1c620 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61  sed to mark a da
1c630 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61  ta-page as writa
1c640 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a  ble. It uses .**
1c650 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74   pager_write() t
1c660 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  o open a journal
1c670 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20   file (if it is 
1c680 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1c690 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  ).** and write t
1c6a0 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74  he page *pData t
1c6b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1c6c0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
1c6d0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1c6e0 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
1c6f0 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
1c700 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
1c710 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
1c720 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1c730 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
1c740 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
1c750 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
1c760 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
1c770 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
1c780 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
1c790 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
1c7a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1c7b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
1c7c0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1c7d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1c7e0 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
1c7f0 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
1c800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c810 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1c820 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1c830 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1c840 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
1c850 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
1c860 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
1c870 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
1c880 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50  Size);..  if( nP
1c890 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29  agePerSector>1 )
1c8a0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65  {.    Pgno nPage
1c8b0 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
1c8c0 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1c8d0 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
1c8e0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1c8f0 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20   Pgno pg1;      
1c900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1c910 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1c920 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1c930 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20  cated on. */.   
1c940 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
1c950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1c960 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
1c970 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f  arting at pg1 to
1c980 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
1c990 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20  int ii;.    int 
1c9a0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
1c9b0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
1c9c0 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
1c9d0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
1c9e0 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
1c9f0 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
1ca00 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
1ca10 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
1ca20 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
1ca30 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
1ca40 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
1ca50 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
1ca60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1ca70 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1ca80 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
1ca90 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1caa0 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
1cab0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
1cac0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
1cad0 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
1cae0 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
1caf0 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
1cb00 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
1cb10 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
1cb20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
1cb30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
1cb40 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1cb50 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1cb60 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
1cb70 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
1cb80 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
1cb90 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
1cba0 2b 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  + 1;..    sqlite
1cbb0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1cbc0 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26  pPager, (int *)&
1cbd0 6e 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20  nPageCount);.   
1cbe0 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e   if( pPg->pgno>n
1cbf0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1cc00 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d     nPage = (pPg-
1cc10 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a  >pgno - pg1)+1;.
1cc20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
1cc30 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f  g1+nPagePerSecto
1cc40 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20  r-1)>nPageCount 
1cc50 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
1cc60 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67   nPageCount+1-pg
1cc70 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1cc80 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
1cc90 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20  ePerSector;.    
1cca0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61  }.    assert(nPa
1ccb0 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72  ge>0);.    asser
1ccc0 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f  t(pg1<=pPg->pgno
1ccd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70  );.    assert((p
1cce0 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70  g1+nPage)>pPg->p
1ccf0 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69  gno);..    for(i
1cd00 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
1cd10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1cd20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e  ii++){.      Pgn
1cd30 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20  o pg = pg1+ii;. 
1cd40 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67       PgHdr *pPag
1cd50 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d  e;.      if( pg=
1cd60 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73  =pPg->pgno || !s
1cd70 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
1cd80 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
1cd90 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20  nal, pg) ){.    
1cda0 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
1cdb0 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1cdc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  ) ){.          r
1cdd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cde0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20  Get(pPager, pg, 
1cdf0 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1ce00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ce10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ce20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1ce30 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
1ce40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61           if( pPa
1ce50 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ge->flags&PGHDR_
1ce60 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20  NEED_SYNC ){.   
1ce70 20 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53             needS
1ce80 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
1ce90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1cea0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ceb0 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1cec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ced0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1cee0 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67 65  f( (pPage = page
1cef0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1cf00 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20 20   pg))!=0 ){.    
1cf10 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66      if( pPage->f
1cf20 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1cf30 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20  SYNC ){.        
1cf40 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
1cf50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cf60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1cf70 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1cf80 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1cf90 2a 20 49 66 20 74 68 65 20 50 67 48 64 72 2e 6e  * If the PgHdr.n
1cfa0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1cfb0 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66 20 74  set for any of t
1cfc0 68 65 20 6e 50 61 67 65 20 70 61 67 65 73 20 0a  he nPage pages .
1cfd0 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20      ** starting 
1cfe0 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69 74 20  at pg1, then it 
1cff0 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65 74 20  needs to be set 
1d000 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 6d 2e  for all of them.
1d010 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   Because.    ** 
1d020 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 6f  writing to any o
1d030 66 20 74 68 65 73 65 20 6e 50 61 67 65 20 70 61  f these nPage pa
1d040 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65 20 74  ges may damage t
1d050 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65 0a 20  he others, the. 
1d060 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1d070 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  le must contain 
1d080 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65 73 20  sync()ed copies 
1d090 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d 0a 20  of all of them. 
1d0a0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61 6e 79     ** before any
1d0b0 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62 65 20   of them can be 
1d0c0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 74  written out to t
1d0d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d0e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d0f0 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20   needSync ){.   
1d100 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
1d110 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53  B && pPager->noS
1d120 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ync==0 );.      
1d130 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
1d140 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63 3b 20  ge && needSync; 
1d150 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 50  ii++){.        P
1d160 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70 61  gHdr *pPage = pa
1d170 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1d180 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20 20  r, pg1+ii);.    
1d190 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29 20      if( pPage ) 
1d1a0 70 50 61 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20  pPage->flags |= 
1d1b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
1d1c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d1d0 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
1d1e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d1f0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1d200 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d  needSync);.    }
1d210 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
1d220 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1d230 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
1d240 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
1d250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1d260 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1d270 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
1d280 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d290 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1d2a0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
1d2b0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1d2c0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1d2d0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
1d2e0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1d2f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1d300 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
1d310 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
1d320 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
1d330 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1d340 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1d350 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
1d360 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
1d370 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1d380 65 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73  eturn pPg->flags
1d390 26 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a  &PGHDR_DIRTY;.}.
1d3a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1d3b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1d3c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1d3d0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
1d3e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1d3f0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
1d400 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
1d410 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
1d420 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
1d430 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
1d440 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
1d450 20 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73   as dirty.  This
1d460 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
1d470 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74  ample, when.** t
1d480 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e  he page has been
1d490 20 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66   added as a leaf
1d4a0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1d4b0 20 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63   and so its.** c
1d4c0 6f 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72  ontent no longer
1d4d0 20 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20   matters..**.** 
1d4e0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
1d4f0 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
1d500 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
1d510 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
1d520 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
1d530 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
1d540 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
1d550 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
1d560 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
1d570 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
1d580 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
1d590 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
1d5a0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
1d5b0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
1d5c0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
1d5d0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
1d5e0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
1d5f0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
1d600 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
1d610 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
1d620 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
1d630 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
1d640 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
1d650 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
1d660 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1d670 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
1d680 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
1d690 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
1d6a0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
1d6b0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
1d6c0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d6d0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
1d6e0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
1d6f0 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
1d700 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
1d710 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
1d720 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
1d730 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
1d740 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
1d750 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d760 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
1d770 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
1d780 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
1d790 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1d7a0 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
1d7b0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
1d7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1d7d0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
1d7e0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
1d7f0 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
1d800 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
1d810 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
1d820 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d830 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
1d840 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
1d850 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1d860 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
1d870 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
1d880 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
1d890 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
1d8a0 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
1d8b0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
1d8c0 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
1d8d0 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
1d8e0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
1d8f0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1d900 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20  () call..*/.int 
1d910 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d920 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1d930 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
1d940 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1d950 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1d960 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1d970 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1d980 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1d990 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1d9a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d9b0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1d9c0 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1d9d0 6f 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  ollback==0 ){.  
1d9e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d9f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1da00 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
1da10 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 73 71  aysRollback = sq
1da20 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
1da30 65 28 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  e(pPager->origDb
1da40 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
1da50 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1da60 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
1da70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1da80 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1da90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
1daa0 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
1dab0 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c  pAlwaysRollback,
1dac0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20   pPg->pgno);..  
1dad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dae0 4b 20 26 26 20 28 70 50 67 2d 3e 66 6c 61 67 73  K && (pPg->flags
1daf0 26 50 47 48 44 52 5f 44 49 52 54 59 29 20 26 26  &PGHDR_DIRTY) &&
1db00 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f   pPager->nSavepo
1db10 69 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  int==0 ){.    as
1db20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1db30 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
1db40 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
1db50 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 70 50 67  ger->dbSize==pPg
1db60 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
1db70 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
1db80 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
1db90 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1dba0 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
1dbb0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
1dbc0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
1dbd0 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
1dbe0 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
1dbf0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1dc00 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
1dc10 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1dc20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
1dc30 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
1dc40 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
1dc50 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
1dc60 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1dc70 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
1dc80 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
1dc90 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
1dca0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
1dcb0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
1dcc0 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
1dcd0 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
1dce0 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
1dcf0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
1dd00 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
1dd10 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
1dd20 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
1dd30 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
1dd40 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
1dd50 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
1dd60 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
1dd70 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
1dd80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
1dd90 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
1dda0 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54  RACE3("DONT_WRIT
1ddb0 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  E page %d of %d\
1ddc0 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
1ddd0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1dde0 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1ddf0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
1de00 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
1de10 6e 6f 29 29 0a 20 20 20 20 20 20 70 50 67 2d 3e  no)).      pPg->
1de20 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44  flags |= PGHDR_D
1de30 4f 4e 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65  ONT_WRITE;.#ifde
1de40 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1de50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
1de60 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1de70 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
1de80 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1de90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1dea0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1deb0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1dec0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1ded0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
1dee0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
1def0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1df00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
1df10 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
1df20 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
1df30 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1df40 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
1df50 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
1df60 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
1df70 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
1df80 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1df90 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
1dfa0 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
1dfb0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1dfc0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
1dfd0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
1dfe0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
1dff0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1e000 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
1e010 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
1e020 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
1e030 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
1e040 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
1e050 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
1e060 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
1e070 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
1e080 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
1e090 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e0a0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1e0b0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1e0c0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e0d0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1e0e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e0f0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1e100 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ED );..  /* If t
1e110 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e120 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20  is not open, or 
1e130 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
1e140 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20  been called on. 
1e150 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28 44   ** this page (D
1e160 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73 20  ontWrite() sets 
1e170 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
1e180 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20 74  ck flag), then t
1e190 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1e1a0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  n is a no-op..  
1e1b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1e1c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1e1d0 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  .   || sqlite3Bi
1e1e0 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d  tvecTest(pPager-
1e1f0 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
1e200 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 0a 20 20 20  , pPg->pgno).   
1e210 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  || pPg->pgno>pPa
1e220 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 0a  ger->origDbSize.
1e230 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b    ){.    return;
1e240 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
1e250 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
1e260 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  E.  if( sqlite3B
1e270 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1e280 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
1e290 67 2d 3e 70 67 6e 6f 29 21 3d 30 0a 20 20 20 7c  g->pgno)!=0.   |
1e2a0 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  | pPg->pgno>pPag
1e2b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1e2c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1e2d0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
1e2e0 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  f SECURE_DELETE 
1e2f0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1e300 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  n there is no wa
1e310 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
1e320 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1e330 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67 65  called on a page
1e340 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69 74   for which sqlit
1e350 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
1e360 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20  ().  ** has not 
1e370 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  been previously 
1e380 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68  called during th
1e390 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1e3a0 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20  on..  ** And if 
1e3b0 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
1e3c0 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e 20  previously been 
1e3d0 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c 6c  called, the foll
1e3e0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64 69  owing.  ** condi
1e3f0 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65  tions must be me
1e400 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61  t..  **.  ** (La
1e410 74 65 72 3a 29 20 20 4e 6f 74 20 74 72 75 65 2e  ter:)  Not true.
1e420 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
1e430 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 62  e is corrupted b
1e440 79 20 68 61 76 69 6e 67 20 64 75 70 6c 69 63 61  y having duplica
1e450 74 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6f 6e  te.  ** pages on
1e460 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 65   the freelist (e
1e470 78 3a 20 63 6f 72 72 75 70 74 39 2e 74 65 73 74  x: corrupt9.test
1e480 29 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  ) then the follo
1e490 77 69 6e 67 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  wing is not.  **
1e4a0 20 6e 65 63 65 73 73 61 72 69 6c 79 20 74 72 75   necessarily tru
1e4b0 65 3a 0a 20 20 2a 2f 0a 20 20 2f 2a 20 61 73 73  e:.  */.  /* ass
1e4c0 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75  ert( !pPg->inJou
1e4d0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
1e4e0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1e4f0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 20  ->origDbSize ); 
1e500 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
1e510 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1e520 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1e530 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
1e540 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
1e550 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  g->pgno);.  pPg-
1e560 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52  >flags &= ~PGHDR
1e570 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 61 64  _NEED_READ;.  ad
1e580 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1e590 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1e5a0 3e 70 67 6e 6f 29 3b 0a 20 20 50 41 47 45 52 54  >pgno);.  PAGERT
1e5b0 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1e5c0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1e5d0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1e5e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e5f0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
1e600 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
1e610 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1e620 67 6e 6f 29 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  gno)).}.../*.** 
1e630 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1e640 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1e650 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1e660 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1e670 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1e680 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1e690 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1e6a0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1e6b0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1e6c0 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1e6d0 65 72 2c 20 69 6e 74 20 69 73 44 69 72 65 63 74  er, int isDirect
1e6e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
1e6f0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1e700 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1e710 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e730 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1e740 49 54 45 0a 20 20 61 73 73 65 72 74 28 20 69 73  ITE.  assert( is
1e750 44 69 72 65 63 74 3d 3d 30 20 29 3b 20 20 2f 2a  Direct==0 );  /*
1e760 20 69 73 44 69 72 65 63 74 20 69 73 20 6f 6e 6c   isDirect is onl
1e770 79 20 74 72 75 65 20 66 6f 72 20 61 74 6f 6d 69  y true for atomi
1e780 63 20 77 72 69 74 65 73 20 2a 2f 0a 23 65 6e 64  c writes */.#end
1e790 69 66 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  if.  if( !pPager
1e7a0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1e7b0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
1e7c0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ize>0 ){.    /* 
1e7d0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1e7e0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1e7f0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ing. */.    rc =
1e800 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1e810 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
1e820 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
1e830 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e840 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66  turn rc;..    if
1e850 28 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20  ( !isDirect ){. 
1e860 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e870 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
1e880 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dr);.      if( r
1e890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e8a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1e8b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
1e8c0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1e8d0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1e8e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
1e8f0 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1e900 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1e910 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1e920 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63  yte 24. */.    c
1e930 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20  hange_counter = 
1e940 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28  sqlite3Get4byte(
1e950 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46  (u8*)pPager->dbF
1e960 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68  ileVers);.    ch
1e970 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ange_counter++;.
1e980 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28      put32bits(((
1e990 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44  char*)pPgHdr->pD
1e9a0 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  ata)+24, change_
1e9b0 63 6f 75 6e 74 65 72 29 3b 0a 0a 23 69 66 64 65  counter);..#ifde
1e9c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e9d0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1e9e0 20 69 66 28 20 69 73 44 69 72 65 63 74 20 26 26   if( isDirect &&
1e9f0 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
1ea00 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 63  thods ){.      c
1ea10 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 20  onst void *zBuf 
1ea20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61 3b  = pPgHdr->pData;
1ea30 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ea40 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1ea50 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
1ea60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
1ea70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1ea80 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
1ea90 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
1eaa0 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
1eab0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1eac0 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
1ead0 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
1eae0 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
1eaf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1eb00 20 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20   Sync the pager 
1eb10 66 69 6c 65 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  file to disk..*/
1eb20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1eb30 72 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  rSync(Pager *pPa
1eb40 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1eb50 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1eb60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1eb70 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
1eb80 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1eb90 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
1eba0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1ebb0 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
1ebc0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
1ebd0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1ebe0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
1ebf0 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
1ec00 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
1ec10 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
1ec20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1ec30 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
1ec40 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1ec50 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
1ec60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
1ec70 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
1ec80 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
1ec90 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
1eca0 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
1ecb0 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
1ecc0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1ecd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1ece0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
1ecf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1ed00 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
1ed10 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
1ed20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1ed30 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
1ed40 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
1ed50 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
1ed60 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
1ed70 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
1ed80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
1ed90 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1eda0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
1edb0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
1edc0 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
1edd0 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
1ede0 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
1edf0 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
1ee00 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
1ee10 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
1ee20 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
1ee30 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
1ee40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
1ee50 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
1ee60 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
1ee70 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1ee80 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
1ee90 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
1eea0 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
1eeb0 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
1eec0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1eed0 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
1eee0 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
1eef0 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
1ef00 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
1ef10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ef20 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
1ef30 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
1ef40 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
1ef50 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
1ef60 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
1ef70 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
1ef80 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
1ef90 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
1efa0 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
1efb0 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
1efc0 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
1efd0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1efe0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1eff0 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
1f000 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
1f010 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
1f020 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
1f030 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
1f040 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f050 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
1f060 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
1f070 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
1f080 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
1f090 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 63 68 61 6e  .  /* If no chan
1f0a0 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 6d 61  ges have been ma
1f0b0 64 65 2c 20 77 65 20 63 61 6e 20 6c 65 61 76 65  de, we can leave
1f0c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f0d0 20 65 61 72 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69   early..  */.  i
1f0e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  f( pPager->dbMod
1f0f0 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20 20 20  ified==0 &&.    
1f100 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75      (pPager->jou
1f110 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
1f120 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45  JOURNALMODE_DELE
1f130 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  TE ||.          
1f140 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1f150 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20 20 20  eMode!=0) ){.   
1f160 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f170 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c  >dirtyCache==0 |
1f180 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1f190 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  lOpen==0 );.    
1f1a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f1b0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
1f1c0 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1f1d0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1f1e0 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1f1f0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1f200 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1f210 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1f220 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1f230 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1f240 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1f250 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1f260 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1f270 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1f280 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1f290 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1f2a0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1f2b0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1f2c0 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1f2d0 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1f2e0 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1f2f0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23    PgHdr *pPg;..#
1f300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f310 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  BLE_ATOMIC_WRITE
1f320 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d  .    /* The atom
1f330 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a  ic-write optimiz
1f340 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65  ation can be use
1f350 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a  d if all of the.
1f360 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
1f370 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a   are true:.    *
1f380 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68  *.    **    + Th
1f390 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
1f3a0 70 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69  pports the atomi
1f3b0 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
1f3c0 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20   for.    **     
1f3d0 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20   blocks of size 
1f3e0 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20  page-size, and. 
1f3f0 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20     **    + This 
1f400 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61  commit is not pa
1f410 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1f420 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  le transaction, 
1f430 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20  and.    **    + 
1f440 45 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65  Exactly one page
1f450 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
1f460 65 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20  ed and store in 
1f470 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f480 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1f490 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  If the optimizat
1f4a0 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c  ion can be used,
1f4b0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1f4c0 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65  l file will neve
1f4d0 72 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61  r.    ** be crea
1f4e0 74 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61  ted for this tra
1f4f0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  nsaction..    */
1f500 0a 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d  .    int useAtom
1f510 69 63 57 72 69 74 65 3b 0a 20 20 20 20 70 50 67  icWrite;.    pPg
1f520 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1f530 44 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72  DirtyList(pPager
1f540 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20  ->pPCache);.    
1f550 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 3d  useAtomicWrite =
1f560 20 28 0a 20 20 20 20 20 20 20 20 21 7a 4d 61 73   (.        !zMas
1f570 74 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20  ter && .        
1f580 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1f590 70 65 6e 20 26 26 0a 20 20 20 20 20 20 20 20 70  pen &&.        p
1f5a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1f5b0 66 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  f==jrnlBufferSiz
1f5c0 65 28 70 50 61 67 65 72 29 20 26 26 20 0a 20 20  e(pPager) && .  
1f5d0 20 20 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20        nTrunc==0 
1f5e0 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 50 67  && .        (pPg
1f5f0 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 44 69 72  ==0 || pPg->pDir
1f600 74 79 3d 3d 30 29 0a 20 20 20 20 29 3b 0a 20 20  ty==0).    );.  
1f610 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f620 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
1f630 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1f640 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
1f650 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
1f660 20 20 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63     if( useAtomic
1f670 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  Write ){.      /
1f680 2a 20 55 70 64 61 74 65 20 74 68 65 20 6e 52 65  * Update the nRe
1f690 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a  c field in the j
1f6a0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
1f6b0 20 20 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74        int offset
1f6c0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1f6d0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
1f6e0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
1f6f0 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
1f700 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20  er->nRec==1);.  
1f710 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
1f720 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
1f730 2c 20 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72  , offset, pPager
1f740 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20  ->nRec);..      
1f750 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62  /* Update the db
1f760 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75   file change cou
1f770 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  nter. The follow
1f780 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f  ing call will mo
1f790 64 69 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68  dify.      ** th
1f7a0 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
1f7b0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61  esentation of pa
1f7c0 67 65 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20  ge 1 to include 
1f7d0 74 68 65 20 75 70 64 61 74 65 64 0a 20 20 20 20  the updated.    
1f7e0 20 20 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e    ** change coun
1f7f0 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69  ter and then wri
1f800 74 65 20 70 61 67 65 20 31 20 64 69 72 65 63 74  te page 1 direct
1f810 6c 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ly to the databa
1f820 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  se.      ** file
1f830 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
1f840 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72   atomic-write pr
1f850 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
1f860 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
1f870 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69  .      ** this i
1f880 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
1f890 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1f8a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f8b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69      rc = pager_i
1f8c0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1f8d0 72 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  r(pPager, 1);.  
1f8e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1f8f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f900 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65  te3JournalCreate
1f910 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
1f920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75     }..    if( !u
1f930 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26  seAtomicWrite &&
1f940 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f950 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1f960 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
1f970 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
1f980 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1f990 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
1f9a0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
1f9b0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
1f9c0 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
1f9d0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
1f9e0 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
1f9f0 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
1fa00 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
1fa10 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
1fa20 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
1fa30 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1fa40 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
1fa50 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
1fa60 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
1fa70 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
1fa80 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
1fa90 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
1faa0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1fab0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1fac0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
1fad0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
1fae0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
1faf0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
1fb00 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  r, 0);.      if(
1fb10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb20 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fb30 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1fb40 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1fb50 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1fb60 45 5f 4f 46 46 20 29 7b 0a 23 69 66 6e 64 65 66  E_OFF ){.#ifndef
1fb70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1fb80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20  OVACUUM.        
1fb90 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1fba0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1fbb0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1fbc0 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1fbd0 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1fbe0 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1fbf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69            ** bei
1fc00 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1fc10 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1fc20 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1fc30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1fc40 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
1fc50 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1fc60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a          Pgno i;.
1fc70 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1fc80 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1fc90 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1fca0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1fcb0 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1fcc0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1fcd0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1fce0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
1fcf0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
1fd00 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
1fd10 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
1fd30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1fd40 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1fd50 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fd60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fd70 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1fd80 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1fd90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1fda0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29  3PagerWrite(pPg)
1fdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1fdc0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1fdd0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1fde0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fdf0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fe00 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fe10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1fe20 20 20 7d 20 0a 20 20 20 20 20 20 20 20 7d 0a 23    } .        }.#
1fe30 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63  endif.        rc
1fe40 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1fe50 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1fe60 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
1fe70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fe80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fe90 69 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  it;.        rc =
1fea0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1feb0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
1fec0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1fed0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fee0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66   sync_exit;..#if
1fef0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ff00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1ff10 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1ff20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1ff30 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1ff40 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
1ff50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ff60 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ff70 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ff80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1ff90 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
1ffa0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
1ffb0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1ffc0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1ffd0 50 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28  PcacheDirtyList(
1ffe0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
1fff0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
20000 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
20010 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
20020 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20030 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
20040 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
20050 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f  OCKED );.      /
20060 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68  * The error migh
20070 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65 20  t have left the 
20080 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66  dirty list all f
20090 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20  ouled up here,. 
200a0 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74       ** but that
200b0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
200c0 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65 20   because if the 
200d0 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  if the dirty lis
200e0 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67  t did.      ** g
200f0 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  et corrupted, th
20100 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
20110 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63  on will roll bac
20120 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64  k and.      ** d
20130 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74 79  iscard the dirty
20140 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69 73   list.  There is
20150 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20   an assert in.  
20160 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74      ** pager_get
20170 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
20180 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65 73  () that verifies
20190 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74   that no attempt
201a0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64  .      ** is mad
201b0 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61  e to use an inva
201c0 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a  lid dirty list..
201d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67        */.      g
201e0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
201f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
20200 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70  PcacheCleanAll(p
20210 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
20220 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
20230 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20240 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
20250 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21  ger->noSync && !
20260 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
20270 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
20280 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
20290 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
202a0 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f  s);.    }.    IO
202b0 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25  TRACE(("DBSYNC %
202c0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a  p\n", pPager))..
202d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
202e0 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44  e = PAGER_SYNCED
202f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45  ;.  }else if( ME
20300 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30  MDB && nTrunc!=0
20310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
20320 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
20330 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
20340 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69  );.  }..sync_exi
20350 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  t:.  if( rc==SQL
20360 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
20370 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65  D ){.    /* page
20380 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
20390 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65 6d  nter() may attem
203a0 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20  pt to obtain an 
203b0 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20 2a  exclusive.     *
203c0 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74   lock to spill t
203d0 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 74  he cache and ret
203e0 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  urn IOERR_BLOCKE
203f0 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20 20  D. But since .  
20400 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e 6f     * there is no
20410 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63 68   chance the cach
20420 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e  e is inconsisten
20430 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a 20  t, it is.     * 
20440 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
20450 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
20460 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
20470 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
20480 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20490 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
204a0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
204b0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
204c0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
204d0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
204e0 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
204f0 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
20500 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
20510 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
20520 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
20530 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
20540 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
20550 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
20560 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20570 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20580 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
20590 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
205a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
205b0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70 50 61  E_OK;..  if( pPa
205c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
205d0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
205e0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
205f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20600 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
20610 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
20620 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20630 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
20640 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
20650 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
20660 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
20670 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
20680 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
20690 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
206a0 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
206b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
206c0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
206d0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
206e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
206f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20700 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41  ITE_OK;.  }.  PA
20710 47 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  GERTRACE2("COMMI
20720 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
20730 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73  (pPager));.  ass
20740 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20750 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
20760 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50   || MEMDB || !pP
20770 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
20780 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
20790 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
207a0 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
207b0 3e 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72  >setMaster);.  r
207c0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
207d0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 72  pPager, rc);.  r
207e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
207f0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
20800 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
20810 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
20820 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
20830 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
20840 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
20850 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
20860 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
20870 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
20880 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
20890 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
208a0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
208b0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
208c0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
208d0 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
208e0 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
208f0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
20900 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  l or unless some
20910 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
20920 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
20930 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
20940 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
20950 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
20960 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
20970 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
20980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
20990 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
209a0 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
209b0 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
209c0 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
209d0 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
209e0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
209f0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
20a00 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20a10 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
20a20 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20a30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 41 47 45 52  LITE_OK;.  PAGER
20a40 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
20a50 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
20a60 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
20a70 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
20a80 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
20a90 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
20aa0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
20ab0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
20ac0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
20ad0 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
20ae0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
20af0 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
20b00 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
20b10 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
20b20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20b30 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
20b40 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
20b50 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
20b60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
20b70 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
20b80 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
20b90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
20ba0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
20bb0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
20bc0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
20bd0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
20be0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
20bf0 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
20c00 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
20c10 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
20c20 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
20c30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20c40 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20c50 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
20c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20c70 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
20c80 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
20c90 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
20ca0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
20cb0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
20cc0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
20cd0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
20ce0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
20cf0 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
20d00 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
20d10 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
20d20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
20d30 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
20d40 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
20d50 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
20d60 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
20d70 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
20d80 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
20d90 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
20da0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20db0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
20dc0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
20dd0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
20de0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
20df0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
20e00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
20e10 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
20e20 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
20e30 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
20e40 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
20e50 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
20e60 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
20e70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
20e80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
20e90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
20ea0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
20eb0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
20ec0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
20ed0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
20ee0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
20ef0 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
20f00 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
20f10 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
20f20 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20f30 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
20f40 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
20f50 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
20f60 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
20f70 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
20f80 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
20f90 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
20fa0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20fb0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
20fc0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
20fd0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
20fe0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
20ff0 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
21000 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
21010 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
21020 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
21030 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
21040 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
21050 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
21060 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
21070 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
21080 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21090 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
210a0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
210b0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
210c0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
210d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
210e0 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
210f0 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
21100 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
21110 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
21120 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
21130 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
21140 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
21150 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
21160 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
21170 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
21180 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
21190 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
211a0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
211b0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
211c0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20  return a;.}.int 
211d0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 4d 65  sqlite3PagerIsMe
211e0 6d 64 62 28 50 61 67 65 72 20 2a 70 50 61 67 65  mdb(Pager *pPage
211f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 4d 45 4d  r){.  return MEM
21200 44 42 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  DB;.}.#endif../*
21210 0a 2a 2a 20 45 6e 73 75 72 65 20 74 68 61 74 20  .** Ensure that 
21220 74 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61  there are at lea
21230 73 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61  st nSavepoint sa
21240 76 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 0a 2a  vepoints open..*
21250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21260 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
21270 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21280 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt nSavepoint){.
21290 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
212a0 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 53 61  E_OK;..  if( nSa
212b0 76 65 70 6f 69 6e 74 3e 70 50 61 67 65 72 2d 3e  vepoint>pPager->
212c0 6e 53 61 76 65 70 6f 69 6e 74 20 26 26 20 70 50  nSavepoint && pP
212d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
212e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   ){.    int ii;.
212f0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
21300 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
21310 73 20 6f 70 65 6e 20 6f 72 20 74 68 65 72 65 20  s open or there 
21320 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
21330 76 65 70 6f 69 6e 74 73 2e 20 2a 2f 0a 20 20 20  vepoints. */.   
21340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21350 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 7c  >nSavepoint==0 |
21360 7c 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e  | pPager->sjfd->
21370 70 4d 65 74 68 6f 64 73 20 29 3b 0a 0a 20 20 20  pMethods );..   
21380 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67   /* Grow the Pag
21390 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
213a0 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f  ray using reallo
213b0 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  c(). Return SQLI
213c0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20  TE_NOMEM.    ** 
213d0 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
213e0 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69  n fails. Otherwi
213f0 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77  se, zero the new
21400 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65   portion in case
21410 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f   a .    ** mallo
21420 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
21430 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
21440 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28  g it in the for(
21450 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e  ...) loop below.
21460 0a 20 20 20 20 2a 2f 0a 20 20 20 20 50 61 67 65  .    */.    Page
21470 72 53 61 76 65 70 6f 69 6e 74 20 2a 61 4e 65 77  rSavepoint *aNew
21480 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69   = (PagerSavepoi
21490 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  nt *)sqlite3Real
214a0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61  loc(.        pPa
214b0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c  ger->aSavepoint,
214c0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
214d0 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69  epoint)*nSavepoi
214e0 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  nt.    );.    if
214f0 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !aNew ){.     
21500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21510 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
21520 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70 50 61  memset(&aNew[pPa
21530 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 5d  ger->nSavepoint]
21540 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 28 6e 53  , 0,.        (nS
21550 61 76 65 70 6f 69 6e 74 20 2d 20 70 50 61 67 65  avepoint - pPage
21560 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 2a  r->nSavepoint) *
21570 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
21580 65 70 6f 69 6e 74 29 0a 20 20 20 20 29 3b 0a 20  epoint).    );. 
21590 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
215a0 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20  point = aNew;.  
215b0 20 20 69 69 20 3d 20 70 50 61 67 65 72 2d 3e 6e    ii = pPager->n
215c0 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 70  Savepoint;.    p
215d0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
215e0 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  t = nSavepoint;.
215f0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
21600 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
21610 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a  int structures j
21620 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ust allocated. *
21630 2f 0a 20 20 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d  /.    for(/* no-
21640 6f 70 20 2a 2f 3b 20 69 69 3c 6e 53 61 76 65 70  op */; ii<nSavep
21650 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
21660 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21670 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
21680 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
21690 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d  .nOrig = pPager-
216a0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 61  >dbSize;.      a
216b0 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20  New[ii].iOffset 
216c0 3d 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = (pPager->journ
216d0 61 6c 4f 70 65 6e 20 3f 20 70 50 61 67 65 72 2d  alOpen ? pPager-
216e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3a 20 30 29  >journalOff : 0)
216f0 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
21700 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61 67 65  .iSubRec = pPage
21710 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 20  r->stmtNRec;.   
21720 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53     aNew[ii].pInS
21730 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69 74  avepoint = sqlit
21740 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
21750 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
21760 20 20 20 20 20 20 69 66 28 20 21 61 4e 65 77 5b        if( !aNew[
21770 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  ii].pInSavepoint
21780 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
21790 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
217a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
217b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
217c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  sub-journal, if 
217d0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
217e0 79 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 20  y opened. */.   
217f0 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f 75   rc = openSubJou
21800 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
21810 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
21820 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
21830 65 72 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20  er op is always 
21840 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
21850 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56  _ROLLBACK or SAV
21860 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a  EPOINT_RELEASE..
21870 2a 2a 20 49 66 20 69 74 20 69 73 20 53 41 56 45  ** If it is SAVE
21880 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
21890 68 65 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20  hen release and 
218a0 64 65 73 74 72 6f 79 20 74 68 65 20 73 61 76 65  destroy the save
218b0 70 6f 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e  point with.** in
218c0 64 65 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20  dex iSavepoint. 
218d0 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
218e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
218f0 6e 20 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  n rollback all c
21900 68 61 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68  hanges.** that h
21910 61 76 65 20 6f 63 63 75 72 65 64 20 73 69 6e 63  ave occured sinc
21920 65 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  e savepoint iSav
21930 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61 74  epoint was creat
21940 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74  ed..**.** In eit
21950 68 65 72 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  her case, all sa
21960 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
21970 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
21980 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
21990 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
219a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
219b0 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 28   are less than (
219c0 69 53 61 76 65 70 6f 69 6e 74 2b 31 29 20 61 63  iSavepoint+1) ac
219d0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
219e0 77 68 65 6e 20 74 68 69 73 20 0a 2a 2a 20 66 75  when this .** fu
219f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21a00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
21a10 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
21a20 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
21a30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
21a40 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
21a50 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
21a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
21a70 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
21a80 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
21a90 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
21aa0 4c 4c 42 41 43 4b 20 29 3b 0a 0a 20 20 69 66 28  LLBACK );..  if(
21ab0 20 69 53 61 76 65 70 6f 69 6e 74 3c 70 50 61 67   iSavepoint<pPag
21ac0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
21ad0 7b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  {.    int ii;.  
21ae0 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 69 53 61    int nNew = iSa
21af0 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d 53  vepoint + (op==S
21b00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21b10 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e  K);.    for(ii=n
21b20 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e  New; ii<pPager->
21b30 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
21b40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21b50 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50  BitvecDestroy(pP
21b60 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
21b70 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e  [ii].pInSavepoin
21b80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  t);.    }.    pP
21b90 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
21ba0 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 69 66   = nNew;..    if
21bb0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
21bc0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
21bd0 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
21be0 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
21bf0 6e 4e 65 77 3d 3d 30 29 20 3f 20 30 20 3a 20 26  nNew==0) ? 0 : &
21c00 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
21c10 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20 20  nt[nNew-1];.    
21c20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61 79    rc = pagerPlay
21c30 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70 50  backSavepoint(pP
21c40 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e 74  ager, pSavepoint
21c50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21c60 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 29  rc!=SQLITE_DONE)
21c70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21c80 49 66 20 74 68 69 73 20 69 73 20 61 20 72 65 6c  If this is a rel
21c90 65 61 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ease of the oute
21ca0 72 6d 6f 73 74 20 73 61 76 65 70 6f 69 6e 74 2c  rmost savepoint,
21cb0 20 74 72 75 6e 63 61 74 65 20 0a 20 20 20 20 2a   truncate .    *
21cc0 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
21cd0 6c 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e  l. */.    if( nN
21ce0 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56  ew==0 && op==SAV
21cf0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26  EPOINT_RELEASE &
21d00 26 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 2d 3e  & pPager->sjfd->
21d10 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
21d20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21d30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
21d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
21d50 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
21d60 73 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  sjfd, 0);.      
21d70 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
21d80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
21d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21da0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21db0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
21dc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
21dd0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
21de0 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
21df0 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
21e00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21e10 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
21e20 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
21e30 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74 72  turn the VFS str
21e40 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 70  ucture for the p
21e50 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73  ager..*/.const s
21e60 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69  qlite3_vfs *sqli
21e70 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67 65  te3PagerVfs(Page
21e80 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21e90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66  turn pPager->pVf
21ea0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  s;.}../*.** Retu
21eb0 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  rn the file hand
21ec0 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  le for the datab
21ed0 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61  ase file associa
21ee0 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
21ef0 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67  pager.  This mig
21f00 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ht return NULL i
21f10 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a  f the file has.*
21f20 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  * not yet been o
21f30 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  pened..*/.sqlite
21f40 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50  3_file *sqlite3P
21f50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a  agerFile(Pager *
21f60 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
21f70 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a  n pPager->fd;.}.
21f80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21f90 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
21fa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21fb0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
21fc0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
21fd0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
21fe0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
21ff0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
22000 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22010 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
22020 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
22030 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
22040 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
22050 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
22060 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22070 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
22080 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
22090 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
220a0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
220b0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
220c0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
220d0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
220e0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
220f0 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
22100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22110 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
22120 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
22130 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
22140 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
22150 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
22160 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
22170 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
22180 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
22190 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
221a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
221b0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
221c0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
221d0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
221e0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
221f0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
22200 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
22210 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
22220 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
22230 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
22240 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
22250 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
22260 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
22270 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
22280 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
22290 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
222a0 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
222b0 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
222c0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
222d0 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
222e0 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
222f0 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
22300 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
22310 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
22320 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
22330 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
22340 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
22350 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
22360 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
22370 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
22380 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
22390 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
223a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
223b0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
223c0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
223d0 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
223e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
223f0 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
22400 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
22410 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
22420 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
22430 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
22440 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
22450 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
22460 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
22470 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
22480 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
22490 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
224a0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
224b0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
224c0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
224d0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
224e0 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
224f0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
22500 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
22510 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
22520 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
22530 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
22540 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
22550 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
22560 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
22570 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
22580 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
22590 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
225a0 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
225b0 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
225c0 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
225d0 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
225e0 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
225f0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
22600 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
22610 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
22620 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
22630 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
22640 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
22650 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
22660 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
22670 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
22680 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
22690 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
226a0 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20  rMovepage(Pager 
226b0 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20  *pPager, DbPage 
226c0 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  *pPg, Pgno pgno,
226d0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 29 7b 0a   int isCommit){.
226e0 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
226f0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62 65    /* The page be
22700 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
22710 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   */.  Pgno needS
22720 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
22730 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
22740 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
22750 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
22760 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
22770 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
22780 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
22790 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
227a0 2d 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c  ->pgno, (pPg->fl
227b0 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
227c0 59 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 3b  YNC)?1:0, pgno);
227d0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
227e0 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
227f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
22800 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
22810 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
22820 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
22830 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
22840 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
22850 66 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70  fore page pPg->p
22860 67 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20  gno can.  ** be 
22870 77 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72  written to, stor
22880 65 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c  e pPg->pgno in l
22890 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65  ocal variable ne
228a0 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a  edSyncPgno..  **
228b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43  .  ** If the isC
228c0 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
228d0 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  t, there is no n
228e0 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  eed to remember 
228f0 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  that.  ** the jo
22900 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
22910 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
22920 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
22930 70 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20  pPg->pgno .  ** 
22940 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74  can be written t
22950 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61  o. The caller ha
22960 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73  s already promis
22970 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20  ed not to write 
22980 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  to it..  */.  if
22990 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
229a0 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26  HDR_NEED_SYNC) &
229b0 26 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20  & !isCommit ){. 
229c0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
229d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
229e0 20 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a   assert( pageInJ
229f0 6f 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70  ournal(pPg) || p
22a00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
22a10 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
22a20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
22a30 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54  flags&PGHDR_DIRT
22a40 59 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Y );.    assert(
22a50 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22a60 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  c );.  }..  /* I
22a70 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
22a80 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
22a90 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
22aa0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
22ab0 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  * from its hash 
22ac0 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
22ad0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
22ae0 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
22af0 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
22b00 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
22b10 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
22b20 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
22b30 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
22b40 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
22b50 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
22b60 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
22b70 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67  NEED_SYNC;.  pPg
22b80 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
22b90 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
22ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
22bb0 4f 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e  Old || pPgOld->n
22bc0 52 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Ref==1 );.  if( 
22bd0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50  pPgOld ){.    pP
22be0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67  g->flags |= (pPg
22bf0 4f 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  Old->flags&PGHDR
22c00 5f 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 7d  _NEED_SYNC);.  }
22c10 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ..  sqlite3Pcach
22c20 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
22c30 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
22c40 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
22c50 63 68 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b  cheDrop(pPgOld);
22c60 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
22c70 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70  cacheMakeDirty(p
22c80 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
22c90 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
22ca0 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
22cb0 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  ied = 1;..  if( 
22cc0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a  needSyncPgno ){.
22cd0 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79      /* If needSy
22ce0 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65  ncPgno is non-ze
22cf0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  ro, then the jou
22d00 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20  rnal file needs 
22d10 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79  to be .    ** sy
22d20 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e  nc()ed before an
22d30 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y data is writte
22d40 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69  n to database fi
22d50 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63  le page needSync
22d60 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72  Pgno..    ** Cur
22d70 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20  rently, no such 
22d80 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20 74  page exists in t
22d90 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e  he page-cache an
22da0 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 22 69  d the .    ** "i
22db0 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62 69 74  s journaled" bit
22dc0 76 65 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  vec flag has bee
22dd0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
22de0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
22df0 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61 64 69   by.    ** loadi
22e00 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ng the page into
22e10 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22e20 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
22e30 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
22e40 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a 20 20  .    ** flag..  
22e50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
22e60 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  he attempt to lo
22e70 61 64 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ad the page into
22e80 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
22e90 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20  fails, (due.    
22ea0 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29  ** to a malloc()
22eb0 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c   or IO failure),
22ec0 20 63 6c 65 61 72 20 74 68 65 20 62 69 74 20 69   clear the bit i
22ed0 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c  n the pInJournal
22ee0 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e  [].    ** array.
22ef0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
22f00 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65  he page is loade
22f10 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67  d and written ag
22f20 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ain in.    ** th
22f30 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
22f40 69 74 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  it may be writte
22f50 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
22f60 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20  e file before.  
22f70 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65    ** it is synce
22f80 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  d into the journ
22f90 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61  al file. This wa
22fa0 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70  y, it may end up
22fb0 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a   in.    ** the j
22fc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63  ournal file twic
22fd0 65 2c 20 62 75 74 20 74 68 61 74 20 69 73 20 6e  e, but that is n
22fe0 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20  ot a problem..  
22ff0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
23000 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
23010 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
23020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
23030 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
23040 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
23050 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
23060 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
23070 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
23080 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
23090 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
230a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
230b0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
230c0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
230d0 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
230e0 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
230f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
23110 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
23120 61 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67  al && needSyncPg
23130 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
23140 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
23150 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
23160 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
23170 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
23180 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  cPgno);.      }.
23190 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
231a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
231b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
231c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
231d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26  ger->noSync==0 &
231e0 26 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  & !MEMDB );.    
231f0 70 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d  pPgHdr->flags |=
23200 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
23210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  ;.    sqlite3Pca
23220 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67  cheMakeDirty(pPg
23230 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
23240 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
23250 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  dr);.  }..  retu
23260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23270 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
23280 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
23290 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
232a0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
232b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
232c0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
232d0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
232e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
232f0 66 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67  f>0 || pPg->pPag
23300 65 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72  er->memDb );.  r
23310 65 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61  eturn pPg->pData
23320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23330 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
23340 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
23350 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
23360 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
23370 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
23380 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
23390 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
233a0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
233b0 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
233c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
233d0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
233e0 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
233f0 70 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a  pPg->pExtra:0);.
23400 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
23410 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
23420 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
23430 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
23440 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
23450 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
23460 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
23470 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
23480 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
23490 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
234a0 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
234b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
234c0 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
234d0 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
234e0 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
234f0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
23500 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
23510 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
23520 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
23530 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
23540 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
23550 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
23560 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
23570 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
23580 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
23590 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
235a0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
235b0 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
235c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
235d0 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
235e0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
235f0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
23600 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
23610 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
23620 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
23630 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
23640 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
23650 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
23660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
23670 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
23680 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
23690 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
236a0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
236b0 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
236c0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
236d0 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
236e0 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
236f0 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
23700 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
23710 65 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64  eMode = (u8)eMod
23720 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
23730 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
23740 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f  lusiveMode;.}../
23750 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
23760 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f   journal-mode fo
23770 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61  r this pager. Pa
23780 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75  rameter eMode mu
23790 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a  st be one of:.**
237a0 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
237b0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a  RNALMODE_QUERY.*
237c0 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
237d0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a  ALMODE_DELETE.**
237e0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
237f0 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a  LMODE_TRUNCATE.*
23800 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
23810 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a  ALMODE_PERSIST.*
23820 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e  *    PAGER_JOURN
23830 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 0a 2a 2a  ALMODE_OFF.**.**
23840 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
23850 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
23860 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
23870 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  l-mode is set to
23880 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70   the.** value sp
23890 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
238a0 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69  he returned indi
238b0 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  cate the current
238c0 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
238d0 65 64 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d  ed).** journal-m
238e0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
238f0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d  te3PagerJournalM
23900 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
23910 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
23920 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
23930 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65     assert( eMode
23940 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23950 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
23960 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
23970 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
23980 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20  ODE_DELETE.     
23990 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
239a0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
239b0 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20  MODE_TRUNCATE.  
239c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
239d0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
239e0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
23a00 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
23a10 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
23a30 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
23a40 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20  RNALMODE_MEMORY 
23a50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 50  );.    assert( P
23a60 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
23a70 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 20 20  _QUERY<0 );.    
23a80 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b 0a  if( eMode>=0 ){.
23a90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
23aa0 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29  urnalMode = (u8)
23ab0 65 4d 6f 64 65 3b 0a 20 20 20 20 7d 65 6c 73 65  eMode;.    }else
23ac0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23ad0 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  eMode==PAGER_JOU
23ae0 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 20 29  RNALMODE_QUERY )
23af0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23b00 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72  turn (int)pPager
23b10 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d  ->journalMode;.}
23b20 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
23b30 74 68 65 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75  the size-limit u
23b40 73 65 64 20 66 6f 72 20 70 65 72 73 69 73 74 65  sed for persiste
23b50 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
23b60 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
23b70 50 61 67 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65  PagerJournalSize
23b80 4c 69 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  Limit(Pager *pPa
23b90 67 65 72 2c 20 69 36 34 20 69 4c 69 6d 69 74 29  ger, i64 iLimit)
23ba0 7b 0a 20 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d  {.  if( iLimit>=
23bb0 2d 31 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  -1 ){.    pPager
23bc0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
23bd0 69 74 20 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d  it = iLimit;.  }
23be0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23bf0 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
23c00 69 74 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  it;.}..#endif /*
23c10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
23c20 4b 49 4f 20 2a 2f 0a                             KIO */.