/ Hex Artifact Content
Login

Artifact 4fc24d29d699c00169a129fa6835a1ea31598873:


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 32  : pager.c,v 1.52
0350: 30 20 32 30 30 38 2f 31 32 2f 32 32 20 31 30 3a  0 2008/12/22 10:
0360: 35 38 3a 34 36 20 64 61 6e 69 65 6c 6b 31 39 37  58:46 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 2f 2a 0a 2a  PCache);.}../*.*
85b0: 2a 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63  * Free all struc
85c0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67  tures in the Pag
85d0: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20  er.aSavepoint[] 
85e0: 61 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f  array and set bo
85f0: 74 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76  th.** Pager.aSav
8600: 65 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72  epoint and Pager
8610: 2e 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a  .nSavepoint to z
8620: 65 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73  ero. Close the s
8630: 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66  ub-journal.** if
8640: 20 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20   it is open and 
8650: 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74  the pager is not
8660: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
8670: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  de..*/.static vo
8680: 69 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76  id releaseAllSav
8690: 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
86a0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
86b0: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
86c0: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
86d0: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
86e0: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
86f0: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
8700: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
8710: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
8720: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
8730: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
8740: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8750: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
8760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
8770: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
8780: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
8790: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
87a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
87b0: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  epoint = 0;.}../
87c0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74  *.** Set the bit
87d0: 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20   number pgno in 
87e0: 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
87f0: 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
8800: 62 69 74 76 65 63 73 20 6f 66 0a 2a 2a 20 61 6c  bitvecs of.** al
8810: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
8820: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8830: 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42   addToSavepointB
8840: 69 74 76 65 63 73 28 50 61 67 65 72 20 2a 70 50  itvecs(Pager *pP
8850: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
8860: 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
8870: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
8880: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
8890: 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72 53  i++){.    PagerS
88a0: 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26 70  avepoint *p = &p
88b0: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
88c0: 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  t[ii];.    if( p
88d0: 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29 7b  gno<=p->nOrig ){
88e0: 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
88f0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
8900: 20 68 61 6e 64 6c 69 6e 67 20 2a 2f 0a 20 20 20   handling */.   
8910: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
8920: 53 65 74 28 70 2d 3e 70 49 6e 53 61 76 65 70 6f  Set(p->pInSavepo
8930: 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  int, pgno);.    
8940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
8950: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
8960: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
8970: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a  tabase file. .**
8980: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
8990: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
89a0: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69   error state, di
89b0: 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e  scard the conten
89c0: 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61  ts of .** the ca
89d0: 63 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  che and reset th
89e0: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
89f0: 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  e internal state
8a00: 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  . If there is.**
8a10: 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   an open journal
8a20: 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20  -file, then the 
8a30: 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72  next time a shar
8a40: 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ed-lock is obtai
8a50: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61  ned.** on the pa
8a60: 67 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69  ger file (by thi
8a70: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
8a80: 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c  rocess), it will
8a90: 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61   be.** treated a
8aa0: 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  s a hot-journal 
8ab0: 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  and rolled back.
8ac0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8ad0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
8ae0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
8af0: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
8b00: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8b10: 20 69 6e 74 20 72 63 20 3d 20 6f 73 55 6e 6c 6f   int rc = osUnlo
8b20: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
8b30: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  O_LOCK);.    if(
8b40: 20 72 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72   rc ) pPager->er
8b50: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
8b60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
8b70: 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 49 4f 54  lid = 0;.    IOT
8b80: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
8b90: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
8ba0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f     /* Always clo
8bb0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
8bc0: 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
8bd0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
8be0: 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20 4f 74 68 65  ock..    ** Othe
8bf0: 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63  rwise, another c
8c00: 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a  onnection with j
8c10: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65  ournal_mode=dele
8c20: 74 65 20 6d 69 67 68 74 0a 20 20 20 20 2a 2a 20  te might.    ** 
8c30: 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  delete the file 
8c40: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 75  out from under u
8c50: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
8c60: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8c70: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 73  lOpen ){.      s
8c80: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
8c90: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8ca0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8cb0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
8cc0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
8cd0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
8ce0: 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  nJournal);.     
8cf0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
8d00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  nal = 0;.      s
8d10: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
8d20: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  roy(pPager->pAlw
8d30: 61 79 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20  aysRollback);.  
8d40: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 77      pPager->pAlw
8d50: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
8d60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
8d70: 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  f Pager.errCode 
8d80: 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e 74  is set, the cont
8d90: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
8da0: 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20 62  r cache cannot b
8db0: 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64  e.    ** trusted
8dc0: 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70  . Now that the p
8dd0: 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c  ager file is unl
8de0: 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  ocked, the conte
8df0: 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
8e00: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
8e10: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
8e20: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
8e30: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
8e40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
8e50: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
8e60: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
8e70: 54 45 5f 4f 4b 20 29 20 70 50 61 67 65 72 2d 3e  TE_OK ) pPager->
8e80: 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45  errCode = SQLITE
8e90: 5f 4f 4b 3b 0a 20 20 20 20 20 20 70 61 67 65 72  _OK;.      pager
8ea0: 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
8eb0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 41 6c 6c        releaseAll
8ec0: 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
8ed0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
8ee0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
8ef0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8f00: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
8f10: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
8f20: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
8f30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
8f40: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8f50: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50  R_UNLOCK;.    pP
8f60: 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
8f70: 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  tDone = 0;.  }.}
8f80: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
8f90: 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20  a rollback if a 
8fa0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
8fb0: 63 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b  ctive and unlock
8fc0: 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
8fd0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  e file. If the p
8fe0: 61 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ager has already
8ff0: 20 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72   entered the err
9000: 6f 72 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f  or state, .** do
9010: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65   not attempt the
9020: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74   rollback..*/.st
9030: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
9040: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
9050: 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66  (Pager *p){.  if
9060: 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ( p->errCode==SQ
9070: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74  LITE_OK && p->st
9080: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
9090: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
90a0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
90b0: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
90c0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
90d0: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  p);.    sqlite3E
90e0: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
90f0: 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e  ;.  }.  pager_un
9100: 6c 6f 63 6b 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  lock(p);.}../*.*
9110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
9120: 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nds a transactio
9130: 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f  n.  A transactio
9140: 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69  n is ended by ei
9150: 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54  ther.** a COMMIT
9160: 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a   or a ROLLBACK..
9170: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
9180: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9190: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
91a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
91b0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
91c0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
91d0: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
91e0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
91f0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
9200: 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61  elease.** the da
9210: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
9220: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
9230: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
9240: 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a  ace if that is.*
9250: 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
9260: 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20  e thing to do.  
9270: 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73  Release locks us
9280: 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72  ually is appropr
9290: 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20  iate,.** unless 
92a0: 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73  we are in exclus
92b0: 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20  ive access mode 
92c0: 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69  or unless this i
92d0: 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41  s a .** COMMIT A
92e0: 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c  ND BEGIN or ROLL
92f0: 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f  BACK AND BEGIN o
9300: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  peration..**.** 
9310: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
9320: 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74   is either delet
9330: 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e  ed or truncated.
9340: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
9350: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
9360: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
9370: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
9380: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
9390: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
93a0: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
93b0: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
93c0: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
93d0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
93e0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
93f0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
9400: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f  c int pager_end_
9410: 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  transaction(Page
9420: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68  r *pPager, int h
9430: 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  asMaster){.  int
9440: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9450: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
9460: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
9470: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
9480: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
9490: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94a0: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  OK;.  }.  releas
94b0: 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  eAllSavepoint(pP
94c0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
94d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
94e0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
94f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
9500: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
9510: 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20  DE_MEMORY ){.   
9520: 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72 79 4a     int isMemoryJ
9530: 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
9540: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
9550: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
9560: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
9570: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
9580: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9590: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
95a0: 20 20 20 69 66 28 20 21 69 73 4d 65 6d 6f 72 79     if( !isMemory
95b0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
95c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
95d0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
95e0: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
95f0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
9600: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
9610: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
9620: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9630: 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
9640: 45 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 72  E.         && (r
9650: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
9660: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
9670: 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  d, 0))==SQLITE_O
9680: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
9690: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
96a0: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
96b0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
96c0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
96d0: 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
96e0: 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c  siveMode .     |
96f0: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
9700: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9710: 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54  RNALMODE_PERSIST
9720: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
9730: 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64   = zeroJournalHd
9740: 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61 73  r(pPager, hasMas
9750: 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67 65  ter);.      page
9760: 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
9770: 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  rc);.      pPage
9780: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
9790: 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  0;.      pPager-
97a0: 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
97b0: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
97c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
97d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
97e0: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
97f0: 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20 72  MODE_DELETE || r
9800: 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  c );.      sqlit
9810: 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
9820: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50  ->jfd);.      pP
9830: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
9840: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  n = 0;.      if(
9850: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
9860: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
9870: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
9880: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
9890: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
98a0: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
98b0: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
98c0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
98d0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
98e0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
98f0: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
9900: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
9910: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
9920: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
9930: 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  >pAlwaysRollback
9940: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
9950: 41 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  AlwaysRollback =
9960: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
9970: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
9980: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49    sqlite3PcacheI
9990: 74 65 72 61 74 65 44 69 72 74 79 28 70 50 61 67  terateDirty(pPag
99a0: 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67  er->pPCache, pag
99b0: 65 72 5f 73 65 74 5f 70 61 67 65 68 61 73 68 29  er_set_pagehash)
99c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
99d0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41  ite3PcacheCleanA
99e0: 6c 6c 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ll(pPager->pPCac
99f0: 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  he);.    pPager-
9a00: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
9a10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
9a20: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
9a30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9a40: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
9a50: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
9a60: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
9a70: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
9a80: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
9a90: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
9aa0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
9ab0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
9ac0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
9ad0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
9ae0: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
9af0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
9b00: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
9b10: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
9b20: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
9b30: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
9b40: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
9b50: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
9b60: 6e 63 20 3d 20 30 3b 0a 20 20 2f 2a 20 6c 72 75  nc = 0;.  /* lru
9b70: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
9b80: 65 64 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  ed(pPager); */. 
9b90: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
9ba0: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
9bb0: 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a  eValid = 0;.  }.
9bc0: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
9bd0: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  fied = 0;..  ret
9be0: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
9bf0: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
9c00: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
9c10: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
9c20: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
9c30: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
9c40: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
9c50: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
9c60: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
9c70: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
9c80: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
9c90: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
9ca0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
9cb0: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
9cc0: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
9cd0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
9ce0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
9cf0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
9d00: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
9d10: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
9d20: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
9d30: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
9d40: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
9d50: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
9d60: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
9d70: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
9d80: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
9d90: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
9da0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
9db0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
9dc0: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
9dd0: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
9de0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
9df0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
9e00: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
9e10: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
9e20: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
9e30: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
9e40: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
9e50: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
9e60: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
9e70: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
9e80: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
9e90: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
9ea0: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
9eb0: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
9ec0: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
9ed0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
9ee0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
9ef0: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
9f00: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
9f10: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
9f20: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
9f30: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
9f40: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
9f50: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
9f60: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
9f70: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
9f80: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
9f90: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
9fa0: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
9fb0: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
9fc0: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
9fd0: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
9fe0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
9ff0: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
a000: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
a010: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
a020: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
a030: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
a040: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
a050: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
a060: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
a070: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
a080: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
a090: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
a0a0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
a0b0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
a0c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
a0d0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
a0e0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
a0f0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a100: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
a110: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
a120: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
a130: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
a140: 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d 61 69 6e  **.** The isMain
a150: 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Jrnl flag is tru
a160: 65 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  e if this is the
a170: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a   main rollback j
a180: 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20 66 61  ournal and.** fa
a190: 6c 73 65 20 66 6f 72 20 74 68 65 20 73 74 61 74  lse for the stat
a1a0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
a1b0: 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  The main rollbac
a1c0: 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65 73 0a 2a  k journal uses.*
a1d0: 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d 20 74 68  * checksums - th
a1e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
a1f0: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  nal does not..*/
a200: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
a210: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
a220: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
a230: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
a240: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
a250: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
a260: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
a270: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
a280: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
a290: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
a2a0: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
a2b0: 2f 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 20  /.  i64 offset, 
a2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 72    /* Offset of r
a2e0: 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61 63  ecord to playbac
a2f0: 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61 76  k */.  int isSav
a300: 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  epnt,           
a310: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
a320: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
a330: 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65  lback */.  Bitve
a340: 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20 20  c *pDone        
a350: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76           /* Bitv
a360: 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72 65  ec of pages alre
a370: 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ady played back 
a380: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a390: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
a3c0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
a3d0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
a400: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
a410: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
a420: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a440: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
a450: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
a460: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
a470: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
a480: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
a490: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
a4a0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 20 20  for a page */.  
a4b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
a4c0: 64 20 3d 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 20  d = (isMainJrnl 
a4d0: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
a4e0: 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 0a  pPager->sjfd);..
a4f0: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 20 73 74    /* The temp st
a500: 6f 72 61 67 65 20 6d 75 73 74 20 62 65 20 61 6c  orage must be al
a510: 6c 6f 63 61 74 65 64 20 61 74 20 74 68 69 73 20  located at this 
a520: 70 6f 69 6e 74 20 2a 2f 0a 20 20 61 73 73 65 72  point */.  asser
a530: 74 28 20 61 44 61 74 61 20 29 3b 0a 20 20 61 73  t( aData );.  as
a540: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
a550: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 0a 20 20 61   || pDone );.  a
a560: 73 73 65 72 74 28 20 69 73 53 61 76 65 70 6e 74  ssert( isSavepnt
a570: 20 7c 7c 20 70 44 6f 6e 65 3d 3d 30 20 29 3b 0a   || pDone==0 );.
a580: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
a590: 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ts(jfd, offset, 
a5a0: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
a5b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
a5c0: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
a5d0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
a5e0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
a5f0: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
a600: 65 74 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21  et+4);.  if( rc!
a610: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
a620: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
a630: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a640: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a650: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
a660: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
a670: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
a680: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
a690: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
a6a0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
a6b0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
a6c0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
a6d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
a6e0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
a6f0: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
a700: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
a710: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
a720: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
a730: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
a740: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
a750: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
a760: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
a770: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
a780: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
a790: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
a7a0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
a7b0: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
a7c0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
a7d0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
a7e0: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
a7f0: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
a800: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
a810: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
a820: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a830: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
a840: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
a850: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 6f  ead32bits(jfd, o
a860: 66 66 73 65 74 2b 70 50 61 67 65 72 2d 3e 70 61  ffset+pPager->pa
a870: 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73 75 6d  geSize+4, &cksum
a880: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
a890: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
a8a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a8b0: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
a8c0: 21 69 73 53 61 76 65 70 6e 74 20 26 26 20 70 61  !isSavepnt && pa
a8d0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
a8e0: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
a8f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a900: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a910: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 6f   }.  }.  if( pDo
a920: 6e 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69  ne && (rc = sqli
a930: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 44 6f  te3BitvecSet(pDo
a940: 6e 65 2c 20 70 67 6e 6f 29 29 20 29 7b 0a 20 20  ne, pgno)) ){.  
a950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
a960: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a970: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
a980: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
a990: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
a9a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
a9b0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
a9c0: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
a9d0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
a9e0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
a9f0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
aa00: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
aa10: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
aa20: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
aa30: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
aa40: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
aa50: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
aa60: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
aa70: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
aa80: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
aa90: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
aaa0: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
aab0: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
aac0: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
aad0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
aae0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
aaf0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
ab00: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
ab10: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
ab20: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
ab30: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
ab40: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
ab50: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
ab60: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
ab70: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
ab80: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
ab90: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
aba0: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
abb0: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
abc0: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
abd0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
abe0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
abf0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
ac00: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
ac10: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
ac20: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
ac30: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ac40: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
ac50: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
ac60: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
ac70: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
ac80: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
ac90: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
aca0: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
acb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
acc0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
acd0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
ace0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
acf0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
ad00: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
ad10: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
ad20: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
ad30: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
ad40: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
ad50: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
ad60: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
ad70: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
ad80: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
ad90: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
ada0: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
adb0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
adc0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
add0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
ade0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
adf0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
ae00: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
ae10: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
ae20: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
ae30: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
ae40: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
ae50: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
ae60: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
ae70: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
ae80: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
ae90: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
aea0: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
aeb0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
aec0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
aed0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
aee0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
aef0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
af00: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
af10: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
af20: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
af30: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
af40: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
af50: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
af60: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
af70: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
af80: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
af90: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
afa0: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
afb0: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
afc0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
afd0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
afe0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
aff0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
b000: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
b010: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
b020: 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  c==0..  **.  ** 
b030: 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65  2008-04-14:  Whe
b040: 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  n attempting to 
b050: 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74  vacuum a corrupt
b060: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
b070: 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
b080: 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74  ble to fail a st
b090: 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74  atement on a dat
b0a0: 61 62 61 73 65 20 74 68 61 74 20 64 6f 65 73 20  abase that does 
b0b0: 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20  not yet exist.. 
b0c0: 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d   ** Do not attem
b0d0: 70 74 20 74 6f 20 77 72 69 74 65 20 69 66 20 64  pt to write if d
b0e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
b0f0: 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e   never been open
b100: 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  ed..  */.  pPg =
b110: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
b120: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
b130: 41 47 45 52 54 52 41 43 45 35 28 22 50 4c 41 59  AGERTRACE5("PLAY
b140: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
b150: 68 61 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22  hash(%08x) %s\n"
b160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b170: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
b180: 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
b190: 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
b1a0: 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c  ageSize, aData),
b1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b1c0: 28 69 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69  (isMainJrnl?"mai
b1d0: 6e 2d 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d  n-journal":"sub-
b1e0: 6a 6f 75 72 6e 61 6c 22 29 0a 20 20 29 3b 0a 20  journal").  );. 
b1f0: 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
b200: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
b210: 53 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67  SIVE).   && (pPg
b220: 3d 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e  ==0 || 0==(pPg->
b230: 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
b240: 5f 53 59 4e 43 29 29 0a 20 20 20 26 26 20 28 70  _SYNC)).   && (p
b250: 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
b260: 6f 64 73 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  ods).  ){.    i6
b270: 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f 2d 31  4 ofst = (pgno-1
b280: 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
b290: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  ageSize;.    rc 
b2a0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
b2b0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
b2c0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
b2d0: 53 69 7a 65 2c 20 6f 66 73 74 29 3b 0a 20 20 7d  Size, ofst);.  }
b2e0: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
b2f0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
b300: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
b310: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
b320: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
b330: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
b340: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
b350: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
b360: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
b370: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
b380: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
b390: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
b3a0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
b3b0: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
b3c0: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
b3d0: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
b3e0: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
b3f0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
b400: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
b410: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
b420: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
b430: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
b440: 3b 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50  ;.    pData = pP
b450: 67 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65  g->pData;.    me
b460: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
b470: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
b480: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
b490: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
b4a0: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
b4b0: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 29 3b  >xReiniter(pPg);
b4c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
b4d0: 73 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69  sMainJrnl && (!i
b4e0: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 50 61 67  sSavepnt || pPag
b4f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 3d  er->journalOff<=
b500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
b510: 64 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  dr) ){.      /* 
b520: 49 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  If the contents 
b530: 6f 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72  of this page wer
b540: 65 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20  e just restored 
b550: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20  from the main . 
b560: 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
b570: 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63  file, then its c
b580: 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61  ontent must be a
b590: 73 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e  s they were when
b5a0: 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74   the .      ** t
b5b0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66  ransaction was f
b5c0: 69 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20  irst opened. In 
b5d0: 74 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e  this case we can
b5e0: 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20   mark the page. 
b5f0: 20 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e       ** as clean
b600: 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69  , since there wi
b610: 6c 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f  ll be no need to
b620: 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
b630: 20 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20   the..      **. 
b640: 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73       ** There is
b650: 20 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74   one exception t
b660: 6f 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20  o this rule. If 
b670: 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
b680: 67 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a  g rolled.      *
b690: 2a 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f  * back as part o
b6a0: 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f  f a savepoint (o
b6b0: 72 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c  r statement) rol
b6c0: 6c 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20  lback from an . 
b6d0: 20 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64       ** unsynced
b6e0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
b6f0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  main journal fil
b700: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  e, then it is no
b710: 74 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20  t safe.      ** 
b720: 74 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  to mark the page
b730: 20 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20   as clean. This 
b740: 69 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69  is because marki
b750: 6e 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20  ng the page as. 
b760: 20 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69       ** clean wi
b770: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48  ll clear the PGH
b780: 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61  DR_NEED_SYNC fla
b790: 67 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  g. Since the pag
b7a0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c  e is.      ** al
b7b0: 72 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75  ready in the jou
b7c0: 72 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72  rnal file (recor
b7d0: 64 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e  ded in Pager.pIn
b7e0: 4a 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20  Journal) and.   
b7f0: 20 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f     ** the PGHDR_
b800: 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
b810: 73 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68  s cleared, if th
b820: 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
b830: 6e 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67  n to.      ** ag
b840: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20  ain within this 
b850: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20  transaction, it 
b860: 77 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61  will be marked a
b870: 73 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20  s dirty but.    
b880: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
b890: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69  EED_SYNC flag wi
b8a0: 6c 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49  ll not be set. I
b8b0: 74 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74  t could then pot
b8c0: 65 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a  entially.      *
b8d0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  * be written out
b8e0: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
b8f0: 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69  se file before i
b900: 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  ts journal file.
b910: 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74        ** segment
b920: 20 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61   is synced. If a
b930: 20 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75   crash occurs du
b940: 72 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  ring or followin
b950: 67 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a  g this,.      **
b960: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
b970: 74 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a  tion may ensue..
b980: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
b990: 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
b9a0: 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
b9b0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
b9c0: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
b9d0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
b9e0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
b9f0: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
ba00: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
ba10: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
ba20: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
ba30: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
ba40: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
ba50: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
ba60: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
ba70: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
ba80: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
ba90: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
baa0: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
bab0: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
bac0: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
bad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
bae0: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
baf0: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
bb00: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
bb10: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
bb20: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20  ->pgno, 3);.    
bb30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
bb40: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
bb50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bb60: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
bb70: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
bb80: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
bb90: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
bba0: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
bbb0: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
bbc0: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
bbd0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
bbe0: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
bbf0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
bc00: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
bc10: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
bc20: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
bc30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bc40: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
bc50: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
bc60: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d  *.** Argument zM
bc70: 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20  aster may point 
bc80: 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61  to Pager.pTmpSpa
bc90: 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66  ce. So that buff
bca0: 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76  er is not .** av
bcb0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20  ailable for use 
bcc0: 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
bcd0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  tion..**.**.** T
bce0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
bcf0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
bd00: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
bd10: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
bd20: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
bd30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
bd40: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
bd50: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
bd60: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
bd70: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
bd80: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
bd90: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
bda0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
bdb0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
bdc0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
bdd0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
bde0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
bdf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
be00: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 50  ager_delmaster(P
be10: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
be20: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
be30: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  r){.  sqlite3_vf
be40: 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72  s *pVfs = pPager
be50: 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63  ->pVfs;.  int rc
be60: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
be70: 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  pen = 0;.  sqlit
be80: 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
be90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
bea0: 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63 68   *pJournal;.  ch
beb0: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
bec0: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
bed0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
bee0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
bef0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
bf00: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
bf10: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
bf20: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
bf30: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
bf40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
bf50: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
bf60: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
bf70: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
bf80: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
bf90: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
bfa0: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
bfb0: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
bfc0: 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d    */.  pMaster =
bfd0: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
bfe0: 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 70  )sqlite3Malloc(p
bff0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
c000: 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
c010: 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
c020: 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
c030: 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
c040: 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
c050: 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
c060: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
c070: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 66  }else{.    int f
c080: 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f  lags = (SQLITE_O
c090: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c  PEN_READONLY|SQL
c0a0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
c0b0: 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63  JOURNAL);.    rc
c0c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
c0d0: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
c0e0: 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73 2c 20  pMaster, flags, 
c0f0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
c100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c110: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
c120: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
c130: 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 1;..  rc = sql
c140: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
c150: 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  Master, &nMaster
c160: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
c170: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
c180: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
c190: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
c1a0: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
c1b0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
c1c0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
c1d0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20  sterPtr = 0;.   
c1e0: 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20   int nMasterPtr 
c1f0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  = pPager->pVfs->
c200: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20  mxPathname+1;.. 
c210: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
c220: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
c230: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
c240: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
c250: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
c260: 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  3_malloc() and p
c270: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
c280: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
c290: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
c2a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
c2b0: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  *)sqlite3Malloc(
c2c0: 28 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72  (int)nMasterJour
c2d0: 6e 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72  nal + nMasterPtr
c2e0: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
c2f0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
c300: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c310: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
c320: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
c330: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74  .    }.    zMast
c340: 65 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72  erPtr = &zMaster
c350: 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a  Journal[nMasterJ
c360: 6f 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20  ournal];.    rc 
c370: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
c380: 70 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  pMaster, zMaster
c390: 4a 6f 75 72 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d  Journal, (int)nM
c3a0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 30 29  asterJournal, 0)
c3b0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c3c0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
c3d0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
c3e0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
c3f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
c400: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
c410: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
c420: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
c430: 6c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  l ){.      int e
c440: 78 69 73 74 73 3b 0a 20 20 20 20 20 20 72 63 20  xists;.      rc 
c450: 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
c460: 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  s(pVfs, zJournal
c470: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  , SQLITE_ACCESS_
c480: 45 58 49 53 54 53 2c 20 26 65 78 69 73 74 73 29  EXISTS, &exists)
c490: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c4a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c4b0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
c4c0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
c4d0: 0a 20 20 20 20 20 20 69 66 28 20 65 78 69 73 74  .      if( exist
c4e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  s ){.        /* 
c4f0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
c500: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
c510: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
c520: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
c530: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
c540: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
c550: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
c560: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
c570: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
c580: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
c590: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
c5a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
c5b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
c5c0: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
c5d0: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
c5e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
c5f0: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
c600: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
c610: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
c620: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
c630: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
c640: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
c650: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
c660: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c670: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
c680: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
c690: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
c6a0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
c6b0: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
c6c0: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
c6d0: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
c6e0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
c6f0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
c700: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c710: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
c720: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
c730: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
c740: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
c750: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
c760: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
c770: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
c780: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
c790: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
c7a0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
c7b0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
c7c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c7d0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
c7e0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
c7f0: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
c800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
c810: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69  Journal += (sqli
c820: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75  te3Strlen30(zJou
c830: 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a  rnal)+1);.    }.
c840: 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71    }.  .  rc = sq
c850: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
c860: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
c870: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
c880: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
c890: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
c8a0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65  ite3_free(zMaste
c8b0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20  rJournal);.  }  
c8c0: 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70  .  if( master_op
c8d0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
c8e0: 33 4f 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72  3OsClose(pMaster
c8f0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c900: 5f 66 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  _free(pMaster);.
c910: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c920: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
c930: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
c940: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
c950: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
c960: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
c970: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
c980: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
c990: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
c9a0: 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75  icated. Also tru
c9b0: 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64  ncate the cached
c9c0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
c9d0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  of the file..**.
c9e0: 2a 2a 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62  ** Might might b
c9f0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  e the case that 
ca00: 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
ca10: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
ca20: 20 6e 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20   nPage..** This 
ca30: 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
ca40: 65 78 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61  example, if we a
ca50: 72 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  re in the middle
ca60: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
ca70: 6e 0a 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65  n.** which has e
ca80: 78 74 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65  xtended the file
ca90: 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65   size and the ne
caa0: 77 20 70 61 67 65 73 20 61 72 65 20 73 74 69 6c  w pages are stil
cab0: 6c 20 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e  l all held.** in
cac0: 20 63 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20   cache, then an 
cad0: 49 4e 53 45 52 54 20 6f 72 20 55 50 44 41 54 45  INSERT or UPDATE
cae0: 20 64 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e   does a statemen
caf0: 74 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d  t rollback.  Som
cb00: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
cb10: 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
cb20: 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
cb30: 6e 66 75 73 65 64 20 69 66 20 79 6f 75 20 74 72  nfused if you tr
cb40: 79 20 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65  y to.** truncate
cb50: 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
cb60: 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
cb70: 67 65 72 20 74 68 61 6e 20 69 74 20 63 75 72 72  ger than it curr
cb80: 65 6e 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20  ently is,.** so 
cb90: 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73 65  detect this case
cba0: 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69 6e   and write a sin
cbb0: 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74 6f  gle zero byte to
cbc0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cbd0: 6e 65 77 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74  new.** file inst
cbe0: 65 61 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ead..*/.static i
cbf0: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
cc00: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
cc10: 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
cc20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
cc30: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
cc40: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
cc50: 58 43 4c 55 53 49 56 45 20 26 26 20 70 50 61 67  XCLUSIVE && pPag
cc60: 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
cc70: 20 29 7b 0a 20 20 20 20 69 36 34 20 63 75 72 72   ){.    i64 curr
cc80: 65 6e 74 53 69 7a 65 2c 20 6e 65 77 53 69 7a 65  entSize, newSize
cc90: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
cca0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
ccb0: 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65 6e  ger->fd, &curren
ccc0: 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77 53  tSize);.    newS
ccd0: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  ize = pPager->pa
cce0: 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67  geSize*(i64)nPag
ccf0: 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  e;.    if( rc==S
cd00: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72 72  QLITE_OK && curr
cd10: 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a 65  entSize!=newSize
cd20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 75   ){.      if( cu
cd30: 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69 7a  rrentSize>newSiz
cd40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
cd50: 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  = sqlite3OsTrunc
cd60: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
cd70: 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  newSize);.      
cd80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
cd90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
cda0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 22  te(pPager->fd, "
cdb0: 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31 29  ", 1, newSize-1)
cdc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cdd0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
cde0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
cdf0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
ce00: 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72  nPage;.    pager
ce10: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
ce20: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
ce30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
ce40: 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74 6f  ** Set the secto
ce50: 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67 69  rSize for the gi
ce60: 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a  ven pager..**.**
ce70: 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   The sector size
ce80: 20 69 73 20 61 74 20 6c 65 61 73 74 20 61 73 20   is at least as 
ce90: 62 69 67 20 61 73 20 74 68 65 20 73 65 63 74 6f  big as the secto
cea0: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
ceb0: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
cec0: 65 63 74 6f 72 53 69 7a 65 28 29 2e 20 20 54 68  ectorSize().  Th
ced0: 65 20 6d 69 6e 69 6d 75 6d 20 73 65 63 74 6f 72  e minimum sector
cee0: 20 73 69 7a 65 20 69 73 20 35 31 32 2e 0a 2a 2f   size is 512..*/
cef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
cf00: 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
cf10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73   *pPager){.  ass
cf20: 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
cf30: 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
cf40: 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
cf50: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
cf60: 46 69 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53  File ){.    /* S
cf70: 65 63 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e  ector size doesn
cf80: 27 74 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65  't matter for te
cf90: 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41  mporary files. A
cfa0: 6c 73 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20  lso, the file.  
cfb0: 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76    ** may not hav
cfc0: 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65  e been opened ye
cfd0: 74 2c 20 69 6e 20 77 68 63 69 68 20 63 61 73 65  t, in whcih case
cfe0: 20 74 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a   the OsSectorSiz
cff0: 65 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20  e().    ** call 
d000: 77 69 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20  will segfault.. 
d010: 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
d020: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73  ->sectorSize = s
d030: 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
d040: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
d050: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
d060: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 35 31 32  ->sectorSize<512
d070: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
d080: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 35 31 32  sectorSize = 512
d090: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
d0a0: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
d0b0: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
d0c0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
d0d0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
d0e0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
d0f0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
d100: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
d110: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
d120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
d130: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
d140: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
d150: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
d160: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
d170: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
d180: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
d190: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
d1a0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
d1b0: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
d1c0: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
d1d0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
d1e0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
d1f0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
d200: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
d210: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
d220: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
d230: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
d240: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
d250: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
d260: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
d270: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
d280: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
d290: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
d2a0: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
d2b0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
d2c0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
d2d0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
d2e0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
d2f0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
d300: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
d310: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
d320: 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
d330: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
d340: 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 2e  the sector size.
d350: 20 20 54 68 65 20 68 65 61 64 65 72 0a 2a 2a 20    The header.** 
d360: 20 20 20 20 20 20 69 73 20 74 68 69 73 20 6d 61        is this ma
d370: 6e 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ny bytes in size
d380: 2e 0a 2a 2a 20 20 28 36 29 20 20 34 20 62 79 74  ..**  (6)  4 byt
d390: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
d3a0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
d3b0: 65 20 70 61 67 65 20 63 61 73 65 2e 0a 2a 2a 20  e page case..** 
d3c0: 20 28 37 29 20 20 34 20 62 79 74 65 20 69 6e 74   (7)  4 byte int
d3d0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
d3e0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
d3f0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
d400: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
d410: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
d420: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
d430: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
d440: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
d450: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
d460: 2e 29 0a 2a 2a 20 20 28 38 29 20 20 4e 20 62 79  .).**  (8)  N by
d470: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
d480: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
d490: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
d4a0: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
d4b0: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
d4c0: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
d4d0: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
d4e0: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
d4f0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
d500: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
d510: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
d520: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
d530: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
d540: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
d550: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
d560: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
d570: 2d 38 2e 0a 2a 2a 20 20 28 39 29 20 20 5a 65 72  -8..**  (9)  Zer
d580: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
d590: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
d5a0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
d5b0: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
d5c0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
d5d0: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
d5e0: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
d5f0: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
d600: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
d610: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
d620: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
d630: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
d640: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
d650: 72 73 74 20 38 20 69 74 65 6d 73 20 61 62 6f 76  rst 8 items abov
d660: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
d670: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
d680: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
d690: 66 20 74 68 65 20 39 74 68 20 69 74 65 6d 2e 0a  f the 9th item..
d6a0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
d6b0: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
d6c0: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
d6d0: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
d6e0: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
d6f0: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
d700: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
d710: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
d720: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
d730: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
d740: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
d750: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
d760: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
d770: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
d780: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
d790: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
d7a0: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
d7b0: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
d7c0: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
d7d0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
d7e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
d7f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
d800: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
d810: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
d820: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
d830: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
d840: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
d850: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
d860: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
d870: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
d880: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
d890: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
d8a0: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
d8b0: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
d8c0: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
d8d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
d8e0: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
d8f0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
d900: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
d910: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
d920: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
d930: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
d940: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
d950: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
d960: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
d970: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
d980: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
d990: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
d9a0: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
d9b0: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
d9c0: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
d9d0: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
d9e0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
d9f0: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
da00: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
da10: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
da20: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
da30: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
da40: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
da50: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
da60: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
da70: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
da80: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
da90: 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
daa0: 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
dab0: 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
dac0: 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
dad0: 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
dae0: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
daf0: 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
db00: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
db10: 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
db20: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
db30: 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
db40: 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
db50: 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
db60: 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
db70: 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
db80: 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
db90: 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
dba0: 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
dbb0: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
dbc0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
dbd0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
dbe0: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
dbf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
dc00: 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73   int isHot){.  s
dc10: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
dc20: 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
dc30: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
dc50: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
dc60: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
dc70: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
dca0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
dcb0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20  al */.  u32 u;  
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcd0: 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
dce0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
dcf0: 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
dd00: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
dd10: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
dd20: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
dd30: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
dd50: 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
dd60: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
dd70: 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
dd80: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
dd90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
dda0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
ddb0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
ddc0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
ddd0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
dde0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
ddf0: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
de00: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
de10: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
de20: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
de30: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
de40: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
de50: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
de60: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
de70: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
de80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
de90: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
dea0: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
deb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
dec0: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
ded0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
dee0: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
def0: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
df00: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
df10: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
df20: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
df30: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
df40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
df50: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
df60: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
df70: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
df80: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
df90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
dfa0: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
dfb0: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
dfc0: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
dfd0: 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   */.  zMaster = 
dfe0: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
dff0: 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61  e;.  rc = readMa
e000: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
e010: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
e020: 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e  , pPager->pVfs->
e030: 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20  mxPathname+1);. 
e040: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e050: 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30 5d  OK && zMaster[0]
e060: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
e070: 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
e080: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49  s, zMaster, SQLI
e090: 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
e0a0: 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20 7a  , &res);.  }.  z
e0b0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69 66  Master = 0;.  if
e0c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e0d0: 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20 67  || !res ){.    g
e0e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
e0f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
e100: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
e110: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
e120: 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
e130: 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
e140: 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
e150: 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
e160: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
e170: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
e180: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
e190: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
e1a0: 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
e1b0: 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
e1c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
e1d0: 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
e1e0: 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
e1f0: 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
e200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
e210: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
e220: 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
e230: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
e240: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
e250: 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
e260: 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
e270: 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
e280: 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
e290: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
e2a0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
e2b0: 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
e2c0: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
e2d0: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
e2e0: 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
e2f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
e300: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
e310: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
e320: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e330: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
e340: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
e350: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
e360: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
e370: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
e380: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
e390: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
e3a0: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
e3b0: 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
e3c0: 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
e3d0: 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
e3e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
e3f0: 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
e400: 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
e410: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
e420: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
e430: 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
e440: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
e450: 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
e460: 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
e470: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
e480: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
e490: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
e4a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
e4b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
e4c0: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
e4d0: 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
e4e0: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
e4f0: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
e500: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
e510: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
e520: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
e530: 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
e540: 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
e550: 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
e560: 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
e570: 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
e580: 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
e590: 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
e5a0: 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
e5b0: 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
e5c0: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
e5d0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
e5e0: 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
e5f0: 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
e600: 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
e610: 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
e620: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
e630: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
e640: 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
e650: 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
e660: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
e670: 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
e680: 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
e690: 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
e6a0: 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a  t #2565..    */.
e6b0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
e6c0: 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
e6d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
e6e0: 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
e6f0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
e700: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e710: 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
e720: 20 3d 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20   = (int)((szJ - 
e730: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
e740: 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
e750: 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20  _SZ(pPager));.  
e760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
e770: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
e780: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
e790: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
e7a0: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
e7b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e7c0: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
e7d0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
e7e0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
e7f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
e800: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
e810: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
e820: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
e830: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
e840: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
e850: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e860: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
e870: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
e880: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
e890: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
e8a0: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
e8b0: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
e8c0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e8d0: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
e8e0: 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6e 52 65 63   for(u=0; u<nRec
e8f0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; u++){.      rc
e900: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
e910: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
e920: 72 2c 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  r, 1, pPager->jo
e930: 75 72 6e 61 6c 4f 66 66 2c 20 30 2c 20 30 29 3b  urnalOff, 0, 0);
e940: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
e950: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e960: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e970: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
e980: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e990: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
e9a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e9b0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
e9c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e9d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e9e0: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
e9f0: 75 6e 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61  unable to rollba
ea00: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ck, then the dat
ea10: 61 62 61 73 65 20 69 73 20 70 72 6f 62 61 62 6c  abase is probabl
ea20: 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 67  y.          ** g
ea30: 6f 69 6e 67 20 74 6f 20 65 6e 64 20 75 70 20 62  oing to end up b
ea40: 65 69 6e 67 20 63 6f 72 72 75 70 74 2e 20 20 49  eing corrupt.  I
ea50: 74 20 69 73 20 63 6f 72 72 75 70 74 20 74 6f 20  t is corrupt to 
ea60: 75 73 2c 20 61 6e 79 68 6f 77 2e 0a 20 20 20 20  us, anyhow..    
ea70: 20 20 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73        ** Perhaps
ea80: 20 74 68 65 20 6e 65 78 74 20 70 72 6f 63 65 73   the next proces
ea90: 73 20 74 6f 20 63 6f 6d 65 20 61 6c 6f 6e 67 20  s to come along 
eaa0: 63 61 6e 20 66 69 78 20 69 74 2e 2e 2e 2e 0a 20  can fix it..... 
eab0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
eac0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ead0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
eae0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
eaf0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
eb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
eb10: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54     }.  }.  /*NOT
eb20: 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65  REACHED*/.  asse
eb30: 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c  rt( 0 );..end_pl
eb40: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
eb50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
eb60: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
eb70: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
eb80: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
eb90: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
eba0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
ebb0: 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
ebc0: 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
ebd0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
ebe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
ebf0: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
ec00: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
ec10: 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27  zMaster[0]!='\0'
ec20: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
ec30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
ec40: 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
ec50: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
ec60: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
ec70: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
ec80: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
ec90: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
eca0: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
ecb0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
ecc0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
ecd0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
ece0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
ecf0: 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
ed00: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a   zMaster);.  }..
ed10: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
ed20: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
ed30: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
ed40: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
ed50: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
ed60: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
ed70: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
ed80: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
ed90: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
eda0: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
edb0: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
edc0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
edd0: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
ede0: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
edf0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
ee00: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
ee10: 79 62 61 63 6b 20 61 20 73 61 76 65 70 6f 69 6e  yback a savepoin
ee20: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
ee30: 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61   pagerPlaybackSa
ee40: 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  vepoint(Pager *p
ee50: 50 61 67 65 72 2c 20 50 61 67 65 72 53 61 76 65  Pager, PagerSave
ee60: 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
ee70: 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ee90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
eea0: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
eeb0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
eec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
eed0: 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74  of first segment
eee0: 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c   of main-journal
eef0: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 50 67   records */.  Pg
ef00: 6e 6f 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  no ii;          
ef10: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ef20: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
ef30: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
ef40: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
ef50: 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ode */.  Bitvec 
ef60: 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20  *pDone = 0;     
ef70: 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65    /* Bitvec to e
ef80: 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61 79  nsure pages play
ef90: 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63  ed back only onc
efa0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
efb0: 61 74 65 20 61 20 62 69 74 76 65 63 20 74 6f 20  ate a bitvec to 
efc0: 75 73 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  use to store the
efd0: 20 73 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f   set of pages ro
efe0: 6c 6c 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69  lled back */.  i
eff0: 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  f( pSavepoint ){
f000: 0a 20 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c  .    pDone = sql
f010: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
f020: 28 70 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72  (pSavepoint->nOr
f030: 69 67 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44  ig);.    if( !pD
f040: 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  one ){.      ret
f050: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
f070: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
f080: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
f090: 74 68 65 20 73 69 7a 65 20 69 74 20 77 61 73 20  the size it was 
f0a0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
f0b0: 20 73 61 76 65 70 6f 69 6e 74 20 62 65 69 6e 67   savepoint being
f0c0: 20 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70   reverted was op
f0d0: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ened..  */.  rc 
f0e0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
f0f0: 28 70 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f  (pPager, pSavepo
f100: 69 6e 74 3f 70 53 61 76 65 70 6f 69 6e 74 2d 3e  int?pSavepoint->
f110: 6e 4f 72 69 67 3a 70 50 61 67 65 72 2d 3e 6f 72  nOrig:pPager->or
f120: 69 67 44 62 53 69 7a 65 29 3b 0a 20 20 61 73 73  igDbSize);.  ass
f130: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
f140: 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
f150: 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f   );..  /* Now ro
f160: 6c 6c 20 62 61 63 6b 20 61 6c 6c 20 6d 61 69 6e  ll back all main
f170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 65   journal file re
f180: 63 6f 72 64 73 20 74 68 61 74 20 6f 63 63 75 72  cords that occur
f190: 20 61 66 74 65 72 20 62 79 74 65 0a 20 20 2a 2a   after byte.  **
f1a0: 20 62 79 74 65 20 6f 66 66 73 65 74 20 50 61 67   byte offset Pag
f1b0: 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
f1c0: 73 65 74 20 74 68 61 74 20 68 61 76 65 20 61 20  set that have a 
f1d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6c 65 73 73  page number less
f1e0: 20 74 68 61 6e 0a 20 20 2a 2a 20 6f 72 20 65 71   than.  ** or eq
f1f0: 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76 65  ual to PagerSave
f200: 70 6f 69 6e 74 2e 6e 4f 72 69 67 2e 20 41 73 20  point.nOrig. As 
f210: 65 61 63 68 20 72 65 63 6f 72 64 20 69 73 20 70  each record is p
f220: 6c 61 79 65 64 20 62 61 63 6b 2c 0a 20 20 2a 2a  layed back,.  **
f230: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
f240: 6e 67 20 62 69 74 20 69 6e 20 62 69 74 76 65 63  ng bit in bitvec
f250: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
f260: 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 69 73 20  pInSavepoint is 
f270: 0a 20 20 2a 2a 20 63 6c 65 61 72 65 64 2e 0a 20  .  ** cleared.. 
f280: 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67   */.  szJ = pPag
f290: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
f2a0: 20 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74    if( pSavepoint
f2b0: 20 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20   ){.    iHdrOff 
f2c0: 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48  = pSavepoint->iH
f2d0: 64 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65  drOffset ? pSave
f2e0: 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65  point->iHdrOffse
f2f0: 74 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61  t : szJ;.    pPa
f300: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
f310: 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f  = pSavepoint->iO
f320: 66 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65  ffset;.    while
f330: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f340: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
f350: 61 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b  alOff<iHdrOff ){
f360: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
f370: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
f380: 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 70  age(pPager, 1, p
f390: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
f3a0: 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
f3b0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
f3c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
f3d0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
f3e0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
f3f0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  lOff = 0;.  }.  
f400: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
f410: 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
f420: 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29  journalOff<szJ )
f430: 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
f440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
f450: 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
f460: 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
f470: 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
f480: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
f490: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
f4a0: 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
f4b0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
f4c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
f4d0: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
f4e0: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
f4f0: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
f500: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
f510: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
f520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
f530: 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  ii=0; rc==SQLITE
f540: 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20  _OK && ii<nJRec 
f550: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
f560: 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29  alOff<szJ; ii++)
f570: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
f580: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
f590: 70 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20  page(pPager, 1, 
f5a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f5b0: 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  ff, 1, pDone);. 
f5c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
f5d0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
f5e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
f5f0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
f600: 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K || pPager->jou
f610: 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b 0a  rnalOff==szJ );.
f620: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 62  .  /* Now roll b
f630: 61 63 6b 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ack pages from t
f640: 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
f650: 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70 6f  */.  if( pSavepo
f660: 69 6e 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  int ){.    for(i
f670: 69 3d 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 53  i=pSavepoint->iS
f680: 75 62 52 65 63 3b 20 72 63 3d 3d 53 51 4c 49 54  ubRec; rc==SQLIT
f690: 45 5f 4f 4b 20 26 26 20 69 69 3c 70 50 61 67 65  E_OK && ii<pPage
f6a0: 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 20 69 69 2b  r->stmtNRec; ii+
f6b0: 2b 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66  +){.      i64 of
f6c0: 66 73 65 74 20 3d 20 69 69 2a 28 34 2b 70 50 61  fset = ii*(4+pPa
f6d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
f6e0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
f6f0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
f700: 67 65 28 70 50 61 67 65 72 2c 20 30 2c 20 6f 66  ge(pPager, 0, of
f710: 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  fset, 1, pDone);
f720: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
f730: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
f740: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
f750: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
f760: 72 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66  roy(pDone);.  if
f770: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f780: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
f790: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
f7a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
f7b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
f7c0: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
f7d0: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
f7e0: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
f7f0: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69   allowed..*/.voi
f800: 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
f810: 74 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72  tCachesize(Pager
f820: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78   *pPager, int mx
f830: 50 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Page){.  sqlite3
f840: 50 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69  PcacheSetCachesi
f850: 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
f860: 68 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a  he, mxPage);.}..
f870: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
f880: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
f890: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
f8a0: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
f8b0: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
f8c0: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
f8d0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
f8e0: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
f8f0: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
f900: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
f910: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
f920: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
f930: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
f940: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
f950: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
f960: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
f970: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
f980: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
f990: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
f9a0: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
f9b0: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
f9c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
f9d0: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
f9e0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
f9f0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
fa00: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
fa10: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
fa20: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
fa30: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
fa40: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
fa50: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
fa60: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
fa70: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
fa90: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
faa0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
fab0: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
fac0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
fad0: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
fae0: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
faf0: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
fb00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
fb10: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
fb20: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
fb30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
fb40: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
fb50: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
fb60: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
fb70: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
fb90: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
fba0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fbb0: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
fbc0: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
fbd0: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
fbe0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
fbf0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
fc00: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
fc10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
fc20: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
fc30: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
fc40: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
fc50: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
fc60: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
fc70: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
fc80: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
fca0: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
fcb0: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
fcc0: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
fcd0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
fce0: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
fcf0: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
fd00: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
fd10: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
fd20: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
fd30: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
fd40: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
fd50: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
fd60: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
fd70: 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
fd80: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
fd90: 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
fda0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66  lite3PagerSetSaf
fdb0: 65 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a  etyLevel(Pager *
fdc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
fdd0: 6c 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e  l, int bFullFsyn
fde0: 63 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  c){.  pPager->no
fdf0: 53 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d  Sync =  (level==
fe00: 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  1 || pPager->tem
fe10: 70 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70  pFile) ?1:0;.  p
fe20: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
fe30: 3d 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21  = (level==3 && !
fe40: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
fe50: 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
fe60: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28  ->sync_flags = (
fe70: 62 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54  bFullFsync?SQLIT
fe80: 45 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49  E_SYNC_FULL:SQLI
fe90: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b  TE_SYNC_NORMAL);
fea0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
feb0: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
fec0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
fed0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
fee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
fef0: 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69  al variable is i
ff00: 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65  ncremented whene
ff10: 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a  ver the library.
ff20: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f  ** attempts to o
ff30: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
ff40: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f  file.  This info
ff50: 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
ff60: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61  for.** testing a
ff70: 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
ff80: 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .  .*/.#ifdef SQ
ff90: 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
ffa0: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
ffb0: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
ffc0: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74  ../*.** Open a t
ffd0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a  emporary file. .
ffe0: 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  **.** Write the 
fff0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10000 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
10010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
10020 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
10030 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
10040 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54  de if we fail. T
10050 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
10060 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
10070 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  the temporary.**
10080 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
10090 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
100a0 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
100b0 67 65 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50  gerOpentemp(.  P
100c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
100d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
100e0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  r object */.  sq
100f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
10100 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  e,  /* Write the
10110 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
10120 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76   here */.  int v
10130 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
10140 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
10150 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
10160 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  VFS */.){.  int 
10170 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
10180 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
10190 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
101a0 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72  ++;  /* Used for
101b0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
101c0 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65  lysis only */.#e
101d0 6e 64 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73  ndif..  vfsFlags
101e0 20 7c 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   |=  SQLITE_OPEN
101f0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
10200 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
10210 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  |.            SQ
10220 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
10230 49 56 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE | SQLITE_OPE
10240 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b  N_DELETEONCLOSE;
10250 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
10260 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56  sOpen(pPager->pV
10270 66 73 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66  fs, 0, pFile, vf
10280 73 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73  sFlags, 0);.  as
10290 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
102a0 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d  _OK || pFile->pM
102b0 65 74 68 6f 64 73 20 29 3b 0a 20 20 72 65 74 75  ethods );.  retu
102c0 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
102d0 20 69 6e 74 20 70 61 67 65 72 53 74 72 65 73 73   int pagerStress
102e0 28 76 6f 69 64 20 2a 2c 50 67 48 64 72 20 2a 29  (void *,PgHdr *)
102f0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  ;../*.** Create 
10300 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
10310 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
10320 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
10330 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
10340 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
10350 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
10360 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
10370 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
10380 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
10390 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
103a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
103b0 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
103c0 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
103d0 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
103e0 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
103f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
10400 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ()..**.** If zFi
10410 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74  lename is NULL t
10420 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e  hen a randomly-n
10430 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66  amed temporary f
10440 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ile is created.*
10450 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68  * and used as th
10460 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63  e file to be cac
10470 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77  hed.  The file w
10480 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a  ill be deleted.*
10490 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
104a0 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
104b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
104c0 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
104d0 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66  y:" then all inf
104e0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
104f0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74   in cache..** It
10500 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65   is never writte
10510 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73  n to disk.  This
10520 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
10530 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20  implement an.** 
10540 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
10550 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
10560 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 73  e3PagerOpen(.  s
10570 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
10580 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ,       /* The v
10590 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73 74  irtual file syst
105a0 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 50  em to use */.  P
105b0 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20  ager **ppPager, 
105c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
105d0 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  n the Pager stru
105e0 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
105f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
10600 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65  ename,   /* Name
10610 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10620 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f   file to open */
10630 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
10640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
10650 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e  xtra bytes appen
10660 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d  d to each in-mem
10670 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ory page */.  in
10680 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
10690 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
106a0 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73  controlling this
106b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 76   file */.  int v
106c0 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
106d0 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70 61 73      /* flags pas
106e0 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73  sed through to s
106f0 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e  qlite3_vfs.xOpen
10700 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  () */.){.  u8 *p
10710 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  Ptr;.  Pager *pP
10720 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ager = 0;.  int 
10730 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10740 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
10750 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
10760 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
10770 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
10780 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
10790 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
107a0 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
107b0 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
107c0 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
107d0 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
107e0 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74 20 6a  OCK)!=0;.  int j
107f0 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 3b 0a  ournalFileSize;.
10800 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a 65    int pcacheSize
10810 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
10820 53 69 7a 65 28 29 3b 0a 20 20 69 6e 74 20 73 7a  Size();.  int sz
10830 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49 54  PageDflt = SQLIT
10840 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
10850 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
10860 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  thname = 0;.  in
10870 74 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  t nPathname = 0;
10880 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  ..  if( sqlite3J
10890 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
108a0 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
108b0 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
108c0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
108d0 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c  = sqlite3Journal
108e0 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65  Size(pVfs);.  }e
108f0 6c 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  lse{.    journal
10900 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74  FileSize = sqlit
10910 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65  e3MemJournalSize
10920 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  ();.  }..  /* Th
10930 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72 6e  e default return
10940 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
10950 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72  er */.  *ppPager
10960 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70   = 0;..  /* Comp
10970 75 74 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ute and store th
10980 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
10990 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74 65 64 20  in an allocated 
109a0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 20  buffer pointed. 
109b0 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61 74 68 6e   ** to by zPathn
109c0 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 50 61 74  ame, length nPat
109d0 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66 20 74 68  hname. Or, if th
109e0 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
109f0 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20 6c 65 61  y file,.  ** lea
10a00 76 65 20 62 6f 74 68 20 6e 50 61 74 68 6e 61 6d  ve both nPathnam
10a10 65 20 61 6e 64 20 7a 50 61 74 68 6e 61 6d 65 20  e and zPathname 
10a20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a 2f 0a 20  set to 0..  */. 
10a30 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
10a40 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  & zFilename[0] )
10a50 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20  {.    nPathname 
10a60 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
10a70 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61 74 68 6e  me+1;.    zPathn
10a80 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
10a90 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
10aa0 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68 6e  ;.    if( zPathn
10ab0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
10ac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10ad0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  MEM;.    }.#ifnd
10ae0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10af0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
10b00 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10b10 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
10b20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
10b30 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
10b40 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
10b50 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
10b60 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
10b70 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
10b80 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
10b90 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
10ba0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
10bb0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
10bc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10bd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
10be0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
10bf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10c00 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d  .    nPathname =
10c10 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10c20 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 7d  (zPathname);.  }
10c30 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10c40 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20 70  memory for the p
10c50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 2a  ager structure *
10c60 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c  /.  pPager = sql
10c70 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 0a  ite3MallocZero(.
10c80 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61 67      sizeof(*pPag
10c90 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
10ca0 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74 75  /* Pager structu
10cb0 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63 68 65  re */.    pcache
10cc0 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20 20 20  Size      +     
10cd0 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65 20        /* PCache 
10ce0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 6a 6f  object */.    jo
10cf0 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20  urnalFileSize + 
10d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10d10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74   journal file st
10d20 72 75 63 74 75 72 65 20 2a 2f 20 0a 20 20 20 20  ructure */ .    
10d30 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20  pVfs->szOsFile  
10d40 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  +           /* T
10d50 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
10d60 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
10d70 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
10d80 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
10d90 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
10da0 20 20 20 20 33 2a 6e 50 61 74 68 6e 61 6d 65 20      3*nPathname 
10db0 2b 20 34 30 20 20 20 20 20 20 20 20 20 20 20 20  + 40            
10dc0 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44  /* zFilename, zD
10dd0 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e  irectory, zJourn
10de0 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28  al */.  );.  if(
10df0 20 21 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20   !pPager ){.    
10e00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
10e10 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  thname);.    ret
10e20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10e30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
10e40 70 50 43 61 63 68 65 20 3d 20 28 50 43 61 63 68  pPCache = (PCach
10e50 65 20 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  e *)&pPager[1];.
10e60 20 20 70 50 74 72 20 3d 20 28 28 75 38 20 2a 29    pPtr = ((u8 *)
10e70 26 70 50 61 67 65 72 5b 31 5d 29 20 2b 20 70 63  &pPager[1]) + pc
10e80 61 63 68 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  acheSize;.  pPag
10e90 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
10ea0 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
10eb0 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
10ec0 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
10ed0 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
10ee0 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
10ef0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
10f00 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
10f10 46 69 6c 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  File];.  pPager-
10f20 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  >jfd = (sqlite3_
10f30 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73  file*)&pPtr[pVfs
10f40 2d 3e 73 7a 4f 73 46 69 6c 65 2b 6a 6f 75 72 6e  ->szOsFile+journ
10f50 61 6c 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  alFileSize];.  p
10f60 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
10f70 20 3d 20 28 63 68 61 72 2a 29 26 70 50 74 72 5b   = (char*)&pPtr[
10f80 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2b 32  pVfs->szOsFile+2
10f90 2a 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  *journalFileSize
10fa0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
10fb0 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
10fc0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 50 61  r->zFilename[nPa
10fd0 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61  thname+1];.  pPa
10fe0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
10ff0 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
11000 6f 72 79 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d  ory[nPathname+1]
11010 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73  ;.  pPager->pVfs
11020 20 3d 20 70 56 66 73 3b 0a 20 20 69 66 28 20 7a   = pVfs;.  if( z
11030 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
11040 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
11050 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Filename, zPathn
11060 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2b 31  ame, nPathname+1
11070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
11080 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
11090 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
110a0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
110b0 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
110c0 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
110d0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
110e0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
110f0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
11100 6e 61 6d 65 20 2d 20 28 69 6e 74 29 73 69 7a 65  name - (int)size
11110 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20  of("-journal")) 
11120 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
11130 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
11140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11150 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
11160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11170 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
11180 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
11190 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20  pPager->fd,.    
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
111c0 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
111d0 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20       readOnly = 
111e0 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
111f0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
11200 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
11210 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
11220 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
11230 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
11240 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ,.      ** choos
11250 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
11260 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
11270 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
11280 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
11290 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
112a0 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
112b0 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
112c0 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   of:.      **.  
112d0 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
112e0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
112f0 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20  SIZE,.      **  
11300 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
11310 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
11320 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
11330 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
11340 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
11350 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
11360 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
11370 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
11380 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11390 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
113a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
113b0 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73   iSectorSize = s
113c0 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
113d0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
113e0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 50 61          if( szPa
113f0 67 65 44 66 6c 74 3c 69 53 65 63 74 6f 72 53 69  geDflt<iSectorSi
11400 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
11410 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 53 65  szPageDflt = iSe
11420 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  ctorSize;.      
11430 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
11440 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
11450 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a  WRITE.        {.
11460 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
11470 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
11480 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11490 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
114a0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69            int ii
114b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
114c0 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
114d0 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e  ATOMIC512==(512>
114e0 3e 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >8));.          
114f0 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
11500 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28  CAP_ATOMIC64K==(
11510 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20  65536>>8));.    
11520 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c        assert(SQL
11530 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
11540 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36  PAGE_SIZE<=65536
11550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
11560 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
11570 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
11580 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
11590 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
115a0 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26          if( iDc&
115b0 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
115c0 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 20  OMIC|(ii>>8)) ) 
115d0 73 7a 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b  szPageDflt = ii;
115e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
115f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11600 20 20 20 20 20 20 69 66 28 20 73 7a 50 61 67 65        if( szPage
11610 44 66 6c 74 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Dflt>SQLITE_MAX_
11620 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
11630 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  E ){.          s
11640 7a 50 61 67 65 44 66 6c 74 20 3d 20 53 51 4c 49  zPageDflt = SQLI
11650 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
11660 41 47 45 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  AGE_SIZE;.      
11670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
11680 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
11690 2a 20 49 66 20 61 20 74 65 6d 70 6f 72 61 72 79  * If a temporary
116a0 20 66 69 6c 65 20 69 73 20 72 65 71 75 65 73 74   file is request
116b0 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 6f 70  ed, it is not op
116c0 65 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ened immediately
116d0 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
116e0 20 63 61 73 65 20 77 65 20 61 63 63 65 70 74 20   case we accept 
116f0 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65  the default page
11700 20 73 69 7a 65 20 61 6e 64 20 64 65 6c 61 79 20   size and delay 
11710 61 63 74 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20  actually.    ** 
11720 6f 70 65 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  opening the file
11730 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
11740 20 63 61 6c 6c 20 74 6f 20 4f 73 57 72 69 74 65   call to OsWrite
11750 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ()..    **.    *
11760 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
11770 20 61 6c 73 6f 20 72 75 6e 20 66 6f 72 20 61 6e   also run for an
11780 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
11790 61 73 65 2e 20 41 6e 20 69 6e 2d 6d 65 6d 6f 72  ase. An in-memor
117a0 79 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  y.    ** databas
117b0 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
117c0 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 74 68 61   a temp-file tha
117d0 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
117e0 65 6e 20 6f 75 74 20 74 6f 0a 20 20 20 20 2a 2a  en out to.    **
117f0 20 64 69 73 6b 20 61 6e 64 20 75 73 65 73 20 61   disk and uses a
11800 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 6f 6c 6c  n in-memory roll
11810 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  back journal..  
11820 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
11830 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
11840 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
11850 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
11860 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26  ..  if( pPager &
11870 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
11880 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
11890 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
118a0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 73 7a 50  e3PageMalloc(szP
118b0 61 67 65 44 66 6c 74 29 3b 0a 20 20 7d 0a 0a 20  ageDflt);.  }.. 
118c0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
118d0 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68 65  occured in eithe
118e0 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20  r of the blocks 
118f0 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65 65  above..  ** Free
11900 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
11910 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
11920 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53 69  he file..  ** Si
11930 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
11940 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
11950 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
11960 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
11970 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
11980 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
11990 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
119a0 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  !pPager->pTmpSpa
119b0 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ce ){.    sqlite
119c0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
119d0 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  >fd);.    sqlite
119e0 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b 0a  3_free(pPager);.
119f0 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
11a00 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
11a10 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
11a20 7d 0a 20 20 6e 45 78 74 72 61 20 3d 20 46 4f 52  }.  nExtra = FOR
11a30 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
11a40 74 72 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  tra);.  sqlite3P
11a50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50 61 67 65  cacheOpen(szPage
11a60 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c 20 21 6d  Dflt, nExtra, !m
11a70 65 6d 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  emDb,.          
11a80 20 20 20 20 20 20 20 20 20 20 21 6d 65 6d 44 62            !memDb
11a90 3f 70 61 67 65 72 53 74 72 65 73 73 3a 30 2c 20  ?pagerStress:0, 
11aa0 28 76 6f 69 64 20 2a 29 70 50 61 67 65 72 2c 20  (void *)pPager, 
11ab0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
11ac0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  ;..  PAGERTRACE3
11ad0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
11ae0 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70 50   FILEHANDLEID(pP
11af0 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67 65  ager->fd), pPage
11b00 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
11b10 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20   IOTRACE(("OPEN 
11b20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72  %p %s\n", pPager
11b30 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  , pPager->zFilen
11b40 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ame))..  /* Fill
11b50 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65 63   in Pager.zDirec
11b60 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  tory[] */.  memc
11b70 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
11b80 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e 7a  ctory, pPager->z
11b90 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
11ba0 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69 3d  ame+1);.  for(i=
11bb0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
11bc0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
11bd0 72 79 29 3b 20 0a 20 20 20 20 20 20 69 3e 30 20  ry); .      i>0 
11be0 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  && pPager->zDire
11bf0 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b  ctory[i-1]!='/';
11c00 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e   i--){}.  if( i>
11c10 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  0 ) pPager->zDir
11c20 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b  ectory[i-1] = 0;
11c30 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 50  ..  /* Fill in P
11c40 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d 20  ager.zJournal[] 
11c50 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  */.  if( zPathna
11c60 6d 65 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  me ){.    memcpy
11c70 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
11c80 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  l, pPager->zFile
11c90 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29  name, nPathname)
11ca0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50  ;.    memcpy(&pP
11cb0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
11cc0 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
11cd0 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 7d 65 6c  rnal", 9);.  }el
11ce0 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
11cf0 7a 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  zJournal = 0;.  
11d00 7d 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  }..  /* pPager->
11d10 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
11d20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   */.  pPager->us
11d30 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75  eJournal = (u8)u
11d40 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61  seJournal;.  pPa
11d50 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
11d60 3d 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26  = (noReadlock &&
11d70 20 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b   readOnly) ?1:0;
11d80 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
11d90 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20  mtOpen = 0; */. 
11da0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
11db0 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  InUse = 0; */.  
11dc0 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  /* pPager->nRef 
11dd0 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
11de0 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
11df0 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61  (u8)memDb;.  pPa
11e00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
11e10 73 7a 50 61 67 65 44 66 6c 74 3b 0a 20 20 2f 2a  szPageDflt;.  /*
11e20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
11e30 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
11e40 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
11e50 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
11e60 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
11e70 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78   */.  pPager->mx
11e80 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50  Page = 100;.  pP
11e90 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53  ager->mxPgno = S
11ea0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43  QLITE_MAX_PAGE_C
11eb0 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65  OUNT;.  /* pPage
11ec0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
11ed0 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73  _UNLOCK; */.  as
11ee0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
11ef0 61 74 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65  ate == (tempFile
11f00 20 3f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   ? PAGER_EXCLUSI
11f10 56 45 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43  VE : PAGER_UNLOC
11f20 4b 29 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65  K) );.  /* pPage
11f30 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
11f40 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
11f50 70 46 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70  pFile = (u8)temp
11f60 46 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20  File;.  assert( 
11f70 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
11f80 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
11f90 41 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AL .          ||
11fa0 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52   tempFile==PAGER
11fb0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
11fc0 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
11fd0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
11fe0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d  GMODE_EXCLUSIVE=
11ff0 3d 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  =1 );.  pPager->
12000 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
12010 28 75 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20  (u8)tempFile; . 
12020 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
12030 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20 70 50   (u8)memDb;.  pP
12040 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
12050 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b 0a 20   (u8)readOnly;. 
12060 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
12070 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
12080 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
12090 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  (pPager->tempFil
120a0 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
120b0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
120c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70 50 61  ->fullSync = pPa
120d0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31  ger->noSync ?0:1
120e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  ;.  pPager->sync
120f0 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  _flags = SQLITE_
12100 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f  SYNC_NORMAL;.  /
12110 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
12120 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
12130 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
12140 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  ed = 0; */.  /* 
12150 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
12160 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
12170 6e 45 78 74 72 61 20 3d 20 6e 45 78 74 72 61 3b  nExtra = nExtra;
12180 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
12190 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51  alSizeLimit = SQ
121a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55  LITE_DEFAULT_JOU
121b0 52 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b  RNAL_SIZE_LIMIT;
121c0 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
121d0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
121e0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 73 65 74  tempFile);.  set
121f0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
12200 72 29 3b 0a 20 20 69 66 28 20 6d 65 6d 44 62 20  r);.  if( memDb 
12210 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
12220 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47  ournalMode = PAG
12230 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d  ER_JOURNALMODE_M
12240 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  EMORY;.  }.  /* 
12250 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
12260 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  dler = 0; */.  /
12270 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  * pPager->pBusyH
12280 61 6e 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a  andlerArg = 0; *
12290 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50  /.  /* memset(pP
122a0 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
122b0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
122c0 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70  Hash)); */.  *pp
122d0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
122e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
122f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
12300 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12310 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
12320 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
12330 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a  SetBusyhandler(.
12340 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
12350 20 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48   .  int (*xBusyH
12360 61 6e 64 6c 65 72 29 28 76 6f 69 64 20 2a 29 2c  andler)(void *),
12370 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61  .  void *pBusyHa
12380 6e 64 6c 65 72 41 72 67 0a 29 7b 20 20 0a 20 20  ndlerArg.){  .  
12390 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
123a0 64 6c 65 72 20 3d 20 78 42 75 73 79 48 61 6e 64  dler = xBusyHand
123b0 6c 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ler;.  pPager->p
123c0 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 3d  BusyHandlerArg =
123d0 20 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67   pBusyHandlerArg
123e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
123f0 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
12400 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
12410 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
12420 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
12430 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
12440 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
12450 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
12460 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
12470 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
12480 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
12490 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
124a0 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
124b0 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
124c0 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
124d0 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
124e0 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
124f0 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
12500 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
12510 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
12520 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
12530 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
12540 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
12550 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
12560 62 50 61 67 65 2a 29 29 7b 0a 20 20 70 50 61 67  bPage*)){.  pPag
12570 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
12580 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
12590 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
125a0 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  ize to *pPageSiz
125b0 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73  e. If the sugges
125c0 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  t new page size 
125d0 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69  is.** inappropri
125e0 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
125f0 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
12600 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61  ze is set to tha
12610 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72  t.** value befor
12620 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
12630 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12640 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
12650 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
12660 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
12670 74 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65  t rc = pPager->e
12680 72 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63  rrCode;.  if( rc
12690 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
126a0 20 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20     u16 pageSize 
126b0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
126c0 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
126d0 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69  ze==0 || (pageSi
126e0 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
126f0 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
12700 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20  PAGE_SIZE) );.  
12710 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
12720 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
12730 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
12740 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d     && (pPager->m
12750 65 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65  emDb==0 || pPage
12760 72 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20  r->dbSize==0).  
12770 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61     && sqlite3Pca
12780 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
12790 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20  er->pPCache)==0 
127a0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68  .    ){.      ch
127b0 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72  ar *pNew = (char
127c0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61   *)sqlite3PageMa
127d0 6c 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a  lloc(pageSize);.
127e0 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20        if( !pNew 
127f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12820 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
12830 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
12840 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12850 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
12860 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
12870 2d 3e 6d 65 6d 44 62 20 29 20 73 65 74 53 65 63  ->memDb ) setSec
12880 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
12890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
128a0 50 61 67 65 46 72 65 65 28 70 50 61 67 65 72 2d  PageFree(pPager-
128b0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
128c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
128d0 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20  pSpace = pNew;. 
128e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63         sqlite3Pc
128f0 61 63 68 65 53 65 74 50 61 67 65 53 69 7a 65 28  acheSetPageSize(
12900 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
12910 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20   pageSize);.    
12920 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70    }.    }.    *p
12930 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  PageSize = (u16)
12940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12950 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
12970 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
12980 74 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70  the "temporary p
12990 61 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64  age" buffer held
129a0 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62   internally.** b
129b0 79 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  y the pager.  Th
129c0 69 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74  is is a buffer t
129d0 68 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67  hat is big enoug
129e0 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a  h to hold the.**
129f0 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20   entire content 
12a00 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
12a10 67 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72  ge.  This buffer
12a20 20 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61   is used interna
12a30 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f  lly.** during ro
12a40 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20  llback and will 
12a50 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  be overwritten w
12a60 68 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61  henever a rollba
12a70 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42  ck.** occurs.  B
12a80 75 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73  ut other modules
12a90 20 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65   are free to use
12aa0 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67   it too, as long
12ab0 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61   as.** no rollba
12ac0 63 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e  cks are happenin
12ad0 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  g..*/.void *sqli
12ae0 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
12af0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12b00 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
12b10 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a  r->pTmpSpace;.}.
12b20 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
12b30 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75  o set the maximu
12b40 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  m database page 
12b50 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20  count if mxPage 
12b60 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a  is positive. .**
12b70 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
12b80 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65   if mxPage is ze
12b90 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20  ro or negative. 
12ba0 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63   And never reduc
12bb0 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d  e the.** maximum
12bc0 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f   page count belo
12bd0 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  w the current si
12be0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
12bf0 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64  se..**.** Regard
12c00 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20  less of mxPage, 
12c10 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  return the curre
12c20 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  nt maximum page 
12c30 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
12c40 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67  lite3PagerMaxPag
12c50 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  eCount(Pager *pP
12c60 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
12c70 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
12c80 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
12c90 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
12ca0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50  ;.  }.  sqlite3P
12cb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
12cc0 61 67 65 72 2c 20 30 29 3b 0a 20 20 72 65 74 75  ager, 0);.  retu
12cd0 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  rn pPager->mxPgn
12ce0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12cf0 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66  following set of
12d00 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
12d10 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68  ed to disable th
12d20 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49  e simulated.** I
12d30 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69  /O error mechani
12d40 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69  sm.  These routi
12d50 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
12d60 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a  avoid simulated.
12d70 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61  ** errors in pla
12d80 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20  ces where we do 
12d90 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65  not care about e
12da0 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rrors..**.** Unl
12db0 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53  ess -DSQLITE_TES
12dc0 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  T=1 is used, the
12dd0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
12de0 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e  all no-ops.** an
12df0 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f  d generate no co
12e00 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  de..*/.#ifdef SQ
12e10 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e  LITE_TEST.extern
12e20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
12e30 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65  error_pending;.e
12e40 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
12e50 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
12e60 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64  static int saved
12e70 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62  _cnt;.void disab
12e80 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
12e90 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
12ea0 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
12eb0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
12ec0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
12ed0 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
12ee0 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
12ef0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12f00 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
12f10 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
12f20 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
12f30 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
12f40 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65  # define disable
12f50 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12f60 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20  rors().# define 
12f70 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
12f80 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e  _io_errors().#en
12f90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  dif../*.** Read 
12fa0 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
12fb0 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
12fc0 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
12fd0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
12fe0 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
12ff0 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20  s to. .**.** No 
13000 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69  error checking i
13010 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69  s done. The rati
13020 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73  onal for this is
13030 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
13040 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63  ion .** may be c
13050 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68  alled even if th
13060 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
13070 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
13080 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a   a header. In .*
13090 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73 71  * these cases sq
130a0 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77 69  lite3OsRead() wi
130b0 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  ll return an err
130c0 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65  or, to which the
130d0 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73   correct .** res
130e0 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f  ponse is to zero
130f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70   the memory at p
13100 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75  Dest and continu
13110 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72  e.  A real IO er
13120 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65  ror .** will pre
13130 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e  sumably recur an
13140 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c  d be picked up l
13150 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e  ater (Todo: Thin
13160 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a  k about this)..*
13170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
13180 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
13190 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
131a0 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
131b0 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
131c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
131d0 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  OK;.  memset(pDe
131e0 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61 73 73  st, 0, N);.  ass
131f0 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  ert(pPager->fd->
13200 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
13210 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
13220 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
13230 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
13240 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
13250 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
13260 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
13270 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
13280 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
13290 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
132a0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
132b0 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
132c0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
132d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
132e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
132f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
13300 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
13310 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
13320 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
13330 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
13340 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
13350 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
13360 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
13370 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
13380 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
13390 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
133a0 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
133b0 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
133c0 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
133d0 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
133e0 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
133f0 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
13400 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
13410 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
13420 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
13430 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
13440 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
13450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13460 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
13470 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
13480 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 69 36  t *pnPage){.  i6
13490 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 n = 0;.  int r
134a0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  c;.  assert( pPa
134b0 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
134c0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
134d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
134e0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
134f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13500 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13510 53 69 7a 65 56 61 6c 69 64 20 29 7b 0a 20 20 20  SizeValid ){.   
13520 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53   n = pPager->dbS
13530 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  ize;.  } else {.
13540 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
13550 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
13560 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  |pPager->tempFil
13570 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  e);.    if( (pPa
13580 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
13590 73 29 0a 20 20 20 20 20 26 26 20 28 72 63 20 3d  s).     && (rc =
135a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
135b0 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
135c0 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  n))!=SQLITE_OK )
135d0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  {.      pager_er
135e0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
135f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
13600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13610 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
13620 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
13630 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
13640 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
13650 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13670 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
13680 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
13690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
136a0 69 7a 65 20 3d 20 28 69 6e 74 29 6e 3b 0a 20 20  ize = (int)n;.  
136b0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
136c0 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  zeValid = 1;.   
136d0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d   }.  }.  if( n==
136e0 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  (PENDING_BYTE/pP
136f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
13700 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
13710 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e    if( n>pPager->
13720 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  mxPgno ){.    pP
13730 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28  ager->mxPgno = (
13740 50 67 6e 6f 29 6e 3b 0a 20 20 7d 0a 20 20 69 66  Pgno)n;.  }.  if
13750 28 20 70 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  ( pnPage ){.    
13760 2a 70 6e 50 61 67 65 20 3d 20 28 69 6e 74 29 6e  *pnPage = (int)n
13770 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
13780 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13790 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
137a0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
137b0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
137c0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
137d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
137e0 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
137f0 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
13800 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
13810 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
13820 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
13830 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
13840 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
13850 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
13860 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
13870 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
13880 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
13890 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
138a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
138b0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
138c0 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
138d0 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
138e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
138f0 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
13900 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
13910 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
13920 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
13930 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
13940 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
13950 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
13960 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
13970 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
13980 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
13990 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
139a0 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
139b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
139c0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
139d0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
139e0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
139f0 65 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  eTruncate(pPager
13a00 2d 3e 70 50 43 61 63 68 65 2c 20 70 50 61 67 65  ->pPCache, pPage
13a10 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  r->dbSize);.}../
13a20 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
13a30 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
13a40 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
13a50 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
13a60 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
13a70 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
13a80 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
13a90 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79  t until the busy
13aa0 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e   callback return
13ab0 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e  s.** false or un
13ac0 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  til the lock suc
13ad0 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
13ae0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
13af0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
13b00 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
13b10 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
13b20 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  * the lock..*/.s
13b30 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
13b40 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67  wait_on_lock(Pag
13b50 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
13b60 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
13b70 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f   rc;..  /* The O
13b80 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
13b90 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
13ba0 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
13bb0 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
13bc0 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
13bd0 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
13be0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
13bf0 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
13c00 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
13c10 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
13c20 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
13c30 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
13c40 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
13c50 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
13c60 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
13c70 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
13c80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
13c90 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
13ca0 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
13cb0 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
13cc0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  =0 );..  if( pPa
13cd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
13ce0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
13cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
13d00 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
13d10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13d20 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
13d30 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
13d40 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
13d50 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50 61  LITE_BUSY && pPa
13d60 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
13d70 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  r(pPager->pBusyH
13d80 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20 20  andlerArg) );.  
13d90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13da0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
13db0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75 38  ger->state = (u8
13dc0 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20  )locktype;.     
13dd0 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   IOTRACE(("LOCK 
13de0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
13df0 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20  , locktype)).   
13e00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
13e10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
13e20 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
13e30 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
13e40 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e  pages specified.
13e50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
13e60 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67  agerTruncate(Pag
13e70 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
13e80 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
13e90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13ea0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13eb0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
13ec0 41 52 45 44 20 29 3b 0a 0a 20 20 73 71 6c 69 74  ARED );..  sqlit
13ed0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
13ee0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 69  (pPager, 0);.  i
13ef0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
13f00 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
13f10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
13f20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67    }else if( nPag
13f30 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
13f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   ){.    rc = syn
13f50 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
13f60 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
13f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13f80 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
13f90 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
13fa0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
13fb0 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
13fc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
13fd0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
13fe0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
13ff0 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  LOCK);.    }.   
14000 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14010 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
14020 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
14030 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
14040 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
14050 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14060 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
14070 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
14080 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
14090 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
140a0 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
140b0 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
140c0 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
140d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
140e0 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
140f0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
14100 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
14110 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
14120 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
14130 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
14140 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
14150 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
14160 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
14170 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
14180 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
14190 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
141a0 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
141b0 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
141c0 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a  a coredump..**.*
141d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
141e0 61 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e  always succeeds.
141f0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
14200 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61  n is active an a
14210 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64  ttempt.** is mad
14220 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63  e to roll it bac
14230 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  k. If an error o
14240 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
14250 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20   rollback .** a 
14260 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  hot journal may 
14270 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  be left in the f
14280 69 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f  ilesystem but no
14290 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
142a0 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  ed.** to the cal
142b0 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ler..*/.int sqli
142c0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61  te3PagerClose(Pa
142d0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
142e0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
142f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
14300 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
14310 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14320 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
14330 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  = 0;.  pPager->e
14340 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30  xclusiveMode = 0
14350 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28  ;.  pager_reset(
14360 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
14370 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 61 67  MEMDB ){.    pag
14380 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
14390 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
143a0 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
143b0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
143c0 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
143d0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 50  ignMalloc();.  P
143e0 41 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53  AGERTRACE2("CLOS
143f0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
14400 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
14410 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
14420 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 69  n", pPager)).  i
14430 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
14440 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
14450 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
14460 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
14470 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
14480 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
14490 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 73 71 6c  nJournal);.  sql
144a0 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
144b0 79 28 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79  y(pPager->pAlway
144c0 73 52 6f 6c 6c 62 61 63 6b 29 3b 0a 20 20 72 65  sRollback);.  re
144d0 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
144e0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c  t(pPager);.  sql
144f0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
14500 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
14510 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
14520 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
14530 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
14540 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
14550 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
14560 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
14570 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
14580 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
14590 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  ..  sqlite3PageF
145a0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
145b0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
145c0 33 50 63 61 63 68 65 43 6c 6f 73 65 28 70 50 61  3PcacheClose(pPa
145d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
145e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
145f0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
14600 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
14610 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
14620 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
14630 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
14640 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
14650 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
14660 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
14670 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
14680 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
14690 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
146a0 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
146b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
146c0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
146d0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
146e0 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
146f0 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
14700 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
14710 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
14720 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
14730 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
14740 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  g){.  sqlite3Pca
14750 63 68 65 52 65 66 28 70 50 67 29 3b 0a 20 20 72  cheRef(pPg);.  r
14760 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
14780 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
14790 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b  other words, mak
147a0 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70  e sure all the p
147b0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a  ages that have.*
147c0 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  * been written t
147d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  o the journal ha
147e0 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63  ve actually reac
147f0 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20  hed the surface 
14800 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20  of the.** disk. 
14810 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   It is not safe 
14820 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72  to modify the or
14830 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14840 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72  file until after
14850 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
14860 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  has been synced.
14870 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61    If the origina
14880 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f  l database is mo
14890 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a  dified before.**
148a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
148b0 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77  synced and a pow
148c0 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
148d0 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  s, the unsynced 
148e0 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20  journal.** data 
148f0 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e  would be lost an
14900 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e  d we would be un
14910 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  able to complete
14920 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a  ly rollback the.
14930 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e  ** database chan
14940 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63  ges.  Database c
14950 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20  orruption would 
14960 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  occur..** .** Th
14970 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
14980 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63  updates the nRec
14990 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65   field in the he
149a0 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72  ader of the jour
149b0 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d  nal..** (See com
149c0 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67  ments on the pag
149d0 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
149e0 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
149f0 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
14a00 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e  .).** If the syn
14a10 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20  c mode is FULL, 
14a20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f  two syncs will o
14a30 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65  ccur.  First the
14a40 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a   whole journal.*
14a50 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65  * is synced, the
14a60 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
14a70 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65   is updated, the
14a80 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20  n a second sync 
14a90 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  occurs..**.** Fo
14aa0 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
14ab0 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74  bases, we do not
14ac0 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20   care if we are 
14ad0 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  able to rollback
14ae0 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65  .** after a powe
14af0 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 6e 6f  r failure, so no
14b00 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
14b10 0a 2a 2a 20 49 66 20 74 68 65 20 49 4f 43 41 50  .** If the IOCAP
14b20 5f 53 45 51 55 45 4e 54 49 41 4c 20 66 6c 61 67  _SEQUENTIAL flag
14b30 20 69 73 20 73 65 74 20 66 6f 72 20 74 68 65 20   is set for the 
14b40 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69 61  persistent media
14b50 20 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 74 68 65   on which.** the
14b60 20 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f   database is sto
14b70 72 65 64 2c 20 74 68 65 6e 20 4f 73 53 79 6e 63  red, then OsSync
14b80 28 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  () is never call
14b90 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
14ba0 6c 0a 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68  l.** file. In th
14bb0 69 73 20 63 61 73 65 20 61 6c 6c 20 74 68 61 74  is case all that
14bc0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 73 20   is required is 
14bd0 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 6e 52  to update the nR
14be0 65 63 20 66 69 65 6c 64 20 69 6e 0a 2a 2a 20 74  ec field in.** t
14bf0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
14c00 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
14c10 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
14c20 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
14c30 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
14c40 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
14c50 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
14c60 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
14c70 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
14c80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
14c90 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
14ca0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
14cb0 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
14cc0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
14cd0 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
14ce0 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
14cf0 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
14d00 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
14d10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
14d20 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
14d30 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
14d40 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
14d50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14d60 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41  >journalMode!=PA
14d70 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
14d80 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
14d90 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
14da0 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
14db0 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
14dc0 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
14dd0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14de0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
14df0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
14e00 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
14e10 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
14e20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
14e30 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
14e40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14e50 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
14e60 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
14e70 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
14e80 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
14e90 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
14ea0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
14eb0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
14ec0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
14ed0 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
14ee0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
14ef0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
14f00 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
14f10 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
14f20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
14f30 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e      ** This is n
14f40 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20 74  ot required if t
14f50 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65  he persistent me
14f60 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68 65  dia supports the
14f70 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45  .        ** SAFE
14f80 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
14f90 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68 69  . Because in thi
14fa0 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
14fb0 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20   possible .     
14fc0 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67     ** for garbag
14fd0 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70 70  e data to be app
14fe0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c  ended to the fil
14ff0 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  e, the nRec fiel
15000 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  d.        ** is 
15010 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 30  populated with 0
15020 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20 74  xFFFFFFFF when t
15030 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
15040 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20  r is written.   
15050 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65       ** and neve
15060 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  r needs to be up
15070 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  dated..        *
15080 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 72  /.        i64 jr
15090 6e 6c 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69  nlOff;.        i
150a0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
150b0 79 6e 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53  ync && 0==(iDc&S
150c0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
150d0 45 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20  ENTIAL) ){.     
150e0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
150f0 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
15100 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
15110 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
15120 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
15130 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67  SYNC %p\n", pPag
15140 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72  er)).          r
15150 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
15160 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
15170 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
15180 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
15190 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
151a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a   rc;.        }..
151b0 20 20 20 20 20 20 20 20 6a 72 6e 6c 4f 66 66 20          jrnlOff 
151c0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
151d0 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
151e0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20  ournalMagic);.  
151f0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
15200 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
15210 6e 22 2c 20 70 50 61 67 65 72 2c 20 6a 72 6e 6c  n", pPager, jrnl
15220 4f 66 66 2c 20 34 29 29 3b 0a 20 20 20 20 20 20  Off, 4));.      
15230 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
15240 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
15250 6a 72 6e 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d  jrnlOff, pPager-
15260 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
15270 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
15280 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
15290 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
152a0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
152b0 4e 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  NTIAL) ){.      
152c0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
152d0 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
152e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
152f0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
15300 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
15310 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
15320 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15330 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
15340 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
15350 73 79 6e 63 5f 66 6c 61 67 73 7c 20 0a 20 20 20  sync_flags| .   
15360 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
15370 73 79 6e 63 5f 66 6c 61 67 73 3d 3d 53 51 4c 49  sync_flags==SQLI
15380 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c  TE_SYNC_FULL?SQL
15390 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
153a0 59 3a 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  Y:0).        );.
153b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
153c0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
153d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
153e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
153f0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
15400 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
15410 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
15420 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
15430 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
15440 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
15450 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
15460 68 65 43 6c 65 61 72 53 79 6e 63 46 6c 61 67 73  heClearSyncFlags
15470 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
15480 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
15490 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
154a0 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
154b0 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
154c0 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
154d0 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
154e0 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
154f0 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
15500 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
15510 65 20 66 69 6c 65 2e 20 4e 6f 20 63 61 6c 6c 73  e file. No calls
15520 20 61 72 65 20 6d 61 64 65 0a 2a 2a 20 74 6f 20   are made.** to 
15530 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 74  the page-cache t
15540 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 73  o mark the pages
15550 20 61 73 20 63 6c 65 61 6e 2e 20 49 74 20 69 73   as clean. It is
15560 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
15570 69 74 79 0a 2a 2a 20 6f 66 20 74 68 65 20 63 61  ity.** of the ca
15580 6c 6c 65 72 20 74 6f 20 75 73 65 20 50 63 61 63  ller to use Pcac
15590 68 65 43 6c 65 61 6e 41 6c 6c 28 29 20 6f 72 20  heCleanAll() or 
155a0 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28  PcacheMakeClean(
155b0 29 20 74 6f 20 6d 61 72 6b 0a 2a 2a 20 74 68 65  ) to mark.** the
155c0 20 70 61 67 65 73 20 61 73 20 63 6c 65 61 6e 2e   pages as clean.
155d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
155e0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
155f0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
15600 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
15610 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
15620 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
15630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15640 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
15650 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
15660 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
15670 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
15680 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
15690 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
156a0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
156b0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
156c0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
156d0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
156e0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
156f0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
15700 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
15710 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
15720 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
15730 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
15740 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
15750 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
15760 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
15770 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
15780 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
15790 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
157a0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
157b0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
157c0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
157d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
157e0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
157f0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
15800 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
15810 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
15820 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
15830 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
15840 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
15850 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
15860 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
15870 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
15880 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
15890 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
158a0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
158b0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
158c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
158d0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
158e0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
158f0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
15900 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
15910 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
15920 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
15930 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
15940 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
15950 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
15960 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
15970 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15980 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
15990 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
159a0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
159b0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
159c0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
159d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
159e0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
159f0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
15a00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
15a10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15a20 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
15a30 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
15a40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
15a50 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
15a60 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
15a70 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20  n it now. */.   
15a80 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
15a90 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
15aa0 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
15ab0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15ad0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  PagerOpentemp(pP
15ae0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 66 64  ager, pPager->fd
15af0 2c 20 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61  , pPager->vfsFla
15b00 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
15b10 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
15b20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15b30 74 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20  there are dirty 
15b40 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
15b50 65 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67  e cache with pag
15b60 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65  e numbers greate
15b70 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61  r.    ** than Pa
15b80 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73  ger.dbSize, this
15b90 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61   means sqlite3Pa
15ba0 67 65 72 54 72 75 6e 63 61 74 65 28 29 20 77 61  gerTruncate() wa
15bb0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
15bc0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
15bd0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
15be0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
15bf0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
15c00 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
15c10 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
15c20 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
15c30 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
15c40 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
15c50 62 53 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69  bSize && 0==(pLi
15c60 73 74 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  st->flags&PGHDR_
15c70 44 4f 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20  DONT_WRITE) ){. 
15c80 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
15c90 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  = (pList->pgno-1
15ca0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
15cb0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63  ageSize;.      c
15cc0 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44  har *pData = COD
15cd0 45 43 32 28 70 50 61 67 65 72 2c 20 70 4c 69 73  EC2(pPager, pLis
15ce0 74 2d 3e 70 44 61 74 61 2c 20 70 4c 69 73 74 2d  t->pData, pList-
15cf0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 0a 20 20 20 20  >pgno, 6);..    
15d00 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
15d10 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
15d20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
15d50 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
15d60 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
15d70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
15d80 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
15d90 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15da0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
15db0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15dc0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
15dd0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
15de0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66  er->pageSize, of
15df0 66 73 65 74 29 3b 0a 20 20 20 20 20 20 50 41 47  fset);.      PAG
15e00 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
15e10 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
15e20 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
15e30 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
15e40 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66  Write);.      if
15e50 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
15e60 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
15e70 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
15e80 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
15e90 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
15ea0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
15eb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15ec0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
15ed0 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41    else{.      PA
15ee0 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f  GERTRACE3("NOSTO
15ef0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
15f00 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
15f10 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
15f20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
15f30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15f40 6e 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c  n rc;.#ifdef SQL
15f50 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
15f60 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
15f70 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
15f80 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
15f90 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
15fa0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
15fb0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
15fc0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15fd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
15fe0 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
15ff0 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 68 65  pcache layer whe
16000 6e 20 69 74 20 68 61 73 20 72 65 61 63 68 65 64  n it has reached
16010 20 73 6f 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65   some.** soft me
16020 6d 6f 72 79 20 6c 69 6d 69 74 2e 20 54 68 65 20  mory limit. The 
16030 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
16040 69 6e 74 65 72 20 74 6f 20 61 20 70 75 72 67 65  inter to a purge
16050 61 62 6c 65 20 50 61 67 65 72 20 0a 2a 2a 20 6f  able Pager .** o
16060 62 6a 65 63 74 2e 20 54 68 69 73 20 66 75 6e 63  bject. This func
16070 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
16080 20 6d 61 6b 65 20 61 20 73 69 6e 67 6c 65 20 64   make a single d
16090 69 72 74 79 20 70 61 67 65 20 74 68 61 74 20 68  irty page that h
160a0 61 73 20 6e 6f 0a 2a 2a 20 6f 75 74 73 74 61 6e  as no.** outstan
160b0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
160c0 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 20  (if one exists) 
160d0 63 6c 65 61 6e 20 73 6f 20 74 68 61 74 20 69 74  clean so that it
160e0 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64   can be recycled
160f0 20 0a 2a 2a 20 62 79 20 74 68 65 20 70 63 61 63   .** by the pcac
16100 68 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61  he layer..*/.sta
16110 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 74 72  tic int pagerStr
16120 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50 67 48  ess(void *p, PgH
16130 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
16140 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67  r *pPager = (Pag
16150 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20 72 63  er *)p;.  int rc
16160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
16170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e   if( pPager->doN
16180 6f 74 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 65  otSync ){.    re
16190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
161a0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
161b0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
161c0 44 49 52 54 59 20 29 3b 0a 20 20 69 66 28 20 70  DIRTY );.  if( p
161d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
161e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
161f0 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67 73 26   if( pPg->flags&
16200 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
16210 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  ){.      rc = sy
16220 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
16230 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
16240 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
16250 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
16260 26 20 0a 20 20 20 20 20 20 20 20 21 28 70 50 61  & .        !(pPa
16270 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
16280 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
16290 4f 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20  ODE_MEMORY) &&. 
162a0 20 20 20 20 20 20 20 21 28 73 71 6c 69 74 65 33         !(sqlite3
162b0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
162c0 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
162d0 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
162e0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 0a 20 20  _SAFE_APPEND).  
162f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70      ){.        p
16300 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
16310 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
16320 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
16330 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
16340 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
16350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16360 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
16370 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
16380 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
16390 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
163a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
163b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
163c0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
163d0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
163e0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
163f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16400 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
16410 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a  Clean(pPg);.  }.
16420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16430 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
16440 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
16450 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
16460 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
16470 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
16480 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
16490 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
164a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
164b0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
164c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
164d0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
164e0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
164f0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
16500 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
16510 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
16520 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
16530 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
16540 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
16550 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
16560 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  urnal..**.** Ret
16570 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
16580 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  unable to determ
16590 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20 6f  ine the status o
165a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
165b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
165c0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20  e does not open 
165d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
165e0 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a   to examine its.
165f0 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e  ** content.  Hen
16600 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ce, the journal 
16610 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68  might contain th
16620 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
16630 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
16640 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
16650 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65   deleted, and he
16660 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20  nce not be hot. 
16670 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   Or.** the heade
16680 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
16690 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64   might be zeroed
166a0 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74   out.  This rout
166b0 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ine.** does not 
166c0 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20 63  discover these c
166d0 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f  ases of a non-ho
166e0 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74  t journal - if t
166f0 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
16700 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
16710 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20   not empty this 
16720 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
16730 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54  it.** is hot.  T
16740 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
16750 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
16760 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
16770 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
16780 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
16790 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f   hot and will no
167a0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
167b0 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
167c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
167d0 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
167e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
167f0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
16800 73 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  s;.  int rc = SQ
16810 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 65  LITE_OK;.  int e
16820 78 69 73 74 73 20 3d 20 30 3b 0a 20 20 69 6e 74  xists = 0;.  int
16830 20 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 61   locked = 0;.  a
16840 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
16850 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
16860 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
16870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
16880 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
16890 64 73 20 29 3b 0a 20 20 2a 70 45 78 69 73 74 73  ds );.  *pExists
168a0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
168b0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
168c0 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
168d0 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
168e0 53 53 5f 45 58 49 53 54 53 2c 20 26 65 78 69 73  SS_EXISTS, &exis
168f0 74 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ts);.  if( rc==S
16900 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73  QLITE_OK && exis
16910 74 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  ts ){.    rc = s
16920 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
16930 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  ervedLock(pPager
16940 2d 3e 66 64 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a  ->fd, &locked);.
16950 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16960 4c 49 54 45 5f 4f 4b 20 26 26 20 65 78 69 73 74  LITE_OK && exist
16970 73 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  s && !locked ){.
16980 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20      int nPage;. 
16990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
169a0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
169b0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
169c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
169d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 69 66 28  E_OK ){.     if(
169e0 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20   nPage==0 ){.   
169f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
16a00 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
16a10 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
16a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16a30 20 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d        *pExists =
16a40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16a50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16a60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
16a70 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16a80 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
16a90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16aa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16ab0 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
16ac0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
16ad0 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
16ae0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
16af0 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
16b00 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
16b10 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
16b20 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
16b30 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
16b40 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
16b50 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
16b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16b70 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
16b80 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
16b90 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
16ba0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
16bb0 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
16bc0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16bd0 2d 3e 66 64 2c 20 70 50 67 2d 3e 70 44 61 74 61  ->fd, pPg->pData
16be0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16bf0 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 50  ze, offset);.  P
16c00 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16c10 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16c20 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16c30 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16c40 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
16c50 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
16c60 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
16c70 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
16c80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
16c90 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16ca0 26 28 28 75 38 2a 29 70 50 67 2d 3e 70 44 61 74  &((u8*)pPg->pDat
16cb0 61 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  a)[24],.        
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ce0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
16cf0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16d00 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
16d10 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 44 61  pPager, pPg->pDa
16d20 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
16d30 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  );.  PAGERTRACE4
16d40 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
16d50 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
16d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16d70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16d80 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61 67  , pPg->pgno, pag
16d90 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
16da0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16db0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
16dc0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16dd0 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
16de0 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75  shared lock requ
16df0 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64  ired before.** d
16e00 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20  ata may be read 
16e10 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
16e20 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61  ache. If the sha
16e30 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72  red lock has alr
16e40 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74  eady.** been obt
16e50 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63  ained, this func
16e60 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
16e70 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65  .**.** Immediate
16e80 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69  ly after obtaini
16e90 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ng the shared lo
16ea0 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29  ck (if required)
16eb0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16ec0 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20  ** checks for a 
16ed0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
16ee0 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e  . If one is foun
16ef0 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  d, an emergency 
16f00 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70  rollback.** is p
16f10 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61  erformed immedia
16f20 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tely..*/.static 
16f30 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
16f40 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
16f50 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16f60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16f70 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 30  isErrorReset = 0
16f80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
16f90 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
16fa0 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  ed for exclusive
16fb0 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20   access, has no 
16fc0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
16fd0 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  * page reference
16fe0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65  s and is in an e
16ff0 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20  rror-state, now 
17000 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f  is the chance to
17010 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20   clear.  ** the 
17020 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74  error. Discard t
17030 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
17040 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
17050 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a  nd treat any.  *
17060 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66  * open journal f
17070 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ile as a hot-jou
17080 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rnal..  */.  if(
17090 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
170a0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
170b0 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 50   .   && sqlite3P
170c0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
170d0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
170e0 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  0 && pPager->err
170f0 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20 69  Code .  ){.    i
17100 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
17110 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
17120 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20 31  isErrorReset = 1
17130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
17140 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51  er->errCode = SQ
17150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61 67  LITE_OK;.    pag
17160 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
17180 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69 6c  he pager is stil
17190 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  l in an error st
171a0 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f 63  ate, do not proc
171b0 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20 0a  eed. The error .
171c0 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c 20    ** state will 
171d0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73 6f  be cleared at so
171e0 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
171f0 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c 20  future when all 
17200 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65 72  page .  ** refer
17210 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70 65  ences are droppe
17220 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65 20  d and the cache 
17230 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65 64  can be discarded
17240 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
17250 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
17260 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
17270 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
17280 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
17290 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
172a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
172b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
172c0 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65 73  CK || isErrorRes
172d0 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  et ){.    sqlite
172e0 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
172f0 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
17300 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  int isHotJournal
17310 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
17320 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
17330 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
17340 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
17350 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
17360 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  0 );.    if( !pP
17370 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
17380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
17390 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
173a0 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
173b0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
173c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
173d0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
173e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
173f0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
17400 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17410 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
17420 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
17430 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
17440 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
17450 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17460 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
17470 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
17480 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
17490 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
174a0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
174b0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
174c0 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
174d0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
174e0 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
174f0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
17500 66 28 20 21 69 73 45 72 72 6f 72 52 65 73 65 74  f( !isErrorReset
17510 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68   ){.      rc = h
17520 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
17530 67 65 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e  ger, &isHotJourn
17540 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
17550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
17570 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
17580 20 7d 0a 20 20 20 20 69 66 28 20 69 73 45 72 72   }.    if( isErr
17590 6f 72 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74  orReset || isHot
175a0 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
175b0 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
175c0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
175d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
175e0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
175f0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70   is.      ** imp
17600 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
17610 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
17620 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
17630 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
17640 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
17650 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72   lock. If it wer
17660 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  e, another proce
17670 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68  ss might open th
17680 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  e.      ** datab
17690 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
176a0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
176b0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
176c0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
176d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
176e0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
176f0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
17700 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
17710 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 62 61 63  it .      ** bac
17720 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  k..      ** .   
17730 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
17740 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
17750 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
17760 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
17770 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 63 6f  he.      ** seco
17780 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20  nd process will 
17790 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  get to this poin
177a0 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e  t in the code an
177b0 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20  d fail to.      
177c0 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f 77  ** obtain its ow
177d0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
177e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
177f0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
17800 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
17810 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
17820 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
17830 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17840 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
17850 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
17860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17870 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17880 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
17890 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
178a0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
178b0 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
178c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
178d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
178e0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
178f0 0a 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20  .      }. .     
17900 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75   /* Open the jou
17910 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
17920 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
17930 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
17940 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
17950 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
17960 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17970 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
17980 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 2a  open and.      *
17990 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
179a0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
179b0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
179c0 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
179d0 0a 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e  .      ** OsTrun
179e0 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
179f0 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
17a00 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
17a10 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
17a20 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
17a30 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
17a40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69   */.      if( !i
17a50 73 45 72 72 6f 72 52 65 73 65 74 20 26 26 20 70  sErrorReset && p
17a60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17a70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  en==0 ){.       
17a80 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 20 20   int res;.      
17a90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17aa0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
17ab0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
17ac0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
17ad0 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20 20 20  S,&res);.       
17ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17af0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17b00 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
17b10 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74 20         int fout 
17b20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
17b30 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f   int f = SQLITE_
17b40 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
17b50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
17b60 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20  JOURNAL;.       
17b70 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
17b80 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
17b90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
17ba0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
17bb0 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
17bc0 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
17bd0 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29 3b  >jfd, f, &fout);
17be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
17bf0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
17c00 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
17c10 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
17c20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
17c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17c40 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
17c50 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
17c60 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
17c70 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
17c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
17c90 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
17ca0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
17cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17cc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17cd0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
17ce0 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
17cf0 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65  t exist, that me
17d00 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ans some other p
17d10 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20  rocess.         
17d20 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
17d30 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b  y rolled it back
17d40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17d50 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17d60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
17d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
17d80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17d90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17da0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
17db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
17dc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17dd0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61  n = 1;.      pPa
17de0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
17df0 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ted = 0;.      p
17e00 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
17e10 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
17e20 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
17e30 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
17e40 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
17e50 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;. .      /* Pla
17e60 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
17e70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
17e80 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
17e90 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
17ea0 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
17eb0 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
17ec0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
17ed0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
17ee0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
17ef0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
17f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17f10 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
17f20 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
17f30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
17f40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
17f50 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67       assert(pPag
17f60 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
17f70 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20  _SHARED || .    
17f80 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
17f90 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
17fa0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
17fb0 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
17fc0 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
17fd0 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
17fe0 65 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  ePagecount(pPage
17ff0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b  r->pPCache)>0 ){
18000 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68  .      /* The sh
18010 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75  ared-lock has ju
18020 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  st been acquired
18030 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
18040 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61   file.      ** a
18050 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  nd there are alr
18060 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74 68  eady pages in th
18070 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20  e cache (from a 
18080 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a  previous.      *
18090 2a 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  * read or write 
180a0 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43  transaction).  C
180b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
180c0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
180d0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
180e0 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
180f0 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
18100 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
18110 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
18120 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
18130 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67  * Database chang
18140 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62  es is detected b
18150 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20  y looking at 15 
18160 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a  bytes beginning.
18170 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
18180 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
18190 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
181a0 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
181b0 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  tes are.      **
181c0 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65   a 32-bit counte
181d0 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
181e0 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
181f0 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20  change.  The.   
18200 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65     ** other byte
18210 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c  s change randoml
18220 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c 65  y with each file
18230 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20   change when.   
18240 20 20 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73     ** a codec is
18250 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a   in use..      *
18260 2a 20 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72  * .      ** Ther
18270 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
18280 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
18290 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
182a0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
182b0 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54   ** detected.  T
182c0 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20  he chance of an 
182d0 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67  undetected chang
182e0 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68  e is so small th
182f0 61 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  at.      ** it c
18300 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e  an be neglected.
18310 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18320 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
18330 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
18340 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20  bFileVers)];.   
18350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
18360 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
18370 20 30 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   0);..      if( 
18380 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
18390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
183a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
183b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61  .        goto fa
183c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
183d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
183e0 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
183f0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
18400 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
18410 7b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  {.        IOTRAC
18420 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
18430 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
18440 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
18450 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18460 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
18470 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c  ager->fd, &dbFil
18480 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62  eVers, sizeof(db
18490 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a  FileVers), 24);.
184a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
184b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
184c0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
184d0 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ed;.        }.  
184e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
184f0 20 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65     memset(dbFile
18500 56 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Vers, 0, sizeof(
18510 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
18520 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
18530 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
18540 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
18550 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
18560 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
18570 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f  {.        pager_
18580 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
18590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
185a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
185b0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
185c0 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
185d0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
185e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
185f0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
18600 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
18610 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
18620 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
18630 7d 0a 20 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a  }.  }.. failed:.
18640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18650 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  _OK ){.    /* pa
18660 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20  ger_unlock() is 
18670 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c  a no-op for excl
18680 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69  usive mode and i
18690 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
186a0 65 73 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 72  es. */.    pager
186b0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
186c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
186d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
186e0 73 75 72 65 20 77 65 20 68 61 76 65 20 74 68 65  sure we have the
186f0 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 20 70   content for a p
18700 61 67 65 2e 20 20 49 66 20 74 68 65 20 70 61 67  age.  If the pag
18710 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75  e was.** previou
18720 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
18730 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
18740 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
18750 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69   was.** just ini
18760 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
18770 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62 65 69  s instead of bei
18780 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  ng read from dis
18790 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65  k..** But now we
187a0 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c 20 64   need the real d
187b0 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e  ata off of disk.
187c0 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65 20 77    So make sure w
187d0 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20 20 52  e.** have it.  R
187e0 65 61 64 20 69 74 20 69 6e 20 69 66 20 77 65 20  ead it in if we 
187f0 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74 20 61  do not have it a
18800 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69  lready..*/.stati
18810 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65 74 5f  c int pager_get_
18820 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20 2a 70  content(PgHdr *p
18830 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
18840 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
18850 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 69 6e 74  _READ ){.    int
18860 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
18870 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
18880 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
18890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
188a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
188b0 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50 47 48  g->flags &= ~PGH
188c0 44 52 5f 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20  DR_NEED_READ;.  
188d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
188e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
188f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
18900 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18910 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   If the referenc
18920 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61 63  e count has reac
18930 68 65 64 20 7a 65 72 6f 2c 20 61 6e 64 20 74 68  hed zero, and th
18940 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69  e pager is not i
18950 6e 20 74 68 65 0a 2a 2a 20 6d 69 64 64 6c 65 20  n the.** middle 
18960 6f 66 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  of a write trans
18970 61 63 74 69 6f 6e 20 6f 72 20 6f 70 65 6e 65 64  action or opened
18980 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
18990 64 65 2c 20 75 6e 6c 6f 63 6b 20 69 74 2e 0a 2a  de, unlock it..*
189a0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
189b0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
189c0 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
189d0 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
189e0 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
189f0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
18a00 3d 3d 30 29 0a 20 20 20 20 26 26 20 28 21 70 50  ==0).    && (!pP
18a10 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
18a20 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  ode || pPager->j
18a30 6f 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20  ournalOff>0) .  
18a40 29 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  ){.    pagerUnlo
18a50 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
18a60 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
18a70 0a 2a 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20  .** Drop a page 
18a80 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75  from the cache u
18a90 73 69 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63  sing sqlite3Pcac
18aa0 68 65 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  heDrop()..**.** 
18ab0 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68  If this means th
18ac0 65 72 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70  ere are now no p
18ad0 61 67 65 73 20 77 69 74 68 20 72 65 66 65 72 65  ages with refere
18ae0 6e 63 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20  nces to them, a 
18af0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75  rollback.** occu
18b00 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
18b10 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18b20 69 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73  is removed..*/.s
18b30 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
18b40 44 72 6f 70 50 61 67 65 28 44 62 50 61 67 65 20  DropPage(DbPage 
18b50 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
18b60 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
18b70 61 67 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50  ager;.  sqlite3P
18b80 63 61 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a  cacheDrop(pPg);.
18b90 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
18ba0 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d  nused(pPager);.}
18bb0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
18bc0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
18bd0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
18be0 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
18bf0 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
18c00 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
18c10 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
18c20 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
18c30 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
18c40 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
18c50 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ased..**.** This
18c60 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66   routine works f
18c70 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
18c80 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
18c90 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
18ca0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
18cb0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
18cc0 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
18cd0 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
18ce0 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
18cf0 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
18d00 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
18d10 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
18d20 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
18d30 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
18d40 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
18d50 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
18d60 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
18d70 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
18d80 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
18d90 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
18da0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
18db0 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
18dc0 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
18dd0 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
18de0 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
18df0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
18e00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
18e10 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
18e20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
18e30 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
18e40 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
18e50 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20  p().  Both this 
18e60 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b  routine and Look
18e70 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
18e80 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
18e90 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
18ea0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
18eb0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
18ec0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
18ed0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
18ee0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
18ef0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
18f00 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29 0a  hereas Lookup().
18f10 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
18f20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
18f30 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
18f40 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
18f50 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
18f60 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
18f70 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
18f80 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
18f90 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
18fa0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b  y..** Since Look
18fb0 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
18fc0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
18fd0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
18fe0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
18ff0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
19000 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
19010 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
19020 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
19030 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
19040 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
19050 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
19060 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
19070 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
19080 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  about the conten
19090 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  ts.** of the pag
190a0 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20  e at this time, 
190b0 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20 64  so do not do a d
190c0 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74 20  isk read.  Just 
190d0 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20 70  fill in the.** p
190e0 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  age content with
190f0 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61 72   zeros.  But mar
19100 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  k the fact that 
19110 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61 64  we have not read
19120 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
19130 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  by setting the P
19140 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
19150 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20 69  ag.  Later on, i
19160 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  f .** sqlite3Pag
19170 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
19180 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65  led on this page
19190 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
191a0 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65 64  ine is.** called
191b0 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43 6f   again with noCo
191c0 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20 6d  ntent==0, that m
191d0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f  eans that the co
191e0 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64 0a  ntent is needed.
191f0 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b 20  ** and the disk 
19200 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75  read should occu
19210 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e  r at that point.
19220 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
19230 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20 50  agerAcquire(.  P
19240 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
19250 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
19260 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
19270 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
19280 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
19290 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
192a0 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  r to fetch */.  
192b0 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  DbPage **ppPage,
192c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70      /* Write a p
192d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
192e0 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  ge here */.  int
192f0 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
19300 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65   /* Do not bothe
19310 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e  r reading conten
19320 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74  t from disk if t
19330 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48 64  rue */.){.  PgHd
19340 72 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 69 6e  r *pPg = 0;.  in
19350 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
19360 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
19370 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20  PAGER_UNLOCK .  
19380 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
19390 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
193a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3e 30  ager->pPCache)>0
193b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f   .       || pgno
193c0 3d 3d 31 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  ==1.  );..  /* T
193d0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
193e0 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
193f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
19400 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
19410 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
19420 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
19430 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
19440 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
19450 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
19460 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
19470 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
19480 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
19490 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
194a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
194b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
194c0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
194d0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
194e0 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
194f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
19500 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
19510 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  e = 0;..  /* If 
19520 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
19530 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
19540 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
19550 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
19560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19570 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
19580 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
19590 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
195a0 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
195b0 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
195c0 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
195d0 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
195e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
195f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
19600 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
19610 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19620 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
19630 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19640 33 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61  3PcacheFetch(pPa
19650 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67  ger->pPCache, pg
19660 6e 6f 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20  no, 1, &pPg);.  
19670 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19680 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
19690 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
196a0 67 2d 3e 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a  g->pPager==0 ){.
196b0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
196c0 20 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74   cache has creat
196d0 65 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49  ed a new page. I
196e0 74 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73  ts content needs
196f0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69   to .    ** be i
19700 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20  nitialized..    
19710 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
19720 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
19730 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
19740 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
19750 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 6d 65  = pPager;.    me
19760 6d 73 65 74 28 70 50 67 2d 3e 70 45 78 74 72 61  mset(pPg->pExtra
19770 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
19780 74 72 61 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  tra);..    rc = 
19790 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
197a0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
197b0 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Max);.    if( rc
197c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
197d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
197e0 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
197f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19800 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d 61    }..    if( nMa
19810 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d  x<(int)pgno || M
19820 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e  EMDB || noConten
19830 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t ){.      if( p
19840 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67  gno>pPager->mxPg
19850 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  no ){.        sq
19860 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19870 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65  pPg);.        re
19880 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
19890 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
198a0 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44 61 74  memset(pPg->pDat
198b0 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  a, 0, pPager->pa
198c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
198d0 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  f( noContent ){.
198e0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61          pPg->fla
198f0 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44  gs |= PGHDR_NEED
19900 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20  _READ;.      }. 
19910 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
19920 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
19930 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
19940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
19950 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
19960 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f  Pager, pPg, pgno
19970 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
19980 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
19990 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
199a0 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
199b0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 50       /* sqlite3P
199c0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 20  agerUnref(pPg); 
199d0 2a 2f 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  */.        pager
199e0 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20  DropPage(pPg);. 
199f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19a00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19a10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
19a20 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
19a30 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
19a40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
19a50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
19a60 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
19a70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
19a80 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
19a90 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
19aa0 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65  (sqlite3PcacheRe
19ab0 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
19ac0 50 43 61 63 68 65 29 3e 30 20 7c 7c 20 70 67 6e  PCache)>0 || pgn
19ad0 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
19ae0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
19af0 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
19b00 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
19b10 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
19b20 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
19b30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19b50 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
19b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19b80 20 7d 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   }..  *ppPage = 
19b90 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
19ba0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19bb0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
19bc0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
19bd0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
19be0 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
19bf0 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
19c00 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
19c10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
19c20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
19c30 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
19c40 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
19c50 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
19c60 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19c70 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
19c80 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
19c90 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
19ca0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
19cb0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
19cc0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
19cd0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
19ce0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
19cf0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
19d00 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
19d10 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
19d20 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
19d30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19d40 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
19d50 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
19d60 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
19d70 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
19d80 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
19d90 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
19da0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
19db0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
19dc0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
19dd0 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
19de0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
19df0 0a 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ..  if( (pPager-
19e00 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
19e10 4c 4f 43 4b 29 0a 20 20 20 26 26 20 28 70 50 61  LOCK).   && (pPa
19e20 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
19e30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
19e40 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
19e50 54 45 5f 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20  TE_FULL).  ){.  
19e60 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 46    sqlite3PcacheF
19e70 65 74 63 68 28 70 50 61 67 65 72 2d 3e 70 50 43  etch(pPager->pPC
19e80 61 63 68 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26  ache, pgno, 0, &
19e90 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
19ea0 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn pPg;.}../*.*
19eb0 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65  * Release a page
19ec0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
19ed0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
19ee0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
19ef0 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68  drop to zero, th
19f00 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69  en the.** page i
19f10 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c  s added to the L
19f20 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61  RU list.  When a
19f30 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ll references to
19f40 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72   all pages.** ar
19f50 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f  e released, a ro
19f60 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e  llback occurs an
19f70 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
19f80 65 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a  e database is.**
19f90 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
19fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19fb0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
19fc0 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
19fd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
19fe0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
19ff0 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
1a000 52 65 6c 65 61 73 65 28 70 50 67 29 3b 0a 20 20  Release(pPg);.  
1a010 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55    pagerUnlockIfU
1a020 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b 0a 20  nused(pPager);. 
1a030 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1a040 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
1a050 20 69 6e 74 20 6f 70 65 6e 53 75 62 4a 6f 75 72   int openSubJour
1a060 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1a070 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1a080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1a090 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a0a0 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e  pen && !pPager->
1a0b0 73 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  sjfd->pMethods )
1a0c0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
1a0d0 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
1a0e0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
1a0f0 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20  _MEMORY ){.     
1a100 20 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e   sqlite3MemJourn
1a110 61 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  alOpen(pPager->s
1a120 6a 66 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  jfd);.    }else{
1a130 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a140 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
1a150 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
1a160 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50  >sjfd, SQLITE_OP
1a170 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a  EN_SUBJOURNAL);.
1a180 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a1a0 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
1a1b0 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
1a1c0 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
1a1d0 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
1a1e0 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
1a1f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1a200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a210 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1a220 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
1a230 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1a240 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
1a250 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
1a260 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
1a270 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
1a280 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
1a290 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
1a2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1a2b0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1a2c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a2d0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1a2e0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
1a2f0 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  fs;.  int flags 
1a300 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  = (SQLITE_OPEN_R
1a310 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
1a320 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
1a330 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1a340 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20  E);..  int rc;. 
1a350 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a360 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1a370 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
1a380 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
1a390 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65  ournal );.  asse
1a3a0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
1a3b0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73  ournal==0 );.  s
1a3c0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1a3d0 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
1a3e0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
1a3f0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
1a400 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
1a410 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
1a420 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
1a430 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
1a440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a450 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  M;.    goto fail
1a460 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1a470 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  al;.  }..  if( p
1a480 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a490 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  en==0 ){.    if(
1a4a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a4b0 65 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  e ){.      flags
1a4c0 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
1a4d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
1a4e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1a4f0 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65  JOURNAL);.    }e
1a500 6c 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  lse{.      flags
1a510 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e   |= (SQLITE_OPEN
1a520 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
1a530 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1a540 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
1a550 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
1a560 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
1a570 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
1a580 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
1a590 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 72  r->jfd);.      r
1a5a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a5b0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
1a5c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1a5d0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
1a5e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
1a5f0 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
1a600 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
1a610 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1a620 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
1a630 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
1a640 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
1a650 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
1a660 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
1a670 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
1a680 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
1a690 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
1a6a0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
1a6b0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1a6c0 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1a6d0 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
1a6e0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  );.    pPager->j
1a6f0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
1a700 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
1a710 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  ster = 0;.    pP
1a720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1a730 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
1a740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a750 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a760 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
1a770 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
1a780 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
1a790 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
1a7a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1a7b0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1a7c0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  en_journal;.    
1a7d0 7d 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  }.  }.  pPager->
1a7e0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
1a7f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1a800 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
1a810 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1a820 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
1a830 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
1a840 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a850 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1a860 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1a870 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1a880 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1a890 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
1a8a0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1a8b0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
1a8c0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1a8d0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
1a8e0 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  ( pPager->nSavep
1a8f0 6f 69 6e 74 20 26 26 20 72 63 3d 3d 53 51 4c 49  oint && rc==SQLI
1a900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1a910 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
1a920 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1a930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a940 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1a950 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
1a960 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
1a970 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1a980 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1a990 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
1a9a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a9b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1a9c0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1a9d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a9e0 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1a9f0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1aa00 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
1aa10 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
1aa20 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
1aa30 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
1aa40 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1aa50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
1aa60 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
1aa70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1aa80 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
1aa90 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
1aaa0 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
1aab0 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
1aac0 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
1aad0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1aae0 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64  eTwo() is called
1aaf0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1ab00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1ab10 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
1ab20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
1ab30 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
1ab40 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1ab50 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
1ab60 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
1ab70 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
1ab80 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
1ab90 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
1aba0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1abb0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1abc0 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
1abd0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
1abe0 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
1abf0 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
1ac00 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
1ac10 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
1ac20 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
1ac30 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
1ac40 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1ac50 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
1ac60 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
1ac70 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1ac80 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1ac90 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
1aca0 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
1acb0 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
1acc0 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
1acd0 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
1ace0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1acf0 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
1ad00 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
1ad10 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
1ad20 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
1ad30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1ad40 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
1ad50 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
1ad60 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
1ad70 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
1ad80 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
1ad90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ada0 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
1adb0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
1adc0 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
1add0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
1ade0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1adf0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1ae00 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
1ae10 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
1ae20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1ae30 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
1ae40 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
1ae50 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
1ae60 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1ae70 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
1ae80 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
1ae90 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
1aea0 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
1aeb0 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
1aec0 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
1aed0 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
1aee0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1aef0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
1af00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1af10 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
1af20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
1af30 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
1af40 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1af50 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1af60 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
1af70 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
1af80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1af90 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1afa0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  UNLOCK );.  if( 
1afb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1afc0 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20  AGER_SHARED ){. 
1afd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1afe0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
1aff0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b000 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 72 63  !MEMDB );.    rc
1b010 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1b020 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1b030 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1b040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
1b060 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b070 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
1b080 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
1b090 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b0a0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1b0b0 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
1b0c0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  E_LOCK);.      }
1b0d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1b0e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b0f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b100 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
1b110 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1b120 30 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43  0;.    PAGERTRAC
1b130 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
1b140 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b150 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1b160 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1b170 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d 3e  nal && !pPager->
1b180 74 65 6d 70 46 69 6c 65 0a 20 20 20 20 20 20 20  tempFile.       
1b190 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a      && pPager->j
1b1a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
1b1b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
1b1c0 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  F ){.      rc = 
1b1d0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1b1e0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1b1f0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  }.  }else if( pP
1b200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b210 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
1b220 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
1b230 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
1b240 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  s when the pager
1b250 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76   was in exclusiv
1b260 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
1b270 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
1b280 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
1b290 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
1b2a0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
1b2b0 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
1b2c0 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
1b2d0 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
1b2e0 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
1b2f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
1b300 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
1b310 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20  open and either 
1b320 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
1b330 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20   0 bytes or its 
1b340 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a  header was.    *
1b350 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  * overwritten wi
1b360 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
1b370 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b380 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
1b390 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b3a0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
1b3b0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1b3c0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
1b3d0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
1b3e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
1b3f0 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
1b400 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
1b410 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
1b420 42 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50  BitvecCreate( pP
1b430 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a  ager->dbSize );.
1b440 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1b450 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >pInJournal ){. 
1b460 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b470 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1b480 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
1b490 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1b4a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1b4b0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
1b4c0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
1b4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1b4e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
1b4f0 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
1b500 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b510 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
1b520 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _OK );.  return 
1b530 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72  rc;.}../*.** Mar
1b540 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
1b550 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
1b560 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
1b570 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1b580 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
1b590 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1b5a0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1b5b0 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
1b5c0 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
1b5d0 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
1b5e0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1b5f0 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1b600 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1b610 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
1b620 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
1b630 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
1b640 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b650 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1b660 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
1b670 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
1b680 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
1b690 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b6a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
1b6b0 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
1b6c0 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
1b6d0 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
1b6e0 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
1b6f0 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
1b700 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
1b710 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
1b720 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1b730 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1b740 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
1b750 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
1b760 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1b770 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
1b780 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
1b790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b7a0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
1b7b0 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
1b7c0 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
1b7d0 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
1b7e0 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
1b7f0 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
1b800 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
1b810 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
1b820 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
1b830 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
1b840 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1b850 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
1b860 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b870 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
1b880 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
1b890 20 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70   *pData = pPg->p
1b8a0 44 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70  Data;.  Pager *p
1b8b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1b8c0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
1b8d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1b8e0 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72   Check for error
1b8f0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  s.  */.  if( pPa
1b900 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20  ger->errCode ){ 
1b910 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1b920 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1b930 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72  .  if( pPager->r
1b940 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
1b950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
1b960 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  M;.  }..  assert
1b970 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1b980 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b  ster );..  CHECK
1b990 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1b9a0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 20 77  * If this page w
1b9b0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63  as previously ac
1b9c0 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f  quired with noCo
1b9d0 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74 20 6d  ntent==1, that m
1b9e0 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64 69 64  eans.  ** we did
1b9f0 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61 64 20  n't really read 
1ba00 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  in the content o
1ba10 66 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  f the page.  Thi
1ba20 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20 20 2a  s can happen.  *
1ba30 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 29 20  * (for example) 
1ba40 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  when the page is
1ba50 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74 6f 20   being moved to 
1ba60 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 42  the freelist.  B
1ba70 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65 20 61  ut.  ** now we a
1ba80 72 65 20 28 70 65 72 68 61 70 73 29 20 6d 6f 76  re (perhaps) mov
1ba90 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f 66 66  ing the page off
1baa0 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
1bab0 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73 65 20   for.  ** reuse 
1bac0 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6b  and we need to k
1bad0 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  now its original
1bae0 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68 61 74   content so that
1baf0 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 63 61   content.  ** ca
1bb00 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  n be stored in t
1bb10 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1bb20 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68 65 20  nal.  So do the 
1bb30 72 65 61 64 20 61 74 20 74 68 69 73 0a 20 20 2a  read at this.  *
1bb40 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72  * time..  */.  r
1bb50 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  c = pager_get_co
1bb60 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
1bb70 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1bb80 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
1bb90 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
1bba0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
1bbb0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
1bbc0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
1bbd0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
1bbe0 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
1bbf0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
1bc00 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1bc10 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
1bc20 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
1bc30 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
1bc40 26 20 70 61 67 65 49 6e 53 61 76 65 70 6f 69 6e  & pageInSavepoin
1bc50 74 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  t(pPg) ){.    pP
1bc60 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1bc70 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1bc80 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
1bc90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1bca0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1bcb0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1bcc0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1bcd0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1bce0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1bcf0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1bd00 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1bd10 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1bd20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1bd30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1bd40 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1bd50 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1bd60 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1bd70 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1bd80 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1bd90 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1bda0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1bdb0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1bdc0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1bdd0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1bde0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1bdf0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1be00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1be10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1be20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1be30 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1be40 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1be50 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1be60 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1be70 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20  r->useJournal.  
1be80 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
1be90 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1bea0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1beb0 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 72  E_OFF ){.      r
1bec0 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
1bed0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1bee0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1bef0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1bf00 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1bf10 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1bf20 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
1bf30 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
1bf40 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
1bf50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1bf60 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
1bf70 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
1bf80 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
1bf90 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1bfa0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
1bfb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
1bfc0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1bfd0 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
1bfe0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bff0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
1c000 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1c010 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
1c020 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61  f( !pageInJourna
1c030 6c 28 70 50 67 29 20 26 26 20 70 50 61 67 65 72  l(pPg) && pPager
1c040 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
1c050 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
1c060 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
1c070 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1c080 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20      u32 cksum;. 
1c090 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1c0a0 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ta2;..        /*
1c0b0 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   We should never
1c0c0 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
1c0d0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70  urnal file the p
1c0e0 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  age that.       
1c0f0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
1c100 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e   database locks.
1c110 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1c120 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a  assert verifies.
1c130 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1c140 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
1c150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c160 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
1c170 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1c180 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 32  ;.        pData2
1c190 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1c1a0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1c1b0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1c1c0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
1c1d0 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
1c1e0 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
1c1f0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
1c200 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
1c210 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c220 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ff, pPg->pgno);.
1c230 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c250 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c260 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1c270 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1c280 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c2c0 66 66 20 2b 20 34 29 3b 0a 20 20 20 20 20 20 20  ff + 4);.       
1c2d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c2e0 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
1c2f0 3e 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20  >pageSize+4;.   
1c300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1c310 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c330 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1c340 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1c350 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1c360 63 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  cksum);.        
1c370 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c380 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20  lOff += 4;.     
1c390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54     }.        IOT
1c3a0 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
1c3b0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
1c3c0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
1c3d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1c3e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1c3f0 61 6c 4f 66 66 2c 20 70 50 61 67 65 72 2d 3e 70  alOff, pPager->p
1c400 61 67 65 53 69 7a 65 29 29 3b 0a 20 20 20 20 20  ageSize));.     
1c410 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
1c420 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
1c430 65 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ej_count);.     
1c440 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
1c450 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1c460 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
1c470 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1c480 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1c490 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1c4a0 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20  >pgno, .        
1c4b0 20 20 20 20 20 28 28 70 50 67 2d 3e 66 6c 61 67       ((pPg->flag
1c4c0 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  s&PGHDR_NEED_SYN
1c4d0 43 29 3f 31 3a 30 29 2c 20 70 61 67 65 72 5f 70  C)?1:0), pager_p
1c4e0 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a  agehash(pPg));..
1c4f0 20 20 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20          /* Even 
1c500 69 66 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b  if an IO or disk
1c510 66 75 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72  full error occur
1c520 72 65 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61  red while journa
1c530 6c 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20  lling the.      
1c540 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
1c550 20 62 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65   block above, se
1c560 74 20 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20  t the need-sync 
1c570 66 6c 61 67 20 66 6f 72 20 74 68 65 20 70 61 67  flag for the pag
1c580 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74  e..        ** Ot
1c590 68 65 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68  herwise, when th
1c5a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1c5b0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68   rolled back, th
1c5c0 65 20 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20  e logic in.     
1c5d0 20 20 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f     ** playback_o
1c5e0 6e 65 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74  ne_page() will t
1c5f0 68 69 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61  hink that the pa
1c600 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  ge needs to be r
1c610 65 73 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20  estored.        
1c620 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
1c630 73 65 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20  se file. And if 
1c640 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
1c650 72 73 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73  rs while doing s
1c660 6f 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  o,.        ** th
1c670 65 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61  en corruption ma
1c680 79 20 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20  y follow..      
1c690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1c6a0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1c6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c6c0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1c6d0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
1c6e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
1c6f0 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1c700 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1c710 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1c720 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1c730 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1c740 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20   will be rolled 
1c750 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65  back by the laye
1c760 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  r above..       
1c770 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
1c780 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c790 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c7a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1c7b0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1c7c0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1c7d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c7e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
1c7f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1c800 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65  3BitvecSet(pPage
1c810 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
1c820 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c830 20 20 20 61 64 64 54 6f 53 61 76 65 70 6f 69 6e     addToSavepoin
1c840 74 42 69 74 76 65 63 73 28 70 50 61 67 65 72 2c  tBitvecs(pPager,
1c850 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c870 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1c880 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1c890 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1c8a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1c8b0 67 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  g->flags |= PGHD
1c8c0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
1c8d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50       }.        P
1c8e0 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45  AGERTRACE4("APPE
1c8f0 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  ND %d page %d ne
1c900 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20  edSync=%d\n",.  
1c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1c920 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c930 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20  Pg->pgno,.      
1c940 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e           ((pPg->
1c950 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1c960 5f 53 59 4e 43 29 3f 31 3a 30 29 29 3b 0a 20 20  _SYNC)?1:0));.  
1c970 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1c980 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
1c990 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20  _NEED_SYNC ){.  
1c9a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1c9b0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1c9c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1c9d0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
1c9e0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
1c9f0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
1ca00 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
1ca10 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
1ca20 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1ca30 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
1ca40 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
1ca50 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
1ca60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1ca70 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
1ca80 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
1ca90 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
1caa0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
1cab0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
1cac0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
1cad0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
1cae0 2f 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 49  /.    if( !pageI
1caf0 6e 53 61 76 65 70 6f 69 6e 74 28 70 50 67 29 20  nSavepoint(pPg) 
1cb00 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f 66 66  ){.      i64 off
1cb10 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  set = pPager->st
1cb20 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65 72  mtNRec*(4+pPager
1cb30 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1cb40 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1cb50 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1cb60 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1cb70 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 61 73 73  o, 7);.      ass
1cb80 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e  ert( pageInJourn
1cb90 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e  al(pPg) || pPg->
1cba0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1cbb0 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1cbc0 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
1cbd0 73 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  s(pPager->sjfd, 
1cbe0 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e  offset, pPg->pgn
1cbf0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1cc00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cc10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1cc20 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1cc30 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c  r->sjfd, pData2,
1cc40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cc50 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20  e, offset+4);.  
1cc60 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45      }.      PAGE
1cc70 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1cc80 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1cc90 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1cca0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1ccb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ccc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ccd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1ccf0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1cd00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1cd10 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
1cd20 6e 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 64  nt>0 );.      ad
1cd30 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
1cd40 65 63 73 28 70 50 61 67 65 72 2c 20 70 50 67 2d  ecs(pPager, pPg-
1cd50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  >pgno);.    }.  
1cd60 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
1cd70 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1cd80 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
1cd90 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
1cda0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1cdb0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28  _SHARED );.  if(
1cdc0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
1cdd0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1cde0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1cdf0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1ce00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1ce10 69 7a 65 3d 3d 28 50 41 47 45 52 5f 4d 4a 5f 50  ize==(PAGER_MJ_P
1ce20 47 4e 4f 28 70 50 61 67 65 72 29 2d 31 29 20 29  GNO(pPager)-1) )
1ce30 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1ce40 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
1ce50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1ce60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1ce70 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1ce80 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
1ce90 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
1cea0 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
1ceb0 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
1cec0 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1ced0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1cee0 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
1cef0 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
1cf00 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
1cf10 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1cf20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1cf30 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
1cf40 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
1cf50 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
1cf60 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1cf70 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
1cf80 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
1cf90 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
1cfa0 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
1cfb0 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
1cfc0 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
1cfd0 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
1cfe0 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
1cff0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
1d000 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1d010 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
1d020 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
1d030 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
1d040 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1d050 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1d060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1d070 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1d080 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1d090 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1d0a0 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
1d0b0 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
1d0c0 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
1d0d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d0e0 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67 65 50  );..  if( nPageP
1d0f0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
1d100 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
1d110 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
1d120 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1d130 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1d140 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
1d150 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
1d160 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1d170 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1d180 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1d190 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
1d1a0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1d1b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d1c0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
1d1d0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
1d1e0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
1d1f0 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 64  ii;.    int need
1d200 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Sync = 0;..    /
1d210 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53  * Set the doNotS
1d220 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54  ync flag to 1. T
1d230 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77  his is because w
1d240 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61  e cannot allow a
1d250 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
1d260 68 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69  header to be wri
1d270 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65  tten between the
1d280 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64   pages journaled
1d290 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
1d2a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
1d2b0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
1d2c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d2d0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1d2e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1d2f0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1d300 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1d310 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1d320 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1d330 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1d340 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1d350 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1d360 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1d370 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1d380 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1d390 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1d3a0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1d3b0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1d3c0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1d3d0 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1d3e0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1d3f0 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1d400 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ..    sqlite3Pag
1d410 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1d420 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
1d430 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28  eCount);.    if(
1d440 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1d450 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1d460 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1d470 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1d480 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1d490 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1d4a0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1d4b0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1d4c0 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1d4d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d4e0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1d4f0 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1d500 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1d510 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1d520 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1d530 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1d540 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1d550 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1d560 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1d570 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1d580 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1d590 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1d5a0 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
1d5b0 20 20 20 20 20 69 66 28 20 70 67 3d 3d 70 50 67       if( pg==pPg
1d5c0 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74  ->pgno || !sqlit
1d5d0 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
1d5e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
1d5f0 20 70 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pg) ){.        
1d600 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1d610 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1d620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d630 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1d640 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
1d650 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1d660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1d680 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1d690 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1d6a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1d6b0 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
1d6c0 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
1d6d0 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20         needSync 
1d6e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
1d6f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
1d700 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d710 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1d720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1d730 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
1d740 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f  pPage = pager_lo
1d750 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29  okup(pPager, pg)
1d760 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d770 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73  if( pPage->flags
1d780 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43  &PGHDR_NEED_SYNC
1d790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
1d7a0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1d7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
1d7c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1d7d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
1d7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
1d7f0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1d800 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20  ync flag is set 
1d810 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
1d820 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
1d830 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
1d840 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
1d850 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
1d860 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
1d870 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
1d880 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
1d890 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
1d8a0 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
1d8b0 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
1d8c0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
1d8d0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
1d8e0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
1d8f0 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
1d900 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
1d910 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
1d920 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1d930 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1d940 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
1d950 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
1d960 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26 26  ssert( !MEMDB &&
1d970 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d   pPager->noSync=
1d980 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
1d990 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1d9a0 26 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b  & needSync; ii++
1d9b0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
1d9c0 20 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f   *pPage = pager_
1d9d0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
1d9e0 67 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20  g1+ii);.        
1d9f0 69 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67  if( pPage ) pPag
1da00 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
1da10 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
1da20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1da30 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1da40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1da50 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64  ert(pPager->need
1da60 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Sync);.    }..  
1da70 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1da80 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
1da90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1daa0 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
1dab0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1dac0 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
1dad0 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1dae0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1daf0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1db00 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
1db10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
1db20 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
1db30 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
1db40 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
1db50 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1db60 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
1db70 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
1db80 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
1db90 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
1dba0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
1dbb0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
1dbc0 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
1dbd0 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
1dbe0 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48  n pPg->flags&PGH
1dbf0 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64  DR_DIRTY;.}.#end
1dc00 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1dc10 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1dc20 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1dc30 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1dc40 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1dc50 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1dc60 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
1dc70 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
1dc80 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1dc90 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1dca0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1dcb0 64 69 72 74 79 2e 20 20 54 68 69 73 20 68 61 70  dirty.  This hap
1dcc0 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
1dcd0 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  e, when.** the p
1dce0 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 64 64  age has been add
1dcf0 65 64 20 61 73 20 61 20 6c 65 61 66 20 6f 66 20  ed as a leaf of 
1dd00 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64  the freelist and
1dd10 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65   so its.** conte
1dd20 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74  nt no longer mat
1dd30 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ters..**.** The 
1dd40 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61  overlying softwa
1dd50 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74  re layer calls t
1dd60 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
1dd70 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61   all of the data
1dd80 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  .** on the given
1dd90 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e   page is unused.
1dda0 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b    The pager mark
1ddb0 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c  s the page as cl
1ddc0 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ean so.** that i
1ddd0 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77  t does not get w
1dde0 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a  ritten to disk..
1ddf0 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77  **.** Tests show
1de00 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d   that this optim
1de10 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65  ization, togethe
1de20 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71  r with the.** sq
1de30 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1de40 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20  llback() below, 
1de50 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65  more than double
1de60 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66   the speed.** of
1de70 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70   large INSERT op
1de80 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61  erations and qua
1de90 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64  druple the speed
1dea0 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45   of large DELETE
1deb0 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  s..**.** When th
1dec0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ded0 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c  lled, set the al
1dee0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1def0 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75  g to true..** Su
1df00 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1df10 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  o sqlite3PagerDo
1df20 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
1df30 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a   the same page.*
1df40 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65  * will thereafte
1df50 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54  r be ignored.  T
1df60 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1df70 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62   to avoid a prob
1df80 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70  lem.** where a p
1df90 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73  age with data is
1dfa0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1dfb0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e  eelist during on
1dfc0 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74  e part of.** a t
1dfd0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20  ransaction then 
1dfe0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
1dff0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1e000 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a   a later part.**
1e010 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61   of the same tra
1e020 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75  nsaction and reu
1e030 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  sed for some oth
1e040 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65  er purpose.  Whe
1e050 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74  n it.** is first
1e060 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
1e070 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75  eelist, this rou
1e080 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1e090 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a   When reused,.**
1e0a0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1e0b0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1e0c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e0d0 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20  d.  But because 
1e0e0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1e0f0 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64 61  ains critical da
1e100 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  ta, we still nee
1e110 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20  d to be sure it 
1e120 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62  gets.** rolled b
1e130 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66 20  ack in spite of 
1e140 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
1e150 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 63  DontRollback() c
1e160 61 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  all..*/.int sqli
1e170 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
1e180 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1e190 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
1e1a0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1e1b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1e1c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1e1d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d   rc;..  if( pPg-
1e1e0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1e1f0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1e200 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1e220 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
1e230 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ack==0 ){.    as
1e240 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
1e250 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1e260 70 50 61 67 65 72 2d 3e 70 41 6c 77 61 79 73 52  pPager->pAlwaysR
1e270 6f 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74 65  ollback = sqlite
1e280 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 50  3BitvecCreate(pP
1e290 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1e2a0 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1e2b0 65 72 2d 3e 70 41 6c 77 61 79 73 52 6f 6c 6c 62  er->pAlwaysRollb
1e2c0 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ack ){.      ret
1e2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1e2e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  ;.    }.  }.  rc
1e2f0 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
1e300 53 65 74 28 70 50 61 67 65 72 2d 3e 70 41 6c 77  Set(pPager->pAlw
1e310 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50 67  aysRollback, pPg
1e320 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  ->pgno);..  if( 
1e330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1e340 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
1e350 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50 61  DR_DIRTY) && pPa
1e360 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d  ger->nSavepoint=
1e370 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1e380 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1e390 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1e3a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1e3b0 3e 64 62 53 69 7a 65 3d 3d 70 50 67 2d 3e 70 67  >dbSize==pPg->pg
1e3c0 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
1e3d0 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
1e3e0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
1e3f0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1e400 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
1e410 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
1e420 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
1e430 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
1e440 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
1e450 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1e460 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
1e470 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1e480 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
1e490 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e4a0 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
1e4b0 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
1e4c0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
1e4d0 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
1e4e0 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
1e4f0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
1e500 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
1e510 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1e520 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
1e530 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
1e540 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
1e550 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1e560 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
1e570 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
1e580 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
1e590 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
1e5a0 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
1e5b0 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
1e5c0 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
1e5d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1e5e0 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
1e5f0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1e600 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1e610 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1e620 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1e630 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e640 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
1e650 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
1e660 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1e670 0a 20 20 20 20 20 20 70 50 67 2d 3e 66 6c 61 67  .      pPg->flag
1e680 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e 54 5f  s |= PGHDR_DONT_
1e690 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20 53 51  WRITE;.#ifdef SQ
1e6a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1e6b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1e6c0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1e6d0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1e6e0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  if.    }.  }.  r
1e6f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e700 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1e710 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1e720 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1e730 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
1e740 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
1e750 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
1e760 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
1e770 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1e780 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
1e790 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1e7a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
1e7b0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
1e7c0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
1e7d0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
1e7e0 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20  al..**.** If we 
1e7f0 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74  have not yet act
1e800 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63  ually read the c
1e810 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70  ontent of this p
1e820 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50  age (if.** the P
1e830 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c  gHdr.needRead fl
1e840 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20  ag is set) then 
1e850 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  this routine act
1e860 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a  s as a promise.*
1e870 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e  * that we will n
1e880 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61  ever need to rea
1e890 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  d the page conte
1e8a0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
1e8b0 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64  ..** so the need
1e8c0 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65  Read flag can be
1e8d0 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73   cleared at this
1e8e0 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   point..*/.void 
1e8f0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1e900 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20  Rollback(DbPage 
1e910 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
1e920 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e930 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  ager;..  assert(
1e940 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1e950 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1e960 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
1e970 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
1e980 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
1e990 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
1e9a0 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
1e9b0 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
1e9c0 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
1e9d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
1e9e0 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
1e9f0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
1ea00 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1ea10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1ea20 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 0a 20 20 20  rnalOpen==0 .   
1ea30 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
1ea40 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 41 6c  Test(pPager->pAl
1ea50 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 70 50  waysRollback, pP
1ea60 67 2d 3e 70 67 6e 6f 29 0a 20 20 20 7c 7c 20 70  g->pgno).   || p
1ea70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ea80 3e 6f 72 69 67 44 62 53 69 7a 65 0a 20 20 29 7b  >origDbSize.  ){
1ea90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1eaa0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1eab0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
1eac0 69 66 28 20 73 71 6c 69 74 65 33 42 69 74 76 65  if( sqlite3Bitve
1ead0 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
1eae0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
1eaf0 67 6e 6f 29 21 3d 30 0a 20 20 20 7c 7c 20 70 50  gno)!=0.   || pP
1eb00 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1eb10 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1eb20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
1eb30 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 45  ndif..  /* If SE
1eb40 43 55 52 45 5f 44 45 4c 45 54 45 20 69 73 20 64  CURE_DELETE is d
1eb50 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
1eb60 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68  ere is no way th
1eb70 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 72 6f 75  at this.  ** rou
1eb80 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c 6c  tine can be call
1eb90 65 64 20 6f 6e 20 61 20 70 61 67 65 20 66 6f 72  ed on a page for
1eba0 20 77 68 69 63 68 20 73 71 6c 69 74 65 33 50 61   which sqlite3Pa
1ebb0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 29 0a 20  gerDontWrite(). 
1ebc0 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
1ebd0 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
1ebe0 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 73 61  ed during the sa
1ebf0 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  me transaction..
1ec00 20 20 2a 2a 20 41 6e 64 20 69 66 20 44 6f 6e 74    ** And if Dont
1ec10 57 72 69 74 65 28 29 20 68 61 73 20 70 72 65 76  Write() has prev
1ec20 69 6f 75 73 6c 79 20 62 65 65 6e 20 63 61 6c 6c  iously been call
1ec30 65 64 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ed, the followin
1ec40 67 0a 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e  g.  ** condition
1ec50 73 20 6d 75 73 74 20 62 65 20 6d 65 74 2e 0a 20  s must be met.. 
1ec60 20 2a 2a 0a 20 20 2a 2a 20 28 4c 61 74 65 72 3a   **.  ** (Later:
1ec70 29 20 20 4e 6f 74 20 74 72 75 65 2e 20 20 49 66  )  Not true.  If
1ec80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1ec90 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 68 61   corrupted by ha
1eca0 76 69 6e 67 20 64 75 70 6c 69 63 61 74 65 0a 20  ving duplicate. 
1ecb0 20 2a 2a 20 70 61 67 65 73 20 6f 6e 20 74 68 65   ** pages on the
1ecc0 20 66 72 65 65 6c 69 73 74 20 28 65 78 3a 20 63   freelist (ex: c
1ecd0 6f 72 72 75 70 74 39 2e 74 65 73 74 29 20 74 68  orrupt9.test) th
1ece0 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
1ecf0 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63   is not.  ** nec
1ed00 65 73 73 61 72 69 6c 79 20 74 72 75 65 3a 0a 20  essarily true:. 
1ed10 20 2a 2f 0a 20 20 2f 2a 20 61 73 73 65 72 74 28   */.  /* assert(
1ed20 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1ed30 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1ed40 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1ed50 69 67 44 62 53 69 7a 65 20 29 3b 20 2a 2f 0a 0a  igDbSize ); */..
1ed60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ed70 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->pInJournal!=0 
1ed80 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  );.  sqlite3Bitv
1ed90 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
1eda0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70  nJournal, pPg->p
1edb0 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 66 6c 61  gno);.  pPg->fla
1edc0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
1edd0 44 5f 52 45 41 44 3b 0a 20 20 61 64 64 54 6f 53  D_READ;.  addToS
1ede0 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
1edf0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1ee00 6f 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  o);.  PAGERTRACE
1ee10 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
1ee20 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1ee30 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1ee40 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1ee50 20 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42    IOTRACE(("GARB
1ee60 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  AGE %p %d\n", pP
1ee70 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1ee80 29 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ).}.../*.** This
1ee90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1eea0 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
1eeb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eec0 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1eed0 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
1eee0 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
1eef0 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
1ef00 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
1ef10 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
1ef20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ef30 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a 20  int isDirect){. 
1ef40 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1ef50 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1ef60 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  nter;.  int rc =
1ef70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
1ef80 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
1ef90 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
1efa0 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
1efb0 63 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 69 73 44  ct==0 );  /* isD
1efc0 69 72 65 63 74 20 69 73 20 6f 6e 6c 79 20 74 72  irect is only tr
1efd0 75 65 20 66 6f 72 20 61 74 6f 6d 69 63 20 77 72  ue for atomic wr
1efe0 69 74 65 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ites */.#endif. 
1eff0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
1f000 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26  angeCountDone &&
1f010 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1f020 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  0 ){.    /* Open
1f030 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
1f040 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
1f050 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1f060 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1f070 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
1f080 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f090 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1f0a0 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20 21 69   rc;..    if( !i
1f0b0 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20  sDirect ){.     
1f0c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f0d0 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b  erWrite(pPgHdr);
1f0e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f100 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f110 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
1f120 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f130 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f140 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f150 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f160 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f170 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f180 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1f190 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
1f1a0 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
1f1b0 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
1f1c0 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  ers);.    change
1f1d0 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
1f1e0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
1f1f0 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
1f200 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e  +24, change_coun
1f210 74 65 72 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ter);..#ifdef SQ
1f220 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
1f230 49 43 5f 57 52 49 54 45 0a 20 20 20 20 69 66 28  IC_WRITE.    if(
1f240 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50 61   isDirect && pPa
1f250 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
1f260 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  s ){.      const
1f270 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
1f280 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
1f290 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f2a0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
1f2b0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
1f2c0 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
1f2d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
1f2e0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1f2f0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1f300 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
1f310 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1f320 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1f330 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1f340 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1f350 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  rc;.}../*.** Syn
1f360 63 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  c the pager file
1f370 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
1f380 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
1f390 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  c(Pager *pPager)
1f3a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
1f3b0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
1f3c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1f3e0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1f3f0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
1f400 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
1f410 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1f430 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f440 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1f450 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1f460 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1f470 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1f480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1f490 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1f4a0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1f4b0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1f4c0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1f4d0 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1f4e0 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1f4f0 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1f500 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1f510 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1f520 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1f530 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f540 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1f550 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1f560 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1f570 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1f580 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1f590 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1f5a0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1f5b0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1f5c0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1f5d0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1f5e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1f5f0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1f600 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1f610 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f620 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1f630 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1f640 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1f650 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1f660 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1f670 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1f680 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1f690 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f6a0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
1f6b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1f6c0 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1f6d0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1f6e0 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1f6f0 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1f700 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1f710 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1f720 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1f730 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  es)..**.** If th
1f740 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65  e final paramete
1f750 72 20 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20  r - noSync - is 
1f760 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64  true, then the d
1f770 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
1f780 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79  elf.** is not sy
1f790 6e 63 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  nced. The caller
1f7a0 20 6d 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74   must call sqlit
1f7b0 65 33 50 61 67 65 72 53 79 6e 63 28 29 20 64 69  e3PagerSync() di
1f7c0 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e  rectly to.** syn
1f7d0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1f7e0 69 6c 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ile before calli
1f7f0 6e 67 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  ng CommitPhaseTw
1f800 6f 28 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68  o() to delete th
1f810 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
1f820 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
1f830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1f840 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1f850 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
1f860 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  er, .  const cha
1f870 72 20 2a 7a 4d 61 73 74 65 72 2c 20 0a 20 20 50  r *zMaster, .  P
1f880 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a 20 20 69 6e  gno nTrunc,.  in
1f890 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a 20 20 69 6e  t noSync.){.  in
1f8a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f8b0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
1f8c0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1f8d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1f8e0 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
1f8f0 2a 20 49 66 20 6e 6f 20 63 68 61 6e 67 65 73 20  * If no changes 
1f900 68 61 76 65 20 62 65 65 6e 20 6d 61 64 65 2c 20  have been made, 
1f910 77 65 20 63 61 6e 20 6c 65 61 76 65 20 74 68 65  we can leave the
1f920 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 65 61 72   transaction ear
1f930 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
1f940 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1f950 64 3d 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20  d==0 &&.        
1f960 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
1f970 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
1f980 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c  NALMODE_DELETE |
1f990 7c 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  |.          pPag
1f9a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1f9b0 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 61 73 73  e!=0) ){.    ass
1f9c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
1f9d0 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
1f9e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f9f0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  n==0 );.    retu
1fa00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fa10 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 34  }..  PAGERTRACE4
1fa20 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
1fa30 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
1fa40 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
1fa50 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
1fa60 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
1fa70 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
1fa80 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1fa90 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
1faa0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
1fab0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1fac0 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
1fad0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
1fae0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
1faf0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1fb00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
1fb10 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1fb20 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
1fb30 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
1fb40 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
1fb50 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
1fb60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1fb70 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
1fb80 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
1fb90 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
1fba0 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
1fbb0 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
1fbc0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
1fbd0 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
1fbe0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
1fbf0 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
1fc00 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
1fc10 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
1fc20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
1fc30 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
1fc40 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
1fc50 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
1fc60 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
1fc70 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
1fc80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
1fc90 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
1fca0 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
1fcb0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1fcc0 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
1fcd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
1fce0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
1fcf0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
1fd00 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
1fd10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1fd20 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
1fd30 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
1fd40 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
1fd50 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1fd60 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
1fd70 69 74 65 3b 0a 20 20 20 20 70 50 67 20 3d 20 73  ite;.    pPg = s
1fd80 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
1fd90 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
1fda0 43 61 63 68 65 29 3b 0a 20 20 20 20 75 73 65 41  Cache);.    useA
1fdb0 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a 20  tomicWrite = (. 
1fdc0 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72 20         !zMaster 
1fdd0 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
1fde0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1fdf0 26 26 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  &&.        pPage
1fe00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
1fe10 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
1fe20 61 67 65 72 29 20 26 26 20 0a 20 20 20 20 20 20  ager) && .      
1fe30 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26 20 0a    nTrunc==0 && .
1fe40 20 20 20 20 20 20 20 20 28 70 50 67 3d 3d 30 20          (pPg==0 
1fe50 7c 7c 20 70 50 67 2d 3e 70 44 69 72 74 79 3d 3d  || pPg->pDirty==
1fe60 30 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73  0).    );.    as
1fe70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1fe80 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61  urnalOpen || pPa
1fe90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
1fea0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
1feb0 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69  ODE_OFF );.    i
1fec0 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74  f( useAtomicWrit
1fed0 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70  e ){.      /* Up
1fee0 64 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69  date the nRec fi
1fef0 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eld in the journ
1ff00 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1ff10 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70    int offset = p
1ff20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1ff30 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
1ff40 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20  nalMagic);.     
1ff50 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1ff60 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nRec==1);.      
1ff70 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
1ff80 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66  (pPager->jfd, of
1ff90 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52  fset, pPager->nR
1ffa0 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55  ec);..      /* U
1ffb0 70 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c  pdate the db fil
1ffc0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1ffd0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1ffe0 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79  call will modify
1fff0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
20000 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
20010 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  tation of page 1
20020 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20   to include the 
20030 75 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  updated.      **
20040 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
20050 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70  and then write p
20060 61 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74  age 1 directly t
20070 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  o the database. 
20080 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65       ** file. Be
20090 63 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f  cause of the ato
200a0 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72  mic-write proper
200b0 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66  ty of the host f
200c0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20  ile-system, .   
200d0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61     ** this is sa
200e0 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fe..      */.   
200f0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20110 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
20120 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
20130 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
20140 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
20150 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a     rc = sqlite3J
20160 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61  ournalCreate(pPa
20170 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
20180 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74  ..    if( !useAt
20190 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d  omicWrite && rc=
201a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e  =SQLITE_OK ).#en
201b0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61  dif..    /* If a
201c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
201d0 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
201e0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
201f0 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
20200 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
20210 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
20220 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
20230 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
20240 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
20250 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
20260 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
20270 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
20280 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
20290 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
202a0 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
202b0 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
202c0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
202d0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
202e0 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
202f0 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
20300 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
20310 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
20320 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
20330 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
20340 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
20350 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
20360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20380 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20390 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
203a0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
203b0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
203c0 46 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  F ){.#ifndef SQL
203d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
203e0 55 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20  UUM.        if( 
203f0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
20400 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
20410 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
20420 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
20430 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
20440 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
20450 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
20460 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
20470 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
20480 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
20490 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
204a0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
204b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
204c0 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
204d0 20 20 20 20 20 20 50 67 6e 6f 20 69 53 6b 69 70        Pgno iSkip
204e0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
204f0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20500 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
20510 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
20520 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
20530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20540 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76 65  f( !sqlite3Bitve
20550 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
20560 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26 20  nJournal, i) && 
20570 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
20580 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20590 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
205a0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b  Pager, i, &pPg);
205b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
205c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
205d0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
205e0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t;.             
205f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20600 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
20610 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20620 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
20630 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
20640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20650 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
20660 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
20670 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 20    }.          } 
20680 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
20690 66 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  f.        rc = w
206a0 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
206b0 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  l(pPager, zMaste
206c0 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
206d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
206e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
206f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e          rc = syn
20700 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
20710 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20720 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20730 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20740 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65 66  c_exit;..#ifndef
20750 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20760 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
20770 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
20780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20790 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
207a0 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
207b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
207c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
207d0 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
207e0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
207f0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
20800 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
20810 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
20820 50 67 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  Pg = sqlite3Pcac
20830 68 65 44 69 72 74 79 4c 69 73 74 28 70 50 61 67  heDirtyList(pPag
20840 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
20850 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
20860 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
20870 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
20880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20890 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
208a0 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
208b0 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  D );.      /* Th
208c0 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61  e error might ha
208d0 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72 74  ve left the dirt
208e0 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65  y list all foule
208f0 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20  d up here,.     
20900 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65   ** but that doe
20910 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63  s not matter bec
20920 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20 74  ause if the if t
20930 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64 69  he dirty list di
20940 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63  d.      ** get c
20950 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74  orrupted, then t
20960 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
20970 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e  ill roll back an
20980 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61  d.      ** disca
20990 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  rd the dirty lis
209a0 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e 20  t.  There is an 
209b0 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20  assert in.      
209c0 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  ** pager_get_all
209d0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20 74  _dirty_pages() t
209e0 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68 61  hat verifies tha
209f0 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20  t no attempt.   
20a00 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f     ** is made to
20a10 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20   use an invalid 
20a20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20  dirty list..    
20a30 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20    */.      goto 
20a40 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
20a50 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
20a60 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
20a70 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
20a80 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
20a90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
20aa0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
20ab0 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53 79  >noSync && !noSy
20ac0 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
20ad0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
20ae0 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
20af0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a  r->sync_flags);.
20b00 20 20 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43      }.    IOTRAC
20b10 45 28 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22  E(("DBSYNC %p\n"
20b20 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20  , pPager))..    
20b30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
20b40 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
20b50 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20  }else if( MEMDB 
20b60 26 26 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  && nTrunc!=0 ){.
20b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20b80 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
20b90 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
20ba0 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
20bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20bc0 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b  IOERR_BLOCKED ){
20bd0 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e  .    /* pager_in
20be0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
20bf0 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74  () may attempt t
20c00 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c  o obtain an excl
20c10 75 73 69 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63  usive.     * loc
20c20 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20 63  k to spill the c
20c30 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e 20  ache and return 
20c40 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42  IOERR_BLOCKED. B
20c50 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 20 2a  ut since .     *
20c60 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61   there is no cha
20c70 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69 73  nce the cache is
20c80 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69   inconsistent, i
20c90 74 20 69 73 0a 20 20 20 20 20 2a 20 62 65 74 74  t is.     * bett
20ca0 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  er to return SQL
20cb0 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a  ITE_BUSY..     *
20cc0 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
20cd0 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72 65  E_BUSY;.  }.  re
20ce0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
20cf0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
20d00 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
20d10 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
20d20 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
20d30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
20d40 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
20d50 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
20d60 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
20d70 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
20d80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
20d90 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
20da0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
20db0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
20dc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
20dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
20de0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
20df0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
20e00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20e10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
20e20 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
20e30 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
20e40 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
20e50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
20e60 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
20e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20e80 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
20e90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 4d   if( pPager->dbM
20ea0 6f 64 69 66 69 65 64 3d 3d 30 20 26 26 0a 20 20  odified==0 &&.  
20eb0 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 6a        (pPager->j
20ec0 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45  ournalMode!=PAGE
20ed0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
20ee0 4c 45 54 45 20 7c 7c 0a 20 20 20 20 20 20 20 20  LETE ||.        
20ef0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
20f00 69 76 65 4d 6f 64 65 21 3d 30 29 20 29 7b 0a 20  iveMode!=0) ){. 
20f10 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
20f20 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
20f30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
20f40 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
20f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20f60 4f 4b 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54  OK;.  }.  PAGERT
20f70 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
20f80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20f90 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ger));.  assert(
20fa0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
20fb0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c 20  PAGER_SYNCED || 
20fc0 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67 65 72  MEMDB || !pPager
20fd0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
20fe0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
20ff0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
21000 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
21010 4d 61 73 74 65 72 29 3b 0a 20 20 72 63 20 3d 20  Master);.  rc = 
21020 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
21030 65 72 2c 20 72 63 29 3b 0a 20 20 72 65 74 75 72  er, rc);.  retur
21040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
21050 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
21060 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
21070 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
21080 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
21090 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
210a0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
210b0 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
210c0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
210d0 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
210e0 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
210f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
21100 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
21110 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
21120 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
21130 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
21140 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
21150 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72  king protocol or
21160 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
21170 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
21180 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
21190 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
211a0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
211b0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
211c0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
211d0 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
211e0 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
211f0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
21200 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
21210 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
21220 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
21230 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
21240 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21250 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
21260 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
21270 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21280 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21290 5f 4f 4b 3b 0a 20 20 50 41 47 45 52 54 52 41 43  _OK;.  PAGERTRAC
212a0 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
212b0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
212c0 65 72 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61  er));.  if( !pPa
212d0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
212e0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
212f0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
21300 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
21310 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
21320 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
21330 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
21340 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
21350 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
21360 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
21370 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
21380 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21390 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
213a0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
213b0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
213c0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
213d0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
213e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
213f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
21400 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
21410 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
21420 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21430 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
21440 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
21450 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
21460 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
21470 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
21480 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
21490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
214a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
214b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
214c0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
214d0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
214e0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
214f0 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
21500 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
21510 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
21520 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
21530 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
21540 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
21550 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
21560 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
21570 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
21580 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
21590 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
215a0 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
215b0 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
215c0 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
215d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
215e0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
215f0 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
21600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21610 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
21620 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
21630 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
21640 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
21650 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
21660 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
21670 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
21680 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
21690 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
216a0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
216b0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
216c0 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
216d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
216e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
216f0 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
21700 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
21710 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
21720 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21730 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
21740 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
21750 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
21760 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21770 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
21780 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
21790 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
217a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
217b0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
217c0 44 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  DbPage *pPage){.
217d0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
217e0 50 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75  PcachePageRefcou
217f0 6e 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69  nt(pPage);.}..#i
21800 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
21810 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
21820 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
21830 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
21840 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
21850 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53  t *sqlite3PagerS
21860 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  tats(Pager *pPag
21870 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  er){.  static in
21880 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20  t a[11];.  a[0] 
21890 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52  = sqlite3PcacheR
218a0 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  efCount(pPager->
218b0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d  pPCache);.  a[1]
218c0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
218d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
218e0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b  ->pPCache);.  a[
218f0 32 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  2] = sqlite3Pcac
21900 68 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70  heGetCachesize(p
21910 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b  Pager->pPCache);
21920 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72  .  a[3] = pPager
21930 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20  ->dbSizeValid ? 
21940 28 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62  (int) pPager->db
21950 53 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34  Size : -1;.  a[4
21960 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
21970 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
21980 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61  er->errCode;.  a
21990 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
219a0 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
219b0 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
219c0 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64  8] = 0;  /* Used
219d0 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e   to be pPager->n
219e0 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d  Ovfl */.  a[9] =
219f0 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
21a00 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
21a10 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75  ->nWrite;.  retu
21a20 72 6e 20 61 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn a;.}.int sqli
21a30 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
21a40 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21a50 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
21a60 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21a70 45 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 72  Ensure that ther
21a80 65 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 6e  e are at least n
21a90 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65 70 6f  Savepoint savepo
21aa0 69 6e 74 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ints open..*/.in
21ab0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
21ac0 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
21ad0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
21ae0 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
21af0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
21b00 3b 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70 6f  ;..  if( nSavepo
21b10 69 6e 74 3e 70 50 61 67 65 72 2d 3e 6e 53 61 76  int>pPager->nSav
21b20 65 70 6f 69 6e 74 20 26 26 20 70 50 61 67 65 72  epoint && pPager
21b30 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
21b40 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
21b50 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65 20 73   /* Either the s
21b60 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
21b70 65 6e 20 6f 72 20 74 68 65 72 65 20 61 72 65 20  en or there are 
21b80 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
21b90 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ints. */.    ass
21ba0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
21bb0 76 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 70 50  vepoint==0 || pP
21bc0 61 67 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74  ager->sjfd->pMet
21bd0 68 6f 64 73 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  hods );..    /* 
21be0 47 72 6f 77 20 74 68 65 20 50 61 67 65 72 2e 61  Grow the Pager.a
21bf0 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61 79 20  Savepoint array 
21c00 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28 29 2e  using realloc().
21c10 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   Return SQLITE_N
21c20 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66 20 74  OMEM.    ** if t
21c30 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  he allocation fa
21c40 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ils. Otherwise, 
21c50 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70 6f 72  zero the new por
21c60 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61 20 0a  tion in case a .
21c70 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 66 61      ** malloc fa
21c80 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
21c90 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 69 74  le populating it
21ca0 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e 2e 29   in the for(...)
21cb0 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20 20 20   loop below..   
21cc0 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 53 61 76   */.    PagerSav
21cd0 65 70 6f 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28  epoint *aNew = (
21ce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
21cf0 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
21d00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
21d10 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73 69 7a  >aSavepoint, siz
21d20 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
21d30 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74 0a 20  nt)*nSavepoint. 
21d40 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
21d50 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 65 74  New ){.      ret
21d60 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
21d70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
21d80 65 74 28 26 61 4e 65 77 5b 70 50 61 67 65 72 2d  et(&aNew[pPager-
21d90 3e 6e 53 61 76 65 70 6f 69 6e 74 5d 2c 20 30 2c  >nSavepoint], 0,
21da0 0a 20 20 20 20 20 20 20 20 28 6e 53 61 76 65 70  .        (nSavep
21db0 6f 69 6e 74 20 2d 20 70 50 61 67 65 72 2d 3e 6e  oint - pPager->n
21dc0 53 61 76 65 70 6f 69 6e 74 29 20 2a 20 73 69 7a  Savepoint) * siz
21dd0 65 6f 66 28 50 61 67 65 72 53 61 76 65 70 6f 69  eof(PagerSavepoi
21de0 6e 74 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  nt).    );.    p
21df0 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
21e00 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 69 69  t = aNew;.    ii
21e10 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65   = pPager->nSave
21e20 70 6f 69 6e 74 3b 0a 20 20 20 20 70 50 61 67 65  point;.    pPage
21e30 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
21e40 6e 53 61 76 65 70 6f 69 6e 74 3b 0a 0a 20 20 20  nSavepoint;..   
21e50 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65   /* Populate the
21e60 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
21e70 73 74 72 75 63 74 75 72 65 73 20 6a 75 73 74 20  structures just 
21e80 61 6c 6c 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20  allocated. */.  
21e90 20 20 66 6f 72 28 2f 2a 20 6e 6f 2d 6f 70 20 2a    for(/* no-op *
21ea0 2f 3b 20 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74  /; ii<nSavepoint
21eb0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
21ec0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
21ed0 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20  bSizeValid );.  
21ee0 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 6e 4f 72      aNew[ii].nOr
21ef0 69 67 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ig = pPager->dbS
21f00 69 7a 65 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b  ize;.      aNew[
21f10 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 28 70  ii].iOffset = (p
21f20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21f30 65 6e 20 3f 20 70 50 61 67 65 72 2d 3e 6a 6f 75  en ? pPager->jou
21f40 72 6e 61 6c 4f 66 66 20 3a 20 30 29 3b 0a 20 20  rnalOff : 0);.  
21f50 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53 75      aNew[ii].iSu
21f60 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73  bRec = pPager->s
21f70 74 6d 74 4e 52 65 63 3b 0a 20 20 20 20 20 20 61  tmtNRec;.      a
21f80 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
21f90 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
21fa0 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
21fb0 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
21fc0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
21fd0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
21fe0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
21ff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
22000 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
22010 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
22020 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
22030 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
22040 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
22050 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
22060 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
22070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22080 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6f  *.** Parameter o
22090 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74 68  p is always eith
220a0 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
220b0 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f 49  LBACK or SAVEPOI
220c0 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20 49  NT_RELEASE..** I
220d0 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
220e0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
220f0 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73 74  release and dest
22100 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69 6e  roy the savepoin
22110 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  t with.** index 
22120 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69  iSavepoint. If i
22130 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  t is SAVEPOINT_R
22140 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72 6f  OLLBACK, then ro
22150 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
22160 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20  es.** that have 
22170 6f 63 63 75 72 65 64 20 73 69 6e 63 65 20 73 61  occured since sa
22180 76 65 70 6f 69 6e 74 20 69 53 61 76 65 70 6f 69  vepoint iSavepoi
22190 6e 74 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a  nt was created..
221a0 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20  **.** In either 
221b0 63 61 73 65 2c 20 61 6c 6c 20 73 61 76 65 70 6f  case, all savepo
221c0 69 6e 74 73 20 77 69 74 68 20 61 6e 20 69 6e 64  ints with an ind
221d0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
221e0 69 53 61 76 65 70 6f 69 6e 74 20 0a 2a 2a 20 61  iSavepoint .** a
221f0 72 65 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a  re destroyed..**
22200 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
22210 20 6c 65 73 73 20 74 68 61 6e 20 28 69 53 61 76   less than (iSav
22220 65 70 6f 69 6e 74 2b 31 29 20 61 63 74 69 76 65  epoint+1) active
22230 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 65 6e   savepoints when
22240 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
22250 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 74 20  on is called it 
22260 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 20 0a  is a no-op..*/ .
22270 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22280 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
22290 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6f 70 2c  *pPager, int op,
222a0 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
222b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
222c0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
222d0 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
222e0 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
222f0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
22300 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61  CK );..  if( iSa
22310 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e  vepoint<pPager->
22320 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
22330 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
22340 74 20 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f  t nNew = iSavepo
22350 69 6e 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50  int + (op==SAVEP
22360 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  OINT_ROLLBACK);.
22370 20 20 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b      for(ii=nNew;
22380 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76   ii<pPager->nSav
22390 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20  epoint; ii++){. 
223a0 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
223b0 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
223c0 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d  ->aSavepoint[ii]
223d0 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  .pInSavepoint);.
223e0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
223f0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e  ->nSavepoint = n
22400 4e 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70  New;..    if( op
22410 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
22420 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 50 61  BACK ){.      Pa
22430 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
22440 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
22450 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
22460 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
22470 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
22480 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
22490 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
224a0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
224b0 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
224c0 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
224d0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
224e0 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
224f0 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
22500 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63  savepoint, trunc
22510 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
22520 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a  sub-journal. */.
22530 20 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20      if( nNew==0 
22540 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
22550 5f 52 45 4c 45 41 53 45 20 26 26 20 70 50 61 67  _RELEASE && pPag
22560 65 72 2d 3e 73 6a 66 64 2d 3e 70 4d 65 74 68 6f  er->sjfd->pMetho
22570 64 73 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ds ){.      asse
22580 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
22590 4b 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  K );.      rc = 
225a0 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
225b0 65 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20  e(pPager->sjfd, 
225c0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
225d0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
225e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
225f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22600 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
22610 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
22620 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
22630 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
22640 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
22650 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
22660 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
22670 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
22680 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22690 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65  he VFS structure
226a0 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a   for the pager..
226b0 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
226c0 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67  _vfs *sqlite3Pag
226d0 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61  erVfs(Pager *pPa
226e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
226f0 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a  Pager->pVfs;.}..
22700 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22710 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72   file handle for
22720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22730 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  le associated.**
22740 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e   with the pager.
22750 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74    This might ret
22760 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  urn NULL if the 
22770 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20  file has.** not 
22780 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e  yet been opened.
22790 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65  .*/.sqlite3_file
227a0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
227b0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
227c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
227d0 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er->fd;.}../*.**
227e0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
227f0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
22800 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
22810 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
22820 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
22830 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22840 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22850 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
22860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22870 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
22880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22890 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
228a0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
228b0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
228c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
228d0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
228e0 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
228f0 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
22900 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
22910 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
22920 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
22930 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
22940 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
22950 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
22960 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
22970 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
22980 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22990 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
229a0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
229b0 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
229c0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
229d0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
229e0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
229f0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
22a00 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
22a10 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
22a20 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
22a30 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
22a40 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
22a50 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
22a60 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
22a70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
22a80 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
22a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22aa0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
22ab0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
22ac0 67 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69  ge pPg to locati
22ad0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
22ae0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ile..**.** There
22af0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
22b00 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
22b10 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f  ge previously lo
22b20 63 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f  cated at.** pgno
22b30 20 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20   (which we call 
22b40 70 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74  pPgOld) though t
22b50 68 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  hat page is allo
22b60 77 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20  wed to be.** in 
22b70 63 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70  cache.  If the p
22b80 61 67 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  age previously l
22b90 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f 20 69  ocated at pgno i
22ba0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
22bb0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
22bc0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
22bd0 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20 62 79  not put there by
22be0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
22bf0 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
22c00 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
22c10 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  Pg remain valid.
22c20 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
22c30 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
22c40 69 61 74 65 64 20 77 69 74 68 20 70 50 67 20 28  iated with pPg (
22c50 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
22c60 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
22c70 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
22c80 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
22c90 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
22ca0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
22cb0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
22cc0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
22cd0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
22ce0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
22cf0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
22d00 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
22d10 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
22d20 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22d30 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
22d40 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
22d50 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
22d60 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
22d70 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
22d80 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
22d90 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
22da0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
22db0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2a 0a 2a 2a  s active)..**.**
22dc0 20 49 66 20 74 68 65 20 66 6f 75 72 74 68 20 61   If the fourth a
22dd0 72 67 75 6d 65 6e 74 2c 20 69 73 43 6f 6d 6d 69  rgument, isCommi
22de0 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t, is non-zero, 
22df0 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69  then this page i
22e00 73 20 62 65 69 6e 67 0a 2a 2a 20 6d 6f 76 65 64  s being.** moved
22e10 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 64 61   as part of a da
22e20 74 61 62 61 73 65 20 72 65 6f 72 67 61 6e 69 7a  tabase reorganiz
22e30 61 74 69 6f 6e 20 6a 75 73 74 20 62 65 66 6f 72  ation just befor
22e40 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
22e50 6e 20 0a 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  n .** is being c
22e60 6f 6d 6d 69 74 74 65 64 2e 20 49 6e 20 74 68 69  ommitted. In thi
22e70 73 20 63 61 73 65 2c 20 69 74 20 69 73 20 67 75  s case, it is gu
22e80 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
22e90 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
22ea0 0a 2a 2a 20 70 50 67 20 72 65 66 65 72 73 20 74  .** pPg refers t
22eb0 6f 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77 72  o will not be wr
22ec0 69 74 74 65 6e 20 74 6f 20 61 67 61 69 6e 20 77  itten to again w
22ed0 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
22ee0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
22ef0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
22f00 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
22f10 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
22f20 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
22f30 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
22f40 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54  r *pPgOld;  /* T
22f50 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76  he page being ov
22f60 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20  erwritten. */.  
22f70 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
22f80 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  o = 0;..  assert
22f90 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
22fa0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35 28  ..  PAGERTRACE5(
22fb0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
22fc0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
22fd0 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
22fe0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
22ff0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
23000 2c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  , (pPg->flags&PG
23010 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
23020 3a 30 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  :0, pgno);.  IOT
23030 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
23040 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
23050 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
23060 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
23070 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 0a 20  content(pPg);.. 
23080 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e   /* If the journ
23090 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
230a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 70  ync()ed before p
230b0 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 63 61  age pPg->pgno ca
230c0 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  n.  ** be writte
230d0 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70 50 67 2d  n to, store pPg-
230e0 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61 6c 20 76  >pgno in local v
230f0 61 72 69 61 62 6c 65 20 6e 65 65 64 53 79 6e 63  ariable needSync
23100 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Pgno..  **.  ** 
23110 49 66 20 74 68 65 20 69 73 43 6f 6d 6d 69 74 20  If the isCommit 
23120 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65  flag is set, the
23130 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
23140 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 20   remember that. 
23150 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
23160 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
23170 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
23180 62 61 73 65 20 70 61 67 65 20 70 50 67 2d 3e 70  base page pPg->p
23190 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e 20 62 65  gno .  ** can be
231a0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
231b0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
231c0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
231d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 69 74 2e   to write to it.
231e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 50 67  .  */.  if( (pPg
231f0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
23200 45 44 5f 53 59 4e 43 29 20 26 26 20 21 69 73 43  ED_SYNC) && !isC
23210 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 6e 65 65  ommit ){.    nee
23220 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d  dSyncPgno = pPg-
23230 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
23240 74 28 20 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c  t( pageInJournal
23250 28 70 50 67 29 20 7c 7c 20 70 50 67 2d 3e 70 67  (pPg) || pPg->pg
23260 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
23270 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
23280 65 72 74 28 20 70 50 67 2d 3e 66 6c 61 67 73 26  ert( pPg->flags&
23290 50 47 48 44 52 5f 44 49 52 54 59 20 29 3b 0a 20  PGHDR_DIRTY );. 
232a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
232b0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
232c0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
232d0 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
232e0 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
232f0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
23300 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
23310 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e   its hash chain.
23320 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
23330 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
23340 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
23350 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
23360 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
23370 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
23380 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
23390 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
233a0 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
233b0 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  */.  pPg->flags 
233c0 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 53  &= ~PGHDR_NEED_S
233d0 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20  YNC;.  pPgOld = 
233e0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
233f0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
23400 73 65 72 74 28 20 21 70 50 67 4f 6c 64 20 7c 7c  sert( !pPgOld ||
23410 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 31   pPgOld->nRef==1
23420 20 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64   );.  if( pPgOld
23430 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61   ){.    pPg->fla
23440 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64 2d 3e 66  gs |= (pPgOld->f
23450 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
23460 53 59 4e 43 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  SYNC);.  }..  sq
23470 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
23480 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  pPg, pgno);.  if
23490 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
234a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
234b0 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  p(pPgOld);.  }..
234c0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d    sqlite3PcacheM
234d0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
234e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
234f0 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  che = 1;.  pPage
23500 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
23510 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
23520 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
23530 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
23540 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
23550 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
23560 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
23570 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
23580 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
23590 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
235a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
235b0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
235c0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
235d0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
235e0 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
235f0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
23600 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72  .    ** "is jour
23610 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c  naled" bitvec fl
23620 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ag has been set.
23630 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   This needs to b
23640 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20  e remedied by.  
23650 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65    ** loading the
23660 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
23670 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73  ager-cache and s
23680 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
23690 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a  .needSync .    *
236a0 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  * flag..    **. 
236b0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74     ** If the att
236c0 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65  empt to load the
236d0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
236e0 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c  age-cache fails,
236f0 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20   (due.    ** to 
23700 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f  a malloc() or IO
23710 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72   failure), clear
23720 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65 20   the bit in the 
23730 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20  pInJournal[].   
23740 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72   ** array. Other
23750 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61 67  wise, if the pag
23760 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20  e is loaded and 
23770 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e  written again in
23780 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61  .    ** this tra
23790 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79  nsaction, it may
237a0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
237b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
237c0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
237d0 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f  t is synced into
237e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
237f0 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74 20  e. This way, it 
23800 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20  may end up in.  
23810 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c    ** the journal
23820 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74   file twice, but
23830 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
23840 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20  roblem..    **. 
23850 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
23860 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
23870 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
23880 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
23890 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
238a0 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
238b0 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
238c0 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
238d0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50     int rc;.    P
238e0 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
238f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
23900 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
23910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23920 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
23930 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
23940 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
23950 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23960 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
23970 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->pInJournal && 
23980 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d 70 50  needSyncPgno<=pP
23990 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
239a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
239b0 74 65 33 42 69 74 76 65 63 43 6c 65 61 72 28 70  te3BitvecClear(p
239c0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
239d0 6c 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 29  l, needSyncPgno)
239e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
239f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23a00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
23a10 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61  dSync = 1;.    a
23a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
23a30 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d  oSync==0 && !MEM
23a40 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64 72  DB );.    pPgHdr
23a50 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
23a60 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
23a70 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
23a80 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
23a90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
23aa0 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
23ab0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23ac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
23ad0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
23ae0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
23af0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
23b00 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
23b10 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
23b20 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
23b30 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
23b40 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
23b50 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
23b60 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
23b70 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
23b80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
23b90 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
23ba0 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
23bb0 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
23bc0 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
23bd0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
23be0 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
23bf0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
23c00 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
23c10 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
23c20 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
23c30 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
23c40 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70  n (pPager?pPg->p
23c50 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Extra:0);.}../*.
23c60 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
23c70 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
23c80 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
23c90 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
23ca0 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
23cb0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23cc0 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
23cd0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
23ce0 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
23cf0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
23d00 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
23d10 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
23d20 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
23d30 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
23d40 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
23d50 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
23d60 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
23d70 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
23d80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23d90 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
23da0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23db0 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
23dc0 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
23dd0 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
23de0 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
23df0 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
23e00 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
23e10 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
23e20 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
23e30 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
23e40 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
23e50 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
23e60 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
23e70 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23e80 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
23e90 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
23ea0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23eb0 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
23ec0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
23ed0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
23ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
23ef0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
23f00 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
23f10 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
23f20 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
23f30 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
23f40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
23f50 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
23f60 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
23f70 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
23f80 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
23f90 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
23fa0 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
23fb0 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
23fc0 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
23fd0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
23fe0 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
23ff0 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
24000 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
24010 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
24020 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24030 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
24040 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
24050 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
24060 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24070 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
24080 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
24090 5f 4f 46 46 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OFF.**.** If th
240a0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
240b0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20  ot _QUERY, then 
240c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
240d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
240e0 2a 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  * value specifie
240f0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
24100 75 72 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74  urned indicate t
24110 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
24120 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
24130 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a   journal-mode..*
24140 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
24150 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50 61  erJournalMode(Pa
24160 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
24170 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 21   eMode){.  if( !
24180 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73 73  MEMDB ){.    ass
24190 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
241a0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
241b0 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
241c0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
241d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
241e0 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
241f0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
24200 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54  ER_JOURNALMODE_T
24210 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20 20  RUNCATE.        
24220 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
24230 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
24240 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20 20  E_PERSIST.      
24250 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
24260 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
24270 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20 20  ODE_OFF .       
24280 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
24290 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
242a0 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
242b0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4a   assert( PAGER_J
242c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59  OURNALMODE_QUERY
242d0 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65 4d  <0 );.    if( eM
242e0 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode>=0 ){.      
242f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
24300 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65 3b  ode = (u8)eMode;
24310 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24320 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
24330 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
24340 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 20 20  DE_QUERY );.    
24350 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  }.  }.  return (
24360 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75 72  int)pPager->jour
24370 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalMode;.}../*.*
24380 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73 69  * Get/set the si
24390 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66 6f  ze-limit used fo
243a0 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  r persistent jou
243b0 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
243c0 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a  64 sqlite3PagerJ
243d0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 28  ournalSizeLimit(
243e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
243f0 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69 66  64 iLimit){.  if
24400 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b 0a  ( iLimit>=-1 ){.
24410 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
24420 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 69  nalSizeLimit = i
24430 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
24440 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  urn pPager->jour
24450 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d 0a  nalSizeLimit;.}.
24460 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
24470 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
24480 0a                                               .